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

HLS audio stream fails to resume play after time in background (AVPlayer refuses to buffer)

我有一个 iOS 应用程序,旨在播放 HLS 音频流内容。

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

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

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

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

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

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

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

注意: 我已经创建了一个简单的示例 iOS 14+ Xcode 项目,它使用已知的 HLS 流来展示问题。点击 'Configure' 加载 URL,然后点击 play/pause 显示问题(我添加了显示 loadedTimeRanges 状态的控制台输出)。

https://tapestryapps.com/AudioTestbed.zip

谢谢。

代码在 iOS 13.5.1 和 iOS 14.4 上对我有效,但在 14.0.1 上失败。 它看起来像一个 iOS 错误。您可以通过在受影响的系统上返回前台时重新创建 AVPlayerItem 来解决此问题。