Javascript 如何在内部平滑播放连续的音频块<;音频>;?

Javascript 如何在内部平滑播放连续的音频块<;音频>;?,javascript,socket.io,webrtc,web-audio-api,mediastream,Javascript,Socket.io,Webrtc,Web Audio Api,Mediastream,我正在使用getUserMedia()从客户端获取1000ms音频块,并将其转换为1秒的音频块,然后使用套接字io将其发送到服务器(以及其他客户端),直到用户停止录制 在服务器上,我将获得的blob重新发送到其他客户端,在这些客户端中,blob的URL是使用createObjectURL()获得的,然后该URL被设置为src,用于前端的标记。每1000毫秒,客户机就会得到一个新的blob,并获取其URL,然后将其发送到标记 然而,从以前的url到新url的转换有一些明显的延迟,这会导致音频不完整

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

在服务器上,我将获得的blob重新发送到其他客户端,在这些客户端中,blob的URL是使用
createObjectURL()
获得的,然后该URL被设置为
src
,用于前端的
标记。每1000毫秒,客户机就会得到一个新的blob,并获取其URL,然后将其发送到
标记

然而,从以前的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);
}
在服务器上,我只是将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();
})

如何在转换过程中使音频一致并减少明显的延迟

您可能需要使用
MediaSource
,它不需要更改源,只需将数据块附加到缓冲区即可。请参阅@jmsn,我发现这个答案很有用,但出于某种原因,音频在1000毫秒(或我设置的任何缓冲时间)后停止播放。请在mediarecorder上使用timeslice参数。对于1000毫秒的数据块上载,启动(1000)