AVQueuePlayer - 在缓冲项目时保持活动状态

AVQueuePlayer - keep active while item is being buffered

是否可以在缓冲远程 AVPlayerItem 时保持 AVQueuePlayer 处于活动状态?

目前,当项目进入缓冲状态时,播放将停止,并且通过 MPNowPlayingInfoCenter 设置的所有信息都会被删除 - 锁定屏幕、命令中心、外部设备等

我已经测试 AVPlayer/AVQueuePlayer 一段时间了,似乎唯一的选择是:

  1. 观察 playbackBufferEmpty
  2. 的远程 AVPlayerItem
  3. 当观察者触发时,插入带有空 mp3 文件的新 AVPlayerItem。
  4. 继续观察远程项目的缓冲区,一旦它命中 playbackLikelyToKeepUp,交换项目并前进到远程项目。

此方法的问题在于,一旦您前进到空项目,AVQueuePlayer 就会停止缓冲远程。 我已经设置了对这两个项目的强引用,并且 actionAtItemEnd 设置为 AVPlayerActionAtItemEndNone。 网络由 Charles 监控。

还有其他方法可以实现吗?

我设法使用两个 AVPlayer 实例保持播放活跃。

第一个实例持有远程 AVPlayerItem 和第二个空声音文件,只有几毫秒长。您可以在加载时寻找空项目到最后。

当远程项目进入缓冲时,暂停它并播放空文件。由于它已经结束,它将保持播放会话处于活动状态。只需将 actionAtItemEnd 设置为 AVPlayerActionAtItemEndNone

即使这有效,当远程项目的缓冲区更改为 playbackLikelyToKeepUp 并且您交换播放器时,您可能会遇到一些奇怪的行为。远程项目可以跳回 playbackBufferEmpty 并且玩家交换逻辑可以陷入永无止境的循环。

我通过延迟缓冲区更新解决了这个问题:

-(void)setPendingBuffer:(PlayerItemBuffer)pendingBuffer {

    _pendingBuffer = pendingBuffer;

    if (self.bufferDispatchTimer.valid) {
        [self.bufferDispatchTimer invalidate];
    }
    self.bufferDispatchTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(bufferDispatchTimerDidFire) userInfo:nil repeats:NO];
}