音频自动播放在Mozilla、Microsoft Edge和旧版Google Chrome中都能正常工作,但由于Google Chrome 67+的自动播放策略更改,它无法工作(请参考链接的博客文章)。
他们已经阻止了自动播放(直到符合链接博客文章中指定的特定会话条件)。如何让音频自动播放在Google Chrome 67+中?
音频自动播放在Mozilla、Microsoft Edge和旧版Google Chrome中都能正常工作,但由于Google Chrome 67+的自动播放策略更改,它无法工作(请参考链接的博客文章)。
他们已经阻止了自动播放(直到符合链接博客文章中指定的特定会话条件)。如何让音频自动播放在Google Chrome 67+中?
解决方案 #1
我在这里的解决方案是创建一个iframe
。
<iframe src="audio/source.mp3" allow="autoplay" style="display:none" id="iframeAudio">
</iframe>
同时还需要为非Chrome浏览器添加audio
标签
<audio autoplay loop id="playAudio">
<source src="audio/source.mp3">
</audio>
并且在我的脚本
中
var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
if (!isChrome){
$('#iframeAudio').remove()
}
else {
$('#playAudio').remove() // just to make sure that it will not have 2x audio in the background
}
解决方案 #2:
还有另一种解决方法,根据@Leonard的建议:
创建一个iframe
,不播放任何内容,只是为了在第一次加载时触发自动播放。
<iframe src="silence.mp3" allow="autoplay" id="audio" style="display: none"></iframe>
这是一个好的源头,提供mp3文件silence.mp3
然后轻松播放您的实际音频文件。
<audio id="player" autoplay loop>
<source src="audio/source.mp3" type="audio/mp3">
</audio>
个人而言,我更喜欢解决方案2,因为它是一种更清洁的方法,不需要过多依赖JavaScript。
更新于2019年8月
解决方案3
作为替代方案,我们可以使用<embed>
。
对于Firefox
看起来音频自动播放正在工作,所以我们不需要<embed>
元素,因为它会创建双倍音频运行。
// index.js
let audioPlaying = true,
backgroundAudio, browser;
browser = navigator.userAgent.toLowerCase();
$('<audio class="audio1" src="audio.mp3" loop></audio>').prependTo('body');
if (!browser.indexOf('firefox') > -1) {
$('<embed id="background-audio" src="audio.mp3" autostart="1"></embed>').prependTo('body');
backgroundAudio = setInterval(function() {
$("#background-audio").remove();
$('<embed id="background-audio" src="audio.mp3"></embed>').prependTo('body');
}, 120000); // 120000 is the duration of your audio which in this case 2 mins.
}
如果您对音频进行了切换,请确保删除创建的<embed>
音频元素。
注意:在切换后,由于已删除<embed>
元素,<audio>
元素将会从头开始播放。
$(".toggle-audio").on('click', function(event) {
audioPlaying = !audioPlaying;
$("#background-audio").remove();
clearInterval(backgroundAudio);
if (audioPlaying){
$(".audio1").play();
// play audio
}
else {
$(".audio1").pause();
}
现在请确保隐藏这些<audio>
和<embed>
元素。
audio, embed {
position: absolute;
z-index: -9999;
}
注意:diplay: none
和 visibility: hidden
会使得 <embed>
元素无法工作。在Chrome浏览器中,有一个非常巧妙的技巧可以使用音频标签的自动播放功能。
添加
<iframe src="silence.mp3" allow="autoplay" id="audio"></iframe>
然而,silence.mp3
只包含了0.5秒的静音。
这个
<audio id="player" autoplay controls><source src="0.mp3" type="audio/mp3"></audio>
Chrome 注意到音频已经播放,并允许在音频标签中自动播放。
如果满足以下条件,则允许带声音的自动播放:
另外,
只需按照https://developers.google.com/web/updates/2017/09/autoplay-policy-changes#webaudio中所述,添加此小脚本即可。
<head>
<script>
window.onload = function() {
var context = new AudioContext();
}
</script>
</head>
那么这将按照您的要求起作用:
<audio autoplay>
<source src="hal_9000_sorry_dave.mp3">
</audio>
document.addEventListener('click', musicPlay);
function musicPlay() {
document.getElementById('ID').play();
document.removeEventListener('click', musicPlay);
}
当用户在页面上任意点击时,音乐开始播放。
同时,它也立即移除了事件监听器,因此如果您使用音频控件,用户可以将其静音或暂停,当他再次点击其他地方时,音乐不会重新开始播放。
document.addEventListener('click', function() { document.getElementById('ID').play() }, { once: true });
- Henrik N<iframe src="youraudiofile.mp3" type="audio/mp3" allow="autoplay" id="audio" style="display:none"></iframe>
<audio autoplay>
<source src="youraudiofile.mp3" type="audio/mp3">
</audio>
只需添加一个源为.mp3的不可见iframe,并在音频元素之前加入allow="autoplay"。这样,浏览器就会被欺骗以启动任何后续音频文件。或者自动播放未静音的视频。
<audio id="audioID" loop> <source src="path/audio.mp3" type="audio/mp3"></audio>
<script>
var myaudio = document.getElementById("audioID").autoplay = true;
</script>
如果你需要添加停止/播放按钮:
<button onclick="play()" type="button">playbutton</button>
<button onclick="stop()" type="button">stopbutton</button>
<audio id="audioID" autoplay loop> <source src="path/audio.mp3" type="audio/mp3">
</audio>
<script>
var myaudio = document.getElementById("audioID");
function play() {
return myaudio.play();
};
function stop() {
return myaudio.pause();
};
</script>
如果您想让停止/播放成为一个单一的按钮:
<button onclick="PlayStop()" type="button">button</button>
<audio id="audioID" autoplay loop> <source src="path/audio.mp3" type="audio/mp3">
</audio>
<script>
var myaudio = document.getElementById("audioID");
function PlayStop() {
return myaudio.paused ? myaudio.play() : myaudio.pause();
};
</script>
<button onclick="PlayStop()" type="button">Play</button>
<audio id="audioID" autoplay loop> <source src="path/audio.mp3" type="audio/mp3">
</audio>
<script>
var myaudio = document.getElementById("audioID");
function PlayStop() {
if (elem.innerText=="Play") {
elem.innerText = "Stop";
}
else {
elem.innerText = "Play";
}
return myaudio.paused ? myaudio.play() : myaudio.pause();
};`
</script>
<iframe src="dummy.mp3" allow="autoplay" id="audio" style="display:none"></iframe>
<button onclick="PlayStop()" type="button">Play</button>
<audio id="audioID" autoplay loop> <source src="path/audio.mp3" type="audio/mp3">
</audio>
<script>
var myaudio = document.getElementById("audioID");
function button() {
if (elem.innerText=="Play") {
elem.innerText = "Stop";
}
else {
elem.innerText = "Play";
}
return myaudio.paused ? myaudio.play() : myaudio.pause();
};
</script>
[编辑@2021年9月7日]
最近几天我收到了一些踩的反馈,我想我需要澄清一下:这个解决方案要求用户把鼠标悬停在网页上才能使用。没有办法在Chrome浏览器中自动播放声音,因为这是有意被阻止的。现在互联网上充斥着令人生畏的广告,没有人希望在访问网站时听到来自广告的噪音。
[编辑@2021年12月22日] 我曾经误传了一些不正确的信息
事实证明,一些人没有掌握这种方法的一个重要点。您必须将<body>
部分中的所有内容都包含在一个<div>
中,如下面的原始描述所述。这在jsfiddle上是行不通的,因为它使用了嵌入的<iframe>
文档,这正是Chrome浏览器所要阻止的。
[编辑@2021年12月24日]
事实证明我是个小丑。Chrome浏览器会阻止在用户首次访问不同域名下的页面时自动播放。以下是我制作的一些演示:
[原始]
如果您愿意将整个HTML <body>
都包含在一个 <div>
标签中,这是我的解决方案,适用于Chrome 88.0.4324.104(截至2021年1月23日最新版本)。
首先,在<body>
部分的开头添加音频部分以及下面显示的脚本片段:
<audio id="divAudio">
<source src="music.mp3" type="audio/mp3">
</audio>
<script>
var vAudio = document.getElementById("divAudio");
var hasInit = false;
function playMusic()
{
if(!hasInit)
{
hasInit = true;
vAudio.play();
}
}
</script>
<body>
内容(不包括上面显示的插入代码)用一个虚拟部分<div onmouseover="playMusic()">
包围起来。如果你的HTML <body>
内容已经被全局<div>
部分包裹,那么只需要在那个<div>
中添加onmouseover="playMusic()"
标签即可。playMusic()
函数,欺骗Chrome“认为”用户已经做了一些事情来播放音频。这个解决方案的好处是,只有当用户浏览该页面时才会播放该音频片段。自2020年起,这是一个与浏览器相关的设置,无法通过HTML代码启用。大多数浏览器默认阻止自动播放。以下是您可以找到该设置的位置:
Firefox:在哪里启用/禁用自动播放
Chrome:在哪里启用/禁用自动播放