2

プレロールの直後に再生しようとすると、AVPlayer が再生中のビデオの最初の 0.5 秒をスキップするという問題があります。

まず、プレーヤーを作成します。

self.videoPlayer = [[AVPlayer alloc] init];

次に、プレーヤー アイテムをプレーヤーに追加し、オブザーバーを追加して、アイテムの準備が整ったことを確認します。

[self.videoPlayer addObserver:self forKeyPath:@"currentItem" options:0 context:kBLCurrentPlayerItemStatusContext];
[self.videoPlayer replaceCurrentItemWithPlayerItem:self.currentVideoPlayerItem];

選手アイテムが観察されたら、選手がプレーする準備ができているかどうかを確認します。再生する準備ができていない場合は、オブザーバーを追加して、再生する準備ができていることを確認します。

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
...
} else if (context == kBLCurrentPlayerItemStatusContext) {
       [self.videoPlayer removeObserver:self forKeyPath:@"currentItem" context:&kBLCurrentPlayerItemStatusContext];
       if ([self.videoPlayer status]==AVPlayerStatusReadyToPlay) {
             [self prerollVideoPlayer];
       } else {
             [self.videoPlayer addObserver:self forKeyPath:@"status" options:0 context:&kBLVideoPlayerStatusContext];
       }
}
...

プレーヤーのステータスがプレイ可能になったら、プレーヤーをプリロールします。

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
...
  if (context == kBLVideoPlayerStatusContext) {
      if ([self.videoPlayer status] == AVPlayerStatusReadyToPlay) {
            [self.videoPlayer removeObserver:self forKeyPath:@"status" context:&kBLVideoPlayerStatusContext];
            [self prerollVideoPlayer];
      }
}
...

プレロールが完了したら、プレーヤーを再生します。

-(void)prerollVideoPlayer{
    [self.videoPlayer prerollAtRate:1.0 completionHandler:^(BOOL finished){
        if (finished) {
                [self.videoPlayer play];
        }
    }];
}

プレーヤーがこの方法で再生すると、ビデオの最初の ~0.5 秒がスキップされます。プレローリングが終了したときにプレーヤーをすぐに再生させず、後で play メソッドを呼び出すと、正常に再生されます。すべてのオブザーバーが正しく観察され、上記の順序で発生することを確認しました。このスキップ動作を回避するために、追加する必要がある別のオブザーバーまたは確認する必要がある通知はありますか?

4

0 に答える 0