AVPlayer
当应用程序处于后台模式时,由于 iOS 空闲我正在尝试实现无缝播放。
在回答之前,是的,我已经修改了 plist,正确设置了音频会话,一切都很好而且花花公子,但是我相信我的问题本质上是不同的。
所以,起初我在我的班级中有一个方法可以在每次跟踪 URL 更改时初始化一个新的 AVPlayer,它工作得很好,但在后台不是那么多,我虽然每次创建一个全新的AVPlayer
实例都行不通,所以我切换到很少有其他范例,例如replaceCurrentItemWithPlayerItem
保持 AVPlayer 实例处于活动状态,甚至AVQueuePlayer
.
我面临的问题是,在 iOS 6 上,音频停止的那一刻,因为一首曲目已完成而另一首曲目仍需加载,iPhone 将我的应用程序冻结在后台。如果我再次将我的应用程序置于前台,播放将正常恢复。
由于我没有连续流,而是要点击单独的 URL 以开始流式传输,因此我考虑使用AVPlayerQueue
和insertItem:next
/advanceToNextItem
策略,试图不让任何最小的音频中断将应用程序冻结在后台。
然而问题仍然存在,因为我必须按需在队列中添加新曲目,并且当它缓冲时,iOS 已经认为我的应用程序值得停止。所以我需要在应用程序的生命周期中适当的时间来insertItem
.
然后我试图收听这个 KVO 通知:
[self.player.currentItem addObserver:self forKeyPath:@"playbackBufferFull" options:0 context:MyPlayerItemContext];
但它永远不会被调用。这个想法是跟踪 currentItem 上的缓冲区已满,并将下一个附加到播放列表中,以便 AVQueuePlayer可能会尝试对其进行预缓冲。
由于playbackBufferFull
永远不会被调用,另一个想法是尝试并获取当前时间/持续时间,计算 90% 的播放可能在哪里,并在适当的时间触发一个事件以开始缓冲下一首曲目。
考虑到对象的持续时间属性会并且可能会根据渐进式传入数据而改变,这听起来很糟糕吗?
我还可以采取哪些其他策略?
谢谢。