ios - 浏览器中的 HTML5 可以在 iOS 锁屏上连续播放音频吗?

标签 ios html audio

我一直在努力追查这个问题,但似乎没有一个一致的答案。如果我的网站尝试使用 HTML 5 音频元素连续播放多首歌曲(比如播放列表),它能否继续在 iOS 锁定屏幕上运行?

对于一些背景,this answer似乎表明这是可能的。但是然后 this article表明它不是。

我尝试按照 Apple 推荐的最接近的示例,如 found here , 复制这个。我使用的是普通的普通 javascript 和 HTML,没什么特别的。我完全复制了他们的例子,只是用音频标签代替了视频标签,随机挑选了两首 mp3 歌曲。它所做的只是等待一首歌曲结束,然后切换 src、加载并播放下一首轨道。

当我在网站上点击“播放”时,我便锁定了 iPhone。第一首歌曲将播放,然后停止。它不会继续播放下一首歌曲。

如果网站打开该页面,它将正确过渡到下一首歌曲。在 Android 上,即使手机处于锁定状态,它也会继续播放下一首歌曲。

我在 iOS 11 和 12 上试过了。都没有用。我读过很多关于当网站不在前台时如何停止 javascript,以及 iOS 如何需要用户交互来播放音频(甚至从一首歌曲到下一首歌曲)的不同答案。所以这似乎行不通。但是那里的其他答案似乎表明这是可能的。

是否有明确的是或否?我在这里做错了什么吗?还是根本不可能?

最佳答案

存在多个问题,这导致了一些困惑。

第一首轨道播放,第二首轨道由于用户许可而不播放

如果第一首轨道是在用户许可的情况下开始的,那么您可以通过脚本切换到新轨道的唯一方法是 Apple 的推荐。处理 ended 事件并换入新的 src,并在回调完成之前调用 .play()。否则,您的代码将无权启动新音频。

由于时间限制源 (#t=5,10),无法到达 ended 事件

假设您有一个 30 秒的音频文件,您通过 URL 末尾的 #t=5,10 告诉浏览器只加载第 5 到 10 秒。当您达到 10 时,将触发 paused 事件,而不是 ended。因此,无法正常进入下一轨道,因为此事件没有被 Apple“祝福”算作上一次用户交互的接力。

我通过让我的 JavaScript 反复检查 currentTime 来解决这个问题,当它超过阈值时,我自己寻找它到文件的 duration(结束)。这允许 ended 正常触发。

iOS 不允许在屏幕锁定或其他应用程序正在使用后运行脚本

这是一个真正需要调试的问题,因为它不会出现在任何模拟器中。无论如何,你是对的,你的 JavaScript 将被暂停,所以即使你遵循 Apple 的建议,你也不走运。或者,你是吗?

黑客...在网络音频上下文中设置 ScriptProcessorNode。将缓冲区大小设置为 512 个样本或其他大小。然后,在脚本进程中,为您的音频元素强制执行 timeupdate 事件。这会让你的 JavaScript 保持运转。 ScriptProcessorNode 在这里必须具有特殊权限,就其性质而言。

Apple:如果您阅读本文,请修复您的浏览器。如果我们不必为了让像音频播放列表这样简单的东西工作而不必费力,那就太好了。其他浏览器几乎没有这种级别的问题。

关于ios - 浏览器中的 HTML5 可以在 iOS 锁屏上连续播放音频吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54462253/

相关文章:

ios - 安装cocoapod时生成的xcscheme。被忽视安全吗?

php - 连接到数据库只发送一个字 iOS

javascript - Jquery 似乎无法读取 JSON 文件

jquery - 如何在用户滚动到 N 点后触发动画 - 具有多个动画的 jQuery 路点 .animate()

javascript - 如何在视差 slider 中添加视频?

javascript - 通过jQuery将音频文件加载到HTML5音频播放器

android - 使用声音进行运动检测

ios - css 背景大小 : contain ignored on IOS?

ios - 在特定 View 中显示谷歌地图

android - 将 AudioTrack 流与节拍器的 UI 同步