10

HTTPライブストリーム「playlist.m3u8」からビデオを再生するiOSアプリがあり、AVPlayerを使用して作成されたカスタムプレーヤーがあります。スクラブなどの通常のユーザーインタラクションを処理するには、ビデオの長さを取得する必要がありますが、iOS 4.3でxcode4.0を使用して次のコードを呼び出すと、CMTimeが取得され、秒に変換するとNaNが得られます-わかっていますCMTimeValue=0およびCMTimeScale=0であるため、これは何をしているのでしょうか。これにより、NaNが得られ、CMTimeFlags = 17となり、さらに奇妙になります。

これが私が使用するコードで、まったく複雑ではありません。

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];

誰もが提供できるこの問題についての助けをありがとう。

4

1 に答える 1

8

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

上記のドキュメントでは、期間はAVPlayerItem対応するではなく、インスタンスから取得する必要があると記載されていますAVAsset。キー値の監視を介して現在のプレーヤーアイテムから期間を取得するには、次の方法を使用します(元々NGMoviePlayerはiOS 4.0用に作成されたものから取得されました)。

- (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を示し、ドキュメントでは次のように指定されています。

特に、ストリーミングベースのメディアのURLアセットによって報告される期間は通常kCMTimeIndefiniteですが、対応するAVPlayerItemの期間は異なる場合があり、再生中に変更される場合があります。

于 2011-05-11T00:35:26.473 に答える