<分区>
当应用程序处于后台模式时,由于 iOS 空闲我的 AVPlayer
,我正在尝试实现无缝播放。
在回答之前,是的,我修改了 plist,正确设置了 Audio Session ,一切都很好,但我相信我的问题在本质上是不同的。
所以,起初我在我的类中有一个方法,每次轨道 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% 的播放可能在哪里,并在适当的时间触发一个事件以开始缓冲下一首。
考虑到对象的持续时间属性会并且可能会根据渐进式传入数据发生变化,这听起来很糟糕吗?
我还可以采取哪些其他策略?
谢谢。