如何在javascript中异步加载声音?
我想循环播放几首声音和平行的微积分。 这是时间表:
10 seconds 7 seconds 10 seconds
|--------------------|------------------|--------------------|--- etc
| Sound1 playing |Sound2 playing | Sound1 playing |--- etc
| Do a calculus |Do a calculus | Do a calculus |--- etc
Sound1和Sound2的持续时间不到5秒 Calculs持续1秒钟。
我如何在javascript中执行此操作?
我必须在HTML5中使用Workers吗?
感谢。
答案 0 :(得分:3)
在JS中异步播放声音实际上非常简单。您只需立即创建new Audio
和play()
,而不是play()
全局Audio
个对象。这是一个例子:
function playSoundAsync(url){
new Audio(url).play();
}
因此,在您的情况下,您的代码看起来像这样(包含setInterval
和setTimeout
的hack用于同步声音):
// For simplicity I'll use MP3 files readily available on the Internet
var sound1url = 'https://audio.code.org/win3.mp3';
var sound2url = 'https://audio.code.org/failure3.mp3';
var calculusUrl = 'https://audio.code.org/failure1.mp3';
setInterval(function() {
new Audio(sound1url).play();
new Audio(calculusUrl).play();
}, 17000);
setTimeout(function() {
setInterval(function() {
new Audio(sound2url).play();
new Audio(calculusUrl).play();
}, 17000);
}, 10000);
<button onclick="new Audio(sound1url).play();">Play sound1 individually</button>
<button onclick="new Audio(sound2url).play();">Play sound2 individually</button>
<button onclick="new Audio(calculusUrl).play();">Play calculus individually</button>
此外,当您单击单独播放$ {sound} 按钮时,您可能会注意到这一点:$ {sound}的新播放开始时无需等待或中断当前$ {sound}回放!这允许你创建这样的声音混乱:
var cacophony = setInterval(function(){new Audio('https://audio.code.org/win3.mp3').play();}, 25);
<button onclick="clearInterval(cacophony);">Click here to stop this cacophony</button>
答案 1 :(得分:1)
通过使用 JS 承诺和异步函数,您可以轻松地使音频异步播放(无需使用计时器)。
// makes playing audio return a promise
function playAudio(audio){
return new Promise(res=>{
audio.play()
audio.onended = res
})
}
// how to call
async function test(){
const audio = new Audio('<url>')
await playAudio(audio)
// code that will run after audio finishes...
}
答案 2 :(得分:0)
也许您正在搜索window.setInterval()
。
答案 3 :(得分:0)
我以 dorukayhan 的回答为基础,但我的声音会重复数千次。我担心创建多个新的 Audio 标签最终会导致系统崩溃。
所以我创建了一个函数来循环遍历一堆现有的音频标签。
标签位于 HTML 中的某个位置。我把我的放在结束
标签之前。我的声音是短促的哔哔声,因此 10 个标签足以流畅播放,但您可以尝试使用音频标签的数量。
<audio id="audio0"></audio>
<audio id="audio1"></audio>
<audio id="audio2"></audio>
<audio id="audio3"></audio>
<audio id="audio4"></audio>
<audio id="audio5"></audio>
<audio id="audio6"></audio>
<audio id="audio7"></audio>
<audio id="audio8"></audio>
<audio id="audio9"></audio>
//declare a global counter in your script
<script>
var audiocount=0;
/*other code...*/
/*call to play sound*/
Playsound('mysound.wav')
/*other code*.../
/*add function to play sounds*/
function Playsound(MySoundPlay)
{
/*id() is a shortcut for getElementById*/
id('audio'+audiocount).src=MySoundPlay
id('audio'+audiocount).play()
audiocount++;
/*reset your counter according to no. of audio tags you created*/
if (audiocount>9){audiocount=0;}
}
/*shortcut function for getElementById*/
function id(myID){return document.getElementById(myID)}
</script>