プレロールの直後に再生しようとすると、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 メソッドを呼び出すと、正常に再生されます。すべてのオブザーバーが正しく観察され、上記の順序で発生することを確認しました。このスキップ動作を回避するために、追加する必要がある別のオブザーバーまたは確認する必要がある通知はありますか?