Как плавно воспроизводить непрерывные фрагменты звуковых фрагментов внутри «аудио»?

Я получаю 1000ms аудиофрагменты от клиента, используя getUserMedia(), преобразовываю их в аудиоблок длительностью 1 секунду и отправляю их на сервер (и остальным клиентам) с помощью socket-io до тех пор, пока пользователь не прекратит запись.

На сервере я повторно отправляю полученный большой двоичный объект другим клиентам, где URL-адрес большого двоичного объекта получается с использованием createObjectURL(), а затем этот URL-адрес устанавливается как src для тега <audio> во внешнем интерфейсе. Каждые 1000 мс клиенты получают новый большой двоичный объект, его URL-адрес передается и передается тегу <audio>.

Однако этот переход от предыдущего URL-адреса к новому URL-адресу имеет некоторую заметную задержку, из-за чего звук становится неоднородным, менее плавным и последовательным.

На стороне клиента я записываю звуковые фрагменты так:

var chunks = [];
var mediaRecorder = new MediaRecorder(stream, { bitsPerSecond: 32000 });

mediaRecorder.ondataavailable = function (e) {
    chunks.push(e.data);
}


mediaRecorder.start();


setInterval(() => {
    mediaRecorder.stop();
    mediaRecorder.start();
}, 1000);


mediaRecorder.onstop = function (e) {
    var blob = new Blob(chunks, { 'type': 'audio/ogg; codecs=opus' });
    chunks = [];
    socket.emit('audio-blob', blob);
}

На сервере я просто пересылаю блоб клиентам, socket.to(String(socket.room)).broadcast.emit('audio-blob', blob);

а на принимающих клиентах блоб воспроизводится так,

socket.on('audio-blob', blob => {
    var newblob = new File([blob], "filename")
    var audioURL = window.URL.createObjectURL(newblob);
    window.audio = new Audio();
    window.audio.src = audioURL;
    window.audio.play();
})

Как мне сделать звук последовательным и уменьшить заметное отставание во время перехода


person Aviartz    schedule 30.12.2018    source источник
comment
Возможно, вам придется использовать MediaSource, который не потребует изменения источника, а просто добавит фрагменты данных в буфер. См. developers.google.com/web/fundamentals/media/mse/basics   -  person jmsn    schedule 30.12.2018
comment
@jmsn Я нашел этот ответ полезным, stackoverflow.com/questions/50333767/ Но по какой-то причине звук перестает воспроизводиться через 1000 мс (или любое другое время буфера, которое я установил)   -  person Aviartz    schedule 06.01.2019
comment
Используйте параметр временного среза в mediarecorder.start(1000) для загрузки фрагментов длительностью 1000 миллисекунд.   -  person Stephen Duffy    schedule 13.10.2020