首页 文章

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

提问于
浏览
2

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

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

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

  • 观察 playbackBufferEmpty 的远程AVPlayerItem

  • 当观察者触发时,插入带有空mp3文件的新AVPlayerItem .

  • 继续观察远程项目的缓冲区,一旦它到达 playbackLikelyToKeepUp ,交换项目到位并前进到远程项目 .

这种方法的问题是,一旦你前进到空项目,AVQueuePlayer停止缓冲遥控器 . 我已经为这两个项设置了强引用,actionAtItemEnd设置为 AVPlayerActionAtItemEndNone . 网络由Charles监控 .

有没有其他方法来实现这一目标?

1 回答

  • 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];
    }
    

相关问题