首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在JavaScript上不受严格限制地播放音频?

如何在JavaScript上不受严格限制地播放音频?
EN

Stack Overflow用户
提问于 2021-03-15 11:23:37
回答 1查看 1.2K关注 0票数 3

我正在制作一个由裸露的JavaScript代码组成的游戏,我想在JavaScript中操作音频。具体来说,我想让页面在单击某个div元素和在JavaScript代码中使用某些函数时开始播放音乐。

我知道HTML5的音频标记有一个限制,即如果用户不单击音频元素的play按钮,就不能播放与Audio元素相关的音乐文件,所以我不能这样做:

代码语言:javascript
复制
const audio = document.createElement("audio");
audio.src = "url of source";
audio.play(); 
//Uncaught (in promise) DOMException: play() failed because 
//the user didn't interact with the document first. 
//https://developers.google.com/web/updates/2017/09/autoplay-policy-changes

Chrome的自动播放策略很简单:总是允许静音自动播放。如果:用户已与域交互(单击、点击等),则允许自动播放声音。在桌面上,用户的媒体参与指数阈值已经被越过,这意味着用户以前用声音播放过视频。用户在手机上将站点添加到自己的主屏幕上,或者在桌面上安装PWA。顶部帧可以将自动播放权限委托给它们的iframes,以允许声音自动播放。

但我想管理音频更自由,以作出一个良好的用户界面的游戏。

为了实现我的目标,我认为我需要在JavaScript代码中引入另一个库或API,或者仍然使用带有一些技巧的音频标记。

我想其中一个选择可能是Web音频API

你能告诉我一些建议吗?

进展

我尝试了如下代码,当我用单击事件处理程序单击div元素时,它起了作用:

代码语言:javascript
复制
<div id="my-div">play</div>

<audio id="myAudio">
<source src="url of source" type="audio/mpeg">
</audio>
代码语言:javascript
复制
const myAudio = document.getElementById("myAudio");
const btn = document.getElementById("my-div");
btn.addEventListener("click",() => {
  myAudio.play();
});

然而,当我像下面这样写时,即使我似乎没有破坏自动播放策略,它也不能处理相同的错误:

代码语言:javascript
复制
document.getElementById('my-div').addEventListener('click', () => {
    const audio = new Audio('url of source');
    audio.play();
});
//Uncaught (in promise) DOMException: play() failed because 
//the user didn't interact with the document first. 
//https://developers.google.com/web/updates/2017/09/autoplay-policy-changes

以上两种代码的主要区别在于,我是在音频标记中写入音频源文件的url,还是将其写入音频标记中的源标记中。我猜这会有一些不同,但我不明白到底是什么问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-15 13:13:25

你说得对。只有当回放响应于用户手势时,才能确保自动播放策略不会阻止回放。具有单击处理程序的按钮是典型的示例,但单击处理程序也可以附加到div。假设您的div有一个名为my-div的id。在这种情况下,以下内容应该有效。

代码语言:javascript
复制
document.getElementById('my-div').addEventListener('click', () => {
    const audio = new Audio('url of source');

    audio.play(); 
});

使用不会更改自动播放策略。通常,无论使用哪种浏览器API,都适用相同的规则。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66637044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档