2011-05-10 10 views
11

HTTPライブストリーム "playlist.m3u8"からビデオを再生するiOSアプリケーションがあり、AVPlayerを使用して作成したカスタムプレーヤーがあります。スクラブなどの通常のユーザー操作を処理するには、動画の再生時間を取得する必要がありますが、何らかの理由でiOS 4.3でxcode 4.0を使用しているときに次のコードを呼び出すと、秒に変換されるとNaNが返されますCMTimeValue = 0とCMTimeScale = 0でNaNが与えられ、CMTimeFlags = 17がさらに奇妙なので、何をしているのか。iOS AVAsset.durationはHTTPライブストリーミングではゼロですが、プログレッシブで動作します

AVPlayerItem *pItem = mPlayer.currentItem; 
AVAsset* asset = pItem.asset; 
CMTime d = asset.duration; 
double duration = CMTimeGetSeconds(asset.duration); 

私も、私は私が/再生をスクラブを開始する前に、それは準備ができていることを確認するためにロードプレイリストのステータスを監視行うことを言及する必要があります。ここでは

は全く複雑ではない、私が使用するコードです:

[mPlayer addObserver:self forKeyPath:@"currentItem.status" options:0 context:VideoPlaybackViewDelegateStatusContext]; 

誰もがこの問題について助けてくれてありがとう。

+0

これは、iOS 4.2(シミュレータとデバイスの両方)で動作することを忘れていました。 – Aaron

答えて

8

https://developer.apple.com/library/ios/releasenotes/AudioVideo/RN-AVFoundation-Old/#//apple_ref/doc/uid/TP40011199-CH1-SW4

期間は今ではなく、そのAVAssetに対応するよりも、AVPlayerItemインスタンスから得られるべき言及上記ドキュメント。キー値が観測を経由して現在のプレーヤーアイテムから期間を取得するには、私は次のような方法(元々のiOS 4.0のために書かれたNGMoviePlayerから引き出された)を使用します。

- (void)loadPlayerWithItem:(AVPlayerItem *)playerItem { 
    self.player = [AVPlayer playerWithPlayerItem:playerItem]; 
    ... 
    // changed this from previous value currentItem.asset.duration 
    [self.player addObserver:self forKeyPath:@"currentItem.duration" 
            options:0 
            context:nil]; 
    ... 
} 

を私は自分のプレイヤーで上記の変更を実施し、時間は今働いている!このAVFoundationの変更が問題の根本原因でした。 CMTimeFlags = 17 kCMTimeFlags_Indefinite & kCMTimeFlags_Validを示し、docs指定:対応AVPlayerItemの持続時間は異なり、月かもしれないが特に

を、ストリーミングベースのメディアをするためのURL資産によって報告された期間は、典型的にkCMTimeIndefiniteありますそれが再生中に変更します。

+0

多くのありがとうdarvids0nと私はリリースノートが欠けているために愚かな感じ:-)。 – Aaron

+0

はまだnanoを返す:(、iOS 9.0を使用 –

関連する問題