AVPlayer停止缓冲

时间:2015-11-08 21:37:40

标签: ios video avplayer avplayeritem

我试图在用户能够播放视频之前将视频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 个答案:

答案 0 :(得分:0)

查看AVPlayerItem上的 preferredForwardBufferDuration 属性。

这样的事情应该有效:

AVPlayerItem* theItem = self.player.currentItem;
theItem.preferredForwardBufferDuration = CMTimeGetSeconds( theItem.duration );

然后,您可以观察播放缓冲区已满,就像您在代码中显示的那样,开始播放。