Я использую 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);
}
}
По сути, он проверяет, больше или равно ли текущее время из секвенсора, чем время начала из аудио.Если это так, то он воспроизводит звук и устанавливает для его свойства Play значение true, чтобы его нельзя было воспроизвести дважды.
Проблема в том, что звук, записанный с помощью микрофона, не воспроизводится.Однако, если я, например, создаю аудиообъект с использованием mp3-файла, он работает.
Еще одна вещь, которую стоит отметить, - если я выполняю audio.play()
в функции addSound
, она работает.Кроме того, когда я захожу в Chrome Dev Tools и пытаюсь сделать audios[x].audio.play()
, это также работаетТак что он не работает только тогда, когда он вызывается из функции цикла, что странно.
Это источник аудиоэлемента, который отображается при регистрации в консоли:
blob:http://localhost/4a7bb4a3-1940-496c-a545-a956d1ccbd57
Если это поможет,
Заранее спасибо!