如何在<audio>中平稳地播放连续的音频blob?

时间:2018-12-30 07:09:06

标签: javascript socket.io webrtc web-audio mediastream

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

在服务器上,我将获取的Blob重新发送给其他使用createObjectURL()获得Blob URL的客户端,然后将该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();
})

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

0 个答案:

没有答案