Javascript 按顺序播放多个声音文件,仅播放最后一个声音
此应用程序根据数字播放声音。我有多个很短的mp3音频文件。正如问题所说,我希望它按顺序播放所有声音,一个接一个,但只有最后一个声音(数字)在播放,我在控制台上得到错误信息: “未捕获(承诺中)DomeException:play()请求被新的加载请求中断。” 我错过了一些东西,或者这是不可能的。感谢您的帮助Javascript 按顺序播放多个声音文件,仅播放最后一个声音,javascript,html5-audio,Javascript,Html5 Audio,此应用程序根据数字播放声音。我有多个很短的mp3音频文件。正如问题所说,我希望它按顺序播放所有声音,一个接一个,但只有最后一个声音(数字)在播放,我在控制台上得到错误信息: “未捕获(承诺中)DomeException:play()请求被新的加载请求中断。” 我错过了一些东西,或者这是不可能的。感谢您的帮助 function playSound(note){ var currentPlayer; var player = document.getElementById("pla
function playSound(note){
var currentPlayer;
var player = document.getElementById("player");
var isPlaying = player.currentTime > 0 && !player.paused && !player.ended
&& player.readyState > 2;
if (!isPlaying){
player.src = "sounds/"+note+".mp3";
player.play();
}else{
player.pause();
player.currentTime = 0;
currentPlayer = player;
}
}
//variable with numbers where each number should load a sound and play
var numString = "0934590042529689108538569377239609480456034083552";
for(i = 0; i < numString.length; i++){
switch (parseInt(numString[i])){
case 1:
playSound("C");
break;
case 2:
playSound("D");
break;
case 3:
playSound("E");
break;
case 4:
playSound("F");
break;
case 5:
playSound("G");
break;
case 6:
playSound("A");
break;
case 7:
playSound("B");
break;
case 8:
playSound("C2");
break;
case 9:
playSound("D2");
break;
case 0:
playSound("silence");
break;
}
功能播放声音(注意){
var-currentPlayer;
var player=document.getElementById(“player”);
var isplay=player.currentTime>0&&!player.paused&&!player.end
&&player.readyState>2;
如果(!显示){
player.src=“sounds/”+note+“.mp3”;
player.play();
}否则{
player.pause();
player.currentTime=0;
当前玩家=玩家;
}
}
//带有数字的变量,其中每个数字应加载声音并播放
var numString=“0934590042529689108538569377239609480456034083552”;
对于(i=0;i
Html:
<audio controls id="player" style="display: none">
<source src="#"></source>
</audio>
在加载下一个注释之前,您必须等待第一个注释完成:
var指数=0;
var numString=“0934590042529689108538569377239609480456034083552”;
变量注释=[‘沉默’、‘C’、‘D’、‘E’、‘F’、‘G’、‘A’、‘B’、‘C2’、‘D2’];
var player=document.getElementById('player');
函数playNote(){
如果(索引>=numString.length){
停止();
返回;
}
var note=notes[Number(numString[index])];//将数字转换为相应的注释('1'=>'C'))
如果(!注意){
停止();
返回;
}
index++;//下次调用“playNote”时,将播放下一个音符
player.src=`sounds/${note}.mp3`;
player.play();//此操作结束时,将触发“ended”事件并调用“playNote”
}
功能停止(){
player.removeEventListener('ended',playNote);//播放完最后一个音符后,删除事件侦听器
}
player.addEventListener('ended',playNote);//每当声音结束时,调用'playNote'
playNote();//开始播放第一个音符
编辑:
我在playNote
函数中将this
更改为playNote
。当第一次调用此函数(playNote()
)时,没有此
对象引用player
。它应该是playNote.call(player)
。但现在是这样,它也应该是这样
要减少注释之间的加载时间,有两种可能:
在多个音频中分别加载声音文件
对于每个音符,创建一个新音频()
并加载声音文件:
var numString=“0934590042529689108538569377239609480456034083552”;
变量注释=[‘沉默’、‘C’、‘D’、‘E’、‘F’、‘G’、‘A’、‘B’、‘C2’、‘D2’];
var audios={};
notes.forEach(note=>{
var audio=新音频();
audio.src=`sounds/${note}.mp3`;//加载声音文件
音频[注]=音频;
});
var currentAudio=null;//当前正在播放的音频
函数playNote(){
如果(当前音频){
currentAudio.removeEventListener('ended',playNote);//从刚刚停止播放的音频中删除事件侦听器
}
如果(索引>=numString.length){
返回;
}
var note=notes[Number(numString[index])];//将数字转换为相应的注释('1'=>'C'))
如果(!注意){
返回;
}
currentAudio=音频[注];
index++;//下次调用“playNote”时,将播放下一个音符
currentAudio.play();//此操作结束时,将触发“ended”事件并调用“playNote”
currentAudio.addEventListener('ended',playNote);
}
playNote();
使用AudioContext
API
新版本比简单的
new Audio()
要复杂得多,但功能要强大得多。您不需要在服务器上安装所有可能的声音文件-您可以使用客户端的声音芯片来创建您想要的任何声音。在加载下一个音符之前,您必须等待第一个音符完成:
var指数=0;
var numString=“0934590042529689108538569377239609480456034083552”;
变量注释=[‘沉默’、‘C’、‘D’、‘E’、‘F’、‘G’、‘A’、‘B’、‘C2’、‘D2’];
var player=document.getElementById('player');
函数playNote(){
如果(索引>=numString.length){
停止();
返回;
}
var note=notes[Number(numString[index])];//将数字转换为相应的注释('1'=>'C'))
如果(!注意){
停止();
返回;
}
index++;//下次调用“playNote”时,将播放下一个音符
player.src=`sounds/${note}.mp3`;
player.play();//此操作结束时,将触发“ended”事件并调用“playNote”
}
功能停止(){
player.removeEventListener('ended',playNote);//播放完最后一个音符后,删除事件侦听器
}
player.addEventListener('ended',playNote);//每当声音结束时,调用'playNote'
playNote();//开始播放第一个音符
编辑:
我在playNote
函数中将this
更改为player
。首次调用此函数(playNote()
)时,没有此
对象引用