我试图在用户能够播放视频之前将视频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
,如何缓冲视频的其余部分?正在播放的视频只有五秒钟 .
1 回答
看一下AVPlayerItem上的preferredForwardBufferDuration属性 .
像这样的东西应该工作:
然后,您可以观察播放缓冲区已满,就像您在代码中显示的那样,开始播放 .