我一直在努力寻找答案,似乎没有一个一致的答案。如果我有一个网站尝试使用HTML 5音频元素连续播放多首歌曲(请考虑播放列表),那么它可以在iOS锁定屏幕上继续运行吗?
对于某些背景,this answer似乎表明这是可能的。但是随后this article暗示不是。
我尝试按照苹果推荐的最接近的示例(found here)进行复制。我使用的是普通的原始javascript和HTML,没什么好看的。我完全复制了他们的示例,只是将音频标签替换为视频标签,并随机选择了两首mp3歌曲。它所做的就是等待一首歌结束,然后切换src,加载并播放下一首曲目。
当我在网站上单击“播放”时,便锁定了iPhone。第一首歌曲将播放,然后停止。它不会继续播放下一首歌曲。
如果网站打开该页面,它将正确过渡到下一首歌曲。在Android设备上,即使手机已锁定,它也会继续播放下一首歌曲。
我在iOS 11和12上进行了尝试。关于网站不在前台时如何停止javascript以及iOS如何要求用户交互才能播放音频(甚至从一首歌转到另一首歌),我已经读了许多不同的答案。因此,这似乎行不通。但是随后其他答案似乎表明这是可能的。
是否有确定的是或否?我在这里做错什么了吗?还是不可能?
答案 0 :(得分:0)
存在多个问题,这引起了一些混乱。
如果第一首曲目是在获得用户许可的情况下开始的,那么您可以通过脚本切换到新曲目的唯一方法是根据Apple的建议。处理ended
事件并交换新的src
,并在回调完成之前调用.play()
。否则,您的代码将无权启动新音频。
ended
)无法进入#t=5,10
事件假设您有一个30秒的音频文件,并且告诉浏览器仅通过网址末尾的#t=5,10
之类的内容加载5到10秒。当您到达10
时,将触发paused
事件,而不是ended
。因此,无法正常进行下一个曲目,因为Apple不能将此事件视为上次用户交互的中继。
我通过让我的JavaScript反复检查currentTime
来解决这个问题,当它超过阈值时,请自己寻找到文件的duration
(末尾)。这样可以使ended
正常启动。
这是一个真正的调试问题,因为在任何模拟器中都不会出现。无论如何,您是对的,您的JavaScript将被暂停,因此,即使您遵循Apple的建议,也很不走运。或者,是吗?
黑客...在Web Audio上下文中设置ScriptProcessorNode。将缓冲区大小设置为512个样本之类。然后,在脚本过程中,为您的音频元素强制一个timeupdate
事件。这样可以使您的JavaScript停滞不前。本质上,ScriptProcessorNode在这里必须具有特殊的特权。
Apple :如果您阅读此书,请修复浏览器。如果我们不必为解决音频播放列表之类的简单工作而烦恼,那就太好了。其他浏览器几乎没有这个级别的问题。