首页 文章

AVPlayer停止缓冲

提问于
浏览
2

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

    看一下AVPlayerItem上的preferredForwardBufferDuration属性 .

    像这样的东西应该工作:

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

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

相关问题