我试图在用户能够播放视频之前将视频URL完全加载到AVPlayer中,以实现无缝播放。
我向AVPlayerItem
添加了两个观察者:
[item addObserver:self forKeyPath:@"loadedTimeRanges"
options:NSKeyValueObservingOptionNew context:&timeRanges];
[item addObserver:self forKeyPath:@"playbackBufferFull"
options:NSKeyValueObservingOptionNew context:&playbackBufferFull];
我等到值等于视频的持续时间 - 完全加载。
if (context == &timeRanges) {
NSLog(@"BUFFERING");
NSArray *timeRanges = (NSArray *)[change objectForKey:NSKeyValueChangeNewKey];
CMTimeRange timerange = [timeRanges[0] CMTimeRangeValue];
CGFloat value = CMTimeGetSeconds(CMTimeAdd(timerange.start, timerange.duration));
CGFloat duration = CMTimeGetSeconds(self.player.currentItem.duration);
NSLog(@"VALUE:DURATION == %f:%f", value, duration);
if(value == duration) {
NSLog(@"FINISHED");
[self prerollVideoPlayer];
}
return;
}
但这很少发生。播放器通常会在3秒左右停止缓冲,持续5秒钟的视频。然后调用“playbackBufferFull”
if (context == &playbackBufferFull){
if (self.player.currentItem.playbackBufferFull) {
NSLog(@"IS FULL");
//[self prerollVideoPlayer];
}
return;
}
如何增加缓冲区大小?或者在调用playbackBufferFull
后如何缓冲视频的其余部分?正在播放的视频只有五秒钟。
答案 0 :(得分:0)
查看AVPlayerItem上的 preferredForwardBufferDuration 属性。
这样的事情应该有效:
AVPlayerItem* theItem = self.player.currentItem;
theItem.preferredForwardBufferDuration = CMTimeGetSeconds( theItem.duration );
然后,您可以观察播放缓冲区已满,就像您在代码中显示的那样,开始播放。