从函数调用时,无法播放以blob作为源的音频

时间:2018-11-22 03:01:47

标签: javascript audio

我正在使用navigator.mediaDevices.getUserMedia({ audio: true })来获取用户麦克风。这是我的代码:

navigator.mediaDevices.getUserMedia({ audio: true })
    .then(stream => {
        mediaRecorder = new MediaRecorder(stream);
        mediaRecorder.start();

        mediaRecorder.addEventListener("dataavailable", event => {
          audioChunks.push(event.data);
        });

        mediaRecorder.addEventListener("stop", () => {
            blob = new Blob(audioChunks);
            audioUrl = URL.createObjectURL(blob);
        });
    });

然后,当用户单击停止按钮时,它将执行以下操作:

mediaRecorder.stop();
addSound(audioUrl);

然后addSound函数创建一个带有音频和其他信息的对象,并将其放入数组中。然后,我有一个可用作音序器的循环,这是代码:

function loop(){
    secondTimer += (1/40);

    for(var i = 0; i < audios.length; i++){
        var audio = audios[i];
        var start = audio.start;

        if(!audio.played && secondTimer >= start){
            audio.audio.play();
            audio.played = true;
        }
    }

    if(play == true){
        setTimeout(loop, 25);   
    }       
}

基本上,它检查音序器的当前时间是否大于或等于音频的开始时间。如果是,则它将播放音频并将其“已播放”属性设置为true,这样就不能播放两次。

问题是,我用麦克风录制的音频没有播放。但是,例如,如果我使用mp3文件创建音频对象,它将起作用。

要注意的另一件事是,如果我对audio.play()函数执行addSound,则它可以工作。另外,当我使用chrome开发工具并尝试进行audios[x].audio.play()时,它也可以工作。因此,只有在从怪异的循环函数中调用它时,它才起作用。

这是控制台记录日志时显示的音频元素的来源:

blob:http://localhost/4a7bb4a3-1940-496c-a545-a956d1ccbd57

如果有帮助。

谢谢!

0 个答案:

没有答案