Javascript HTML5音频标签在JS中创建时在Android-Chrome中不起作用?

Javascript HTML5音频标签在JS中创建时在Android-Chrome中不起作用?,javascript,html,html5-audio,Javascript,Html,Html5 Audio,我使用的是一个.mp3文件,.mp3文件在直接查看和使用HTML5音频标记嵌入时都可以播放,但是在JS中创建HTML5音频标记时它不会播放!(很奇怪) 我在任何其他浏览器/设备中都没有这个问题,例如桌面-Chrome可以完美工作 sound = document.createElement('audio'); sound.setAttribute('src', 'sound.mp3'); sound.play(); 我已经测试了sound.canPlayType('audio/mpeg'),这

我使用的是一个.mp3文件,.mp3文件在直接查看和使用HTML5音频标记嵌入时都可以播放,但是在JS中创建HTML5音频标记时它不会播放!(很奇怪)

我在任何其他浏览器/设备中都没有这个问题,例如桌面-Chrome可以完美工作

sound = document.createElement('audio');
sound.setAttribute('src', 'sound.mp3');
sound.play();
我已经测试了sound.canPlayType('audio/mpeg'),这会产生true(因此它是受支持的)


也许Android-Chrome中有一个bug?(这是最新版本)

并非每个平台上的浏览器都能播放mp3音频格式。通常,正如我所建议的,您应该在音频元素中提供两个
元素,一个提供mp3格式,另一个提供ogg vorbis格式


您可以在此处阅读更多内容:

尝试将其附加到文档正文

document.body.appendChild(sound);
尽管移动设备可能不会自动播放音频或视频。如果你的目标是移动设备,自动播放被认为是不好的做法,因为它会消耗带宽。因此,可能值得考虑添加控件

sound.setAttribute('controls', 'true');

看起来这是一个预期的功能,它跨越的范围比Chrome浏览器还广。需要用户交互才能播放媒体元素

Blink和WebKit有一个要求“用户手势”播放或暂停音频或视频元素的设置,该设置在Opera for Android、Chrome for Android、默认Android浏览器、Safari for iOS以及可能的其他浏览器中启用。这是有道理的,因为移动设备在公共场所和床上使用,来自随机网站的未经请求的声音可能会造成麻烦。此外,自动播放视频广告会浪费带宽

从其他用户复制线程

当前状态

开发人员要求删除“MediaPlaybackRequireservesture”,但遭到审查和拒绝(目前)

经进一步检查,我发现这个

“我误解了围绕此主题的讨论结果(删除MediaPlaybackRequireservesture)。我们需要保留此代码,以免在收集有关此功能的数据时破坏google.com。”

Google.com依赖于该功能被禁用,否则它会崩溃(他们没有说它会崩溃什么)


好吧,既然我们知道它不适用于
音频
,那么留给您的唯一途径就是切换到Web音频API。您需要将mp3加载到ArrayBuffer中(例如,使用XHR),然后将其传递给该方法,该方法会为您提供一个音频缓冲区,您可以从。

中随意播放,或者您应该让浏览器在播放之前加载源文件。如果可能,请提前创建
音频
元素。收听
audio
元素触发的
canplay
canplaythrough
事件,以了解它何时有足够的数据开始播放。也许mobile Chrome不允许您通过编程触发播放?您是否在用户触发的事件上执行此操作?也许还可以尝试将元素添加到DOM中。@AlexanderO'Mara我知道。但这在这里没有任何意义,OP也验证了这一假设。如果
音频
不能以编程方式播放,那么就是这样(但也请检查我的假设)。您可以尝试使用Web音频API作为替代。它的代码多一点,但功能也更强大。@magreenberg我们已经知道,当
audio
元素是HTML的一部分时,音频可以很好地播放。所以这不可能是一个网络问题。我很确定移动Chrome确实支持MP3,所以这可能不是当前的问题。我很欣赏这个Simon,但是在Android-Chrome上,我可以直接查看.MP3文件,没有问题。我还可以使用HTML5音频标签嵌入.mp3文件,没有问题。canPlayType('audio/mpeg')也会生成true。因此,所有这些都表明它应该起作用(@AlexanderO'Mara同意你的观点与我的上述发现一致。好的,谢谢你的评论。在我引用的链接中,Chrome+Android上有一个问号,所以我认为可能是这样。尝试了但没有成功,开始认为Android-Chrome可能不允许编程播放?(如果有意义的话)。可能是为了节省带宽。@Stone如果是这样的话,我希望可以加载和/或播放用户事件,如touch。哦,天哪,好地方!有点痛,但我理解谷歌为什么可以添加此限制。从消费者角度来看,这很好,但对于开发者来说,这意味着更多的工作。@Lister先生我更新了我的答案。这看起来像c吗完成够了吗?我会看一看-谢谢,尽管最初检查的文档看起来很难理解!