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

时间:2015-11-21 19:22:52

标签: ios objective-c audio streaming avqueueplayer

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

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

我一直在测试AVPlayer / AVQueuePlayer一段时间,似乎唯一的选择是:

  1. 观察远程AVPlayerItem playbackBufferEmpty
  2. 当观察者触发时,插入带有空mp3文件的新AVPlayerItem。
  3. 继续观察远程项目的缓冲区,一旦点击 playbackLikelyToKeepUp ,请将项目交换到远程项目。
  4. 这种方法的问题是,一旦你前进到空项目,AVQueuePlayer就会停止缓冲遥控器。 我已经为这两个项目设置了强引用,而actionAtItemEnd设置为 AVPlayerActionAtItemEndNone 。 网络由Charles监控。

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

1 个答案:

答案 0 :(得分:0)

我设法使用两个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];
}