当应用程序处于后台模式时,由于iOS闲置我的 AVPlayer
,我正在尝试实现无间隙播放 .
在回答之前,是的,我已经对plist进行了修改,音频会话正确设置,一切都很好,花花公子,但我相信,我的问题本质上是不同的 .
所以,起初我在我的 class 中有一个方法来在每次跟踪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%的回放可能的位置,并在适当的时间触发事件以开始缓冲下一个音轨 .
这听起来不好,因为对象的持续时间属性会根据渐进的传入数据而改变吗?
我可以采取哪些其他策略?
谢谢 .
1 回答
我通过使用AVQueuePlayer和
AVPlayerActionAtItemEndAdvance
的组合解决了它 .这很棘手,但它确实有效 .