ios - 由于间隙,AVPlayer 流在后台停止

标签 ios audio-streaming avplayer

<分区>

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

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

所以,起初我在我的类中有一个方法,每次轨道 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% 的播放可能在哪里,并在适当的时间触发一个事件以开始缓冲下一首。

考虑到对象的持续时间属性会并且可能会根据渐进式传入数据发生变化,这听起来很糟糕吗?

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

谢谢。

最佳答案

我结合使用 AVQueuePlayer 和 AVPlayerActionAtItemEndAdvance 解决了这个问题。

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

关于ios - 由于间隙,AVPlayer 流在后台停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14115482/

相关文章:

ios - 双击 ios 时禁用 avplayer 中的缩放效果

ios - UISplitViewController Master View 在 vi​​ewDidAppear 中的帧大小

ios - 如何从 iPhone 获取除相机胶卷之外的所有资源?

android - 应用过滤器复合体因与音频相关的内容而失败

python - 如何使用 gstreamer 从较长的源片段制作音频剪辑?

iOS:修改服务器对 AVPlayer 的响应或如何提供 MIME 类型

javascript - UIWebView - 在网页上启用右键单击

ios - UITextfield 密码占位符点

javascript - 浏览器内音频播放器如何工作?

swift - 是否可以像 Netflix 应用程序一样在滚动视频时间线的同时制作预览图像?