我有一个专为播放 HLS 音频流内容而设计的 iOS 应用。
该应用程序支持时移 - 您可以向后跳、向前跳、向后/向前滑动,以及暂停流和取消暂停到您离开的地方。
该应用程序在前台运行时运行良好。当在后台主动播放时它也能正常工作(我正确设置了背景音频权利)。
但是,如果应用程序在音频暂停的情况下进入后台超过几分钟(似乎大约 30 秒)并且 A) 用户取消暂停音频, 或 B) 用户将应用程序返回到前台并尝试从那里取消暂停,即使等待片刻后音频也不会播放。请注意,应用进程在此期间不会被终止。
要暂停和取消暂停,我正在使用 AVPlayer
的 pause
和 play
方法。
在查看它时,我验证了缓冲区(通过查看 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/