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 中播放完最后一项后如何显示工作表视图?