我正在使用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
如果有帮助。
谢谢!