AVPlayerstream媒体由于缺口而在后台停止

我试图实现无缝播放,因为当应用程序处于后台模式时,iOS会将我的AVPlayer闲置。

在回答之前,是的,我已经修改了plist,audio会话设置正确,一切都很好,但是我相信,我的问题本质上是不同的。

所以,起初我在我的课上有一个方法来初始化一个新的AVPlayer每当轨道URL改变,它运作良好,但在后台不是很多,我虽然每次创build一个全新的AVPlayer实例将无法正常工作,所以我切换到其他一些范例,比如replaceCurrentItemWithPlayerItem保持AVPlayer实例活着,甚至是AVQueuePlayer

我面对的问题是,在iOS 6上,audio停止的时刻,因为一个轨道完成,另一个还需要加载,iPhone冻结在后台我的应用程序。 如果我再次在前台获得我的应用程序,播放恢复正常。

由于我没有连续的stream,而是单独的URL来AVPlayerQueuestream,我虽然有关使用AVPlayerQueueinsertItem:next / advanceToNextItem策略,试图不让任何最小的audio中断冻结在后台的应用程序。

但问题仍然存在,因为我不得不在需求队列中添加新的轨道,并且缓冲iOS的时间已经认为我的应用程序值得停下来。 所以我需要在应用程序的生命周期适当的时间insertItem

那时我正试图听取这个KVO通知:

[self.player.currentItem addObserver:self forKeyPath:@"playbackBufferFull" options:0 context:MyPlayerItemContext];

但它永远不会被调用。 我们的想法是跟踪currentItem上的缓冲区,并在播放列表中追加下一个缓冲区,以便AVQueuePlayer 可以尝试预缓冲它。

由于playbackBufferFull永远不会被调用,另一个想法是试图抓取当前的时间/持续时间,计算90%的回放可能在哪里,并在适当的时间触发事件来开始缓冲下一个轨道。

这听起来很糟糕,因为对象的持续时间属性会根据渐进式传入数据而改变吗?

我还能采取哪些其他策略?

谢谢。

我解决了它通过使用AVQueuePlayer和AVPlayerActionAtItemEndAdvance的组合。

这是棘手的,但它的作品。