2016-04-14 43 views
2

私はライブストリーミング再生にAVFoundationフレームワークを使用しています。今私は以下のようなプレイリストを持っていますプレイリストからEXT-X-PROGRAM-DATE-TIMEを取得する方法

#EXT-X-VERSION:4 
#EXT-X-ALLOW-CACHE:NO 
#EXT-X-MEDIA-SEQUENCE:8148007 
#EXT-X-TARGETDURATION:6 
#EXT-X-PROGRAM-DATE-TIME:1972-04-14T08:51:01.497Z 

私はAVPlayerがこのプレイリストを取得するようリクエストしていると思います。 AVFoundationでクラスを使用してEXT-X-TARGETDURATIONとEXT-X-PROGRAM-DATE-TIMEを抽出できますか?そうでない場合は、他の方法ですか?ありがとう

+0

この情報はどのようにして正確に取得できましたか?あなたはそれを記録しましたか? http://stackoverflow.com/questions/13039577/using-avplayer-in-ios-can-you-know-the-current-ts-file-or-the-current-timestamp? – Larme

+0

いいえ、私はそれを記録するためにチャールズを使用しています。 – RayChen

+0

申し訳ありませんが、詳細を指定できますか?@AshishKakkad – RayChen

答えて

1

私はAVFoundationがこれらすべてのタグにアクセスできるとは思わないと思います。しかし、ストリームをデバッグする必要があるときは、すべてのトラフィックを傍受するためにカスタムNSURLProtocolを使用します。私はAVPlayerは(「操作は完了できません」など)の良好なエラーメッセージを与えるものではありませんので、時にはそれがNSURLProtocolの良いチュートリアルはここで見つけることができ、生のプレイリストとHTTPレスポンスを確認するために

より良いことだと思う:https://www.raywenderlich.com/59982/nsurlprotocol-tutorial

まずURLローディングシステムは、あなたが[NSURLProtocol registerClass:/* your class */]を呼び出すことによって、HLS要求を処理し、カスタムURLProtocolで-(void)startLoading

0123を上書きその後 +(BOOL)canInitWithRequest:

+(BOOL)canInitWithRequest:(NSURLRequest *)request { 
    BOOL handled = [[NSURLProtocol propertyForKey:@"handled" inRequest:request] boolValue]; 
    return [request.URL.pathExtension isEqualToString:@"m3u8"] && !handled; 
} 

を上書きすることができます知っています

-(void)startLoading { 
    newRequest = [self.request mutableCopy]; 
    [NSURLProtocol setProperty:@YES forKey:@"handled" inRequest:newRequest]; 
    NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:newRequest 
     completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

      /* Inspect response body(playlist) and error */ 
      NSString *responseBody = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

      /* Return data and control to AVPlayer*/ 
      [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; 
      [self.client URLProtocol:self didLoadData:data]; 
      [self.client URLProtocolDidFinishLoading:self]; 
    }]; 

    [task resume]; 
} 
0

#EXT-X-PROGRAM-DATE-TIMEAVPlayerItemcurrentDateプロパティから利用できます。タグの日付を直接報告するのではなく、現在の再生位置の前の最後のタグの日付とそれ以降の再生間隔を報告します。

#EXT-X-TARGETDURATIONは直接ご利用いただけません。プレイリストを自分で読み込むか、読み込みプロセスに自分自身を挿入する必要があります。私はAVAssetResourceLoaderAVAssetResourceLoaderDelegateで成功しました。ローダーが認識できないもの(httpやhttps以外のもの)にURLスキームを書き換えて、プレーヤーのためにローディングを実行することができます。

関連する問題