AVQueuePlayer - 在缓冲项目时保持活动状态
AVQueuePlayer - keep active while item is being buffered
是否可以在缓冲远程 AVPlayerItem 时保持 AVQueuePlayer 处于活动状态?
目前,当项目进入缓冲状态时,播放将停止,并且通过 MPNowPlayingInfoCenter 设置的所有信息都会被删除 - 锁定屏幕、命令中心、外部设备等
我已经测试 AVPlayer/AVQueuePlayer 一段时间了,似乎唯一的选择是:
- 观察 playbackBufferEmpty
的远程 AVPlayerItem
- 当观察者触发时,插入带有空 mp3 文件的新 AVPlayerItem。
- 继续观察远程项目的缓冲区,一旦它命中 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];
}
是否可以在缓冲远程 AVPlayerItem 时保持 AVQueuePlayer 处于活动状态?
目前,当项目进入缓冲状态时,播放将停止,并且通过 MPNowPlayingInfoCenter 设置的所有信息都会被删除 - 锁定屏幕、命令中心、外部设备等
我已经测试 AVPlayer/AVQueuePlayer 一段时间了,似乎唯一的选择是:
- 观察 playbackBufferEmpty 的远程 AVPlayerItem
- 当观察者触发时,插入带有空 mp3 文件的新 AVPlayerItem。
- 继续观察远程项目的缓冲区,一旦它命中 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];
}