ios - HLS 音频流在后台播放一段时间后无法恢复播放(AVPlayer 拒绝缓冲)

标签 ios swift avfoundation avplayer http-live-streaming

我有一个专为播放 HLS 音频流内容而设计的 iOS 应用。

该应用程序支持时移 - 您可以向后跳、向前跳、向后/向前滑动,以及暂停流和取消暂停到您离开的地方。

该应用程序在前台运行时运行良好。当在后台主动播放时它也能正常工作(我正确设置了背景音频权利)。

但是,如果应用程序在音频暂停的情况下进入后台超过几分钟(似乎大约 30 秒)并且 A) 用户取消暂停音频, 或 B) 用户将应用程序返回到前台并尝试从那里取消暂停,即使等待片刻后音频也不会播放。请注意,应用进程在此期间不会被终止。

要暂停和取消暂停,我正在使用 AVPlayerpauseplay 方法。

在查看它时,我验证了缓冲区(通过查看 loadedTimeRanges 确定)在正常播放期间被填满,但在暂停的应用程序进入后台后不久很快被清空。如果应用程序足够快地返回到前台,缓冲区将再次开始填充并且播放可以恢复。否则 - 如果用户将应用程序移到后台约 30 秒 - 缓冲区根本不会重新填充并尝试再次播放失败直到 AVPlayerItem 被重新配置。

我意识到不能保证缓冲区总是有内容(即它可以被清空以最小化内存占用,我怀疑这里就是这种情况),但希望 AVPlayer当播放恢复时,开始根据需要再次开始从中加载音频。即使它已经在后台运行了一段时间。

有没有人知道为什么会发生这种情况或如何解决它?

注意:我创建了一个简单的示例 iOS 14+ Xcode 项目,该项目使用已知的 HLS 流来展示问题。点击“配置”以加载 URL,然后播放/暂停以显示问题(我添加了控制台输出以显示 loadedTimeRanges 的状态)。

https://tapestryapps.com/AudioTestbed.zip

谢谢。

最佳答案

如果有人在使用 HLS 并将 playerViewController?.player?.currentItem?.preferredPeakBitRate = 1 更改为后台应用程序时的安全数据时仍然遇到此问题,解决方法是降低缓冲区大小 playerViewController?.player?.currentItem?.preferredForwardBufferDuration = 10 当返回到前台时,所有值都可以再次设置为默认值 0

作为替代方案,您也可以替换 playerViewController?.player?.currentItem,但这会导致视频和音频再次缓冲。

关于ios - HLS 音频流在后台播放一段时间后无法恢复播放(AVPlayer 拒绝缓冲),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66002392/

相关文章:

iphone - nib-less iOS 应用没有用户交互

ios - 在 Xcode 中均匀分布按钮

ios - 如何在 Swift 中声明多维 bool 数组?

ios - Swift UITableView 单元格选择在搜索结果后不起作用

ios - AVFoundation 每秒拍照一次 SWIFT

ios - AV Foundation 动画永远不会开始播放

objective-c - 使用 NSOrderedAscending 和 NSOrderedDescending 在特定范围内的日期

iOS 10 问题 : UIScrollView Not Scrolling, 即使设置了 ContentSize

swift - Swift 中返回多个值的字符串

ios - 包装 AVPlayer 行为时处理 AVPlayerLayer