3

我正在1000ms使用从客户端获取音频块getUserMedia()并将其转换为 1 秒的音频 blob,然后使用 socket-io 将它们发送到服务器(以及其他客户端),直到用户停止录制。

在服务器上,我将获得的 blob 重新发送到使用 blob 的 URL 获取的其他客户端,createObjectURL()然后将此 URL 设置为前端src<audio>标记。每 1000 毫秒,客户端会获得一个新的 blob,并获取其 URL,然后将其提供给<audio>标签。

但是,从先前的 url 到新的 url 的这种转换有一些明显的延迟,这会导致音频不完整并且不太流畅和一致。

在客户端,这就是我录制音频 blob 的方式,

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);
}

在服务器上,我只是将 blob 重新发送给客户端, socket.to(String(socket.room)).broadcast.emit('audio-blob', 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();
})

如何在过渡期间使音频保持一致并减少明显的延迟

4

0 回答 0