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

时间:2019-01-31 14:01:47

标签: ios html5 audio

我一直在努力寻找答案,似乎没有一个一致的答案。如果我有一个网站尝试使用HTML 5音频元素连续播放多首歌曲(请考虑播放列表),那么它可以在iOS锁定屏幕上继续运行吗?

对于某些背景,this answer似乎表明这是可能的。但是随后this article暗示不是。

我尝试按照苹果推荐的最接近的示例(found here)进行复制。我使用的是普通的原始javascript和HTML,没什么好看的。我完全复制了他们的示例,只是将音频标签替换为视频标签,并随机选择了两首mp3歌曲。它所做的就是等待一首歌结束,然后切换src,加载并播放下一首曲目。

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

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

我在iOS 11和12上进行了尝试。关于网站不在前台时如何停止javascript以及iOS如何要求用户交互才能播放音频(甚至从一首歌转到另一首歌),我已经读了许多不同的答案。因此,这似乎行不通。但是随后其他答案似乎表明这是可能的。

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

1 个答案:

答案 0 :(得分:0)

存在多个问题,这引起了一些混乱。

第一首曲目播放,第二首不是由于用户许可

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

由于时间受限制的来源(ended)无法进入#t=5,10事件

假设您有一个30秒的音频文件,并且告诉浏览器仅通过网址末尾的#t=5,10之类的内容加载5到10秒。当您到达10时,将触发paused事件,而不是ended。因此,无法正常进行下一个曲目,因为Apple不能将此事件视为上次用户交互的中继。

我通过让我的JavaScript反复检查currentTime来解决这个问题,当它超过阈值时,请自己寻找到文件的duration(末尾)。这样可以使ended正常启动。

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

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

黑客...在Web Audio上下文中设置ScriptProcessorNode。将缓冲区大小设置为512个样本之类。然后,在脚本过程中,为您的音频元素强制一个timeupdate事件。这样可以使您的JavaScript停滞不前。本质上,ScriptProcessorNode在这里必须具有特殊的特权。

Apple :如果您阅读此书,请修复浏览器。如果我们不必为解决音频播放列表之类的简单工作而烦恼,那就太好了。其他浏览器几乎没有这个级别的问题。