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