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

Posted

技术标签:

【中文标题】AVQueuePlayer - 在缓存项目时保持活动状态【英文标题】:AVQueuePlayer - keep active while item is being buffered 【发布时间】:2015-11-21 19:22:51 【问题描述】:

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

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

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

    观察远程 AVPlayerItem 是否有 playbackBufferEmpty 当观察者触发时,插入带有空 mp3 文件的新 AVPlayerItem。 继续观察远程项目的缓冲区,一旦到达 playbackLikelyToKeepUp,将项目交换到位并前进到远程项目。

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

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

【问题讨论】:

你有没有办法继续缓冲遥控器? 【参考方案1】:

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

第一个实例保存远程AVPlayerItem 和第二个空声音文件,只有几毫秒长。加载时可以将空项搜索到底。​​p>

当远程项目进入缓冲时,暂停它并播放空文件。由于它已经结束,它将保持播放会话处于活动状态。只需将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];

【讨论】:

以上是关于AVQueuePlayer - 在缓存项目时保持活动状态的主要内容,如果未能解决你的问题,请参考以下文章

当 AVQueuePlayer 完成最后一个播放项时如何做某事

可以使用 AVQueuePlayer 在队列顶部插入项目吗?

在 AVQueuePlayer 中播放完最后一项后如何显示工作表视图?

AVQueuePlayer 在 iOS5 后台播放多个音轨

使用 AVQueuePlayer 时如何在视频之间添加过渡?

AVQueuePlayer 不播放声音