Я получаю 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();
})
Как мне сделать звук последовательным и уменьшить заметное отставание во время перехода
MediaSource
, который не потребует изменения источника, а просто добавит фрагменты данных в буфер. См. developers.google.com/web/fundamentals/media/mse/basics а> - person jmsn   schedule 30.12.2018