16

次のような質問がAVPlayerあります。

  1. AVPlayerスルーを一時停止すると、ネットワークからビデオをバッファリング[player pause]AVPlayer続けますか、それとも単に停止しますか? アップルのドキュメントでこれに関連する情報を取得できませんでした。また、一時停止中のビデオが最初のビデオが終了するのを待っている場合、ビデオ間にギャップが見つからないように、一時停止中に AVPlayer にバッファリングを強制することは可能ですか?

  2. AVPlayer缶を一時停止すると、 でイベントが発生し[player pause]ます。

  3. 静止画AVPlayerを数秒間表示できますか?

ありがとう

4

1 に答える 1

39

1)AVPlayerいくつかのケースでビデオをバッファリングしますが、明確に文書化されているものはありません。ビデオを開始するとき、および現在のアイテムを置き換えるときに、バッファリングが期待できると思います。何が起こっているかを観察することができますcurrentItem.loadedTimeRanges。そのプロパティは、どのビデオの時間範囲が読み込まれたかを示します。

currentItemまた、役立つプロパティが他にもいくつかあります: playbackLikelyToKeepUpplaybackBufferFullおよびplaybackBufferEmpty.

完全なギャップレス再生を実現することは容易ではありません。

/* player is an instance of AVPlayer */
[player addObserver:self 
         forKeyPath:@"currentItem.loadedTimeRanges" 
            options:NSKeyValueObservingOptionNew 
            context:kTimeRangesKVO];    

observeValueForKeyPath:ofObject:change:context:

if (kTimeRangesKVO == context) {
   NSArray *timeRanges = (NSArray *)[change objectForKey:NSKeyValueChangeNewKey];
   if (timeRanges && [timeRanges count]) {
       CMTimeRange timerange = [[timeRanges objectAtIndex:0] CMTimeRangeValue];
       NSLog(@" . . . %.5f -> %.5f", CMTimeGetSeconds(timerange.start), CMTimeGetSeconds(CMTimeAdd(timerange.start, timerange.duration)));
   }
}

2) ただ目を離さないでplayer.rateください。

[player addObserver:self 
         forKeyPath:@"rate" 
            options:NSKeyValueObservingOptionNew 
            context:kRateDidChangeKVO];

次に、あなたのobserveValueForKeyPath:ofObject:change:context:

    if (kRateDidChangeKVO == context) {
        NSLog(@"Player playback rate changed: %.5f", player.rate);
        if (player.rate == 0.0) {
            NSLog(@" . . . PAUSED (or just started)");
        }
    }

3)静止画像を使用して特定の長さの動画を作成UIImageViewできますが、プレーヤーの上に通常の画像を使用する方が簡単です。必要に応じて非表示/表示します。

サンプル プロジェクト:私の回答をサポートするために私が書いたコードで自由に遊んでください。

于 2012-05-18T11:28:41.493 に答える