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

Posted

技术标签:

【中文标题】由于间隙,AVPlayer 流在后台停止 [关闭]【英文标题】:AVPlayer streaming stops in background due to gaps [closed] 【发布时间】:2013-01-02 00:09:58 【问题描述】:

我正在尝试实现无缝播放,因为当应用程序处于后台模式时,ios 闲置了我的AVPlayer

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

所以,起初我在班级中有一个方法可以在每次跟踪 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】:

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

这很棘手,但很有效。

【讨论】:

您能发布您的代码吗? 如果您能分享一下您是如何解决这个问题的,我们将不胜感激。

以上是关于由于间隙,AVPlayer 流在后台停止 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

m3u8 音频流在 MPMoviePlayerController 中播放但不是 AVPlayer?

向上滑动(将应用程序置于后台)并且视频在自定义 AVPLayer 中播放时如何停止画中画?

ios13音频流在后台被切断

IOS后台运行 之 后台播放音乐

用户关闭 AVPlayer 时如何获取视频播放时间

Centreon Poller 间隙性停止故障排错实录