首页 文章

由于间隙[关闭],AVPlayer流媒体在后台停止

提问于
浏览
4

当应用程序处于后台模式时,由于iOS闲置我的 AVPlayer ,我正在尝试实现无间隙播放 .

在回答之前,是的,我已经对plist进行了修改,音频会话正确设置,一切都很好,花花公子,但我相信,我的问题本质上是不同的 .

所以,起初我在我的 class 中有一个方法来在每次跟踪URL改变时初始化一个新的AVPlayer,它运行良好,但在背景上并没有那么多,我虽然每次创建一个全新的 AVPlayer 实例都不会工作所以我切换很少有其他范例,比如 replaceCurrentItemWithPlayerItem 保持AVPlayer实例存活,甚至 AVQueuePlayer .

我面临的问题是,在iOS 6上,音频停止的那一刻,因为一首曲目已经完成而另一首仍然需要加载,iPhone会在后台冻结我的应用程序 . 如果我再次将我的应用程序置于前台,则播放将恢复正常 .

由于我没有连续流,而是要点击以开始流式传输的各个URL,我虽然使用 AVPlayerQueueinsertItem:next / advanceToNextItem 策略,尝试不让任何最小的音频中断在后台冻结应用程序 .

然而问题仍然存在,因为我必须根据需要在队列中添加新轨道,并且当缓冲iOS已经认为我的应用程序值得停止时 . 所以我需要在应用程序的生命周期中适当的时间 insertItem .

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

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

但它永远不会被称为 . 我们的想法是在currentItem上跟踪缓冲区已满,并在播放列表中附加下一个缓冲区,以便AVQueuePlayer可能会尝试预缓冲它 .

由于 playbackBufferFull 从未被调用,因此另一个想法是尝试并获取当前时间/持续时间,计算90%的回放可能的位置,并在适当的时间触发事件以开始缓冲下一个音轨 .

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

我可以采取哪些其他策略?

谢谢 .

1 回答

  • -1

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

    这很棘手,但它确实有效 .

相关问题