Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按顺序播放多个声音文件,仅播放最后一个声音_Javascript_Html5 Audio - Fatal编程技术网

Javascript 按顺序播放多个声音文件,仅播放最后一个声音

Javascript 按顺序播放多个声音文件,仅播放最后一个声音,javascript,html5-audio,Javascript,Html5 Audio,此应用程序根据数字播放声音。我有多个很短的mp3音频文件。正如问题所说,我希望它按顺序播放所有声音,一个接一个,但只有最后一个声音(数字)在播放,我在控制台上得到错误信息: “未捕获(承诺中)DomeException:play()请求被新的加载请求中断。” 我错过了一些东西,或者这是不可能的。感谢您的帮助 function playSound(note){ var currentPlayer; var player = document.getElementById("pla

此应用程序根据数字播放声音。我有多个很短的mp3音频文件。正如问题所说,我希望它按顺序播放所有声音,一个接一个,但只有最后一个声音(数字)在播放,我在控制台上得到错误信息:

“未捕获(承诺中)DomeException:play()请求被新的加载请求中断。”

我错过了一些东西,或者这是不可能的。感谢您的帮助

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()
)时,没有
对象引用