如何在倒计时结束后自动播放音频?
How to autoplay audio when the countdown timer is finished?
我想在倒计时完成后播放声音。
通常我会使用这种和平的代码来做到这一点
var audio = new Audio('path to file.mp3');
audio.play();
但是我收到以下错误未处理的承诺拒绝:NotAllowedError:当前上下文中的用户代理或平台不允许该请求,可能是因为用户拒绝了权限。
事情是...... Google 它自己正在使用 HTML5 音频标签
如果您在 google 搜索字段中键入 countdown timer
,它应该会显示在倒数计时器结束后播放声音的小部件。
这是 Google 计时器的样子,如果你们不知道我在说什么的话:)
通过让您单击此 "START" 按钮,他们要求用户做出手势,从而将他们的文档标记为用户批准播放音频。这意味着它们不再受 chrome 的 autoplay policies 约束。
现在,默认情况下,Safari 甚至比 Chrome 更严格,简单地单击文档是行不通的:在此浏览器中,您需要从用户事件本身开始播放。
所以在你的情况下,它不会工作,即使你确实从点击开始倒计时 Google。
解决方法是从点击事件开始播放,然后立即暂停。这样做,您的元素将被标记为用户批准,您将完全控制它。
const audio = new Audio("https://dl.dropboxusercontent.com/s/1cdwpm3gca9mlo0/kick.mp3");
let time = 5;
btn.onclick = e => {
// mark our audio element as approved by the user
audio.play().then(() => { // pause directly
audio.pause();
audio.currentTime = 0;
});
countdown();
btn.disabled = true;
};
function countdown() {
pre.textContent = --time;
if(time === 0) return onend();
setTimeout(countdown, 1000);
}
function onend() {
audio.play(); // now we're safe to play it
time = 5;
btn.disabled = false;
}
<button id="btn">start countdown</button><br>
<pre id="pre"></pre>
我想在倒计时完成后播放声音。 通常我会使用这种和平的代码来做到这一点
var audio = new Audio('path to file.mp3');
audio.play();
但是我收到以下错误未处理的承诺拒绝:NotAllowedError:当前上下文中的用户代理或平台不允许该请求,可能是因为用户拒绝了权限。
事情是...... Google 它自己正在使用 HTML5 音频标签
如果您在 google 搜索字段中键入 countdown timer
,它应该会显示在倒数计时器结束后播放声音的小部件。
这是 Google 计时器的样子,如果你们不知道我在说什么的话:)
通过让您单击此 "START" 按钮,他们要求用户做出手势,从而将他们的文档标记为用户批准播放音频。这意味着它们不再受 chrome 的 autoplay policies 约束。
现在,默认情况下,Safari 甚至比 Chrome 更严格,简单地单击文档是行不通的:在此浏览器中,您需要从用户事件本身开始播放。
所以在你的情况下,它不会工作,即使你确实从点击开始倒计时 Google。
解决方法是从点击事件开始播放,然后立即暂停。这样做,您的元素将被标记为用户批准,您将完全控制它。
const audio = new Audio("https://dl.dropboxusercontent.com/s/1cdwpm3gca9mlo0/kick.mp3");
let time = 5;
btn.onclick = e => {
// mark our audio element as approved by the user
audio.play().then(() => { // pause directly
audio.pause();
audio.currentTime = 0;
});
countdown();
btn.disabled = true;
};
function countdown() {
pre.textContent = --time;
if(time === 0) return onend();
setTimeout(countdown, 1000);
}
function onend() {
audio.play(); // now we're safe to play it
time = 5;
btn.disabled = false;
}
<button id="btn">start countdown</button><br>
<pre id="pre"></pre>