我正在开展一个项目,要求我将客户端A的音频数据代理到客户端B.将其视为客户端A通过麦克风与客户端B通过中间服务器进行通信,因此不会欺骗IP地址。我处理这个问题的方法是记录客户端A的输入音频,每隔150毫秒将录制的音频输出到WAVE(.wav)音频文件,然后将其转发给客户端B.我目前面临的问题是每当客户端B接收到新的音频文件并播放它时,在先前播放的音频块和刚收到的音频文件之间存在微小的断续/弹出/暂停(客户端B将不再能够识别单词,它是那么不好)。起初,我想通过使音频块更大来解决这个问题,因此更少的弹出发生,问题是它增加了客户端A发送音频和客户端B接收它之间的延迟,延迟在这里很重要。
客户A的代码(发件人):
navigator.mediaDevices.getUserMedia({audio: true, video: false}).then(function(mediaStream) {
mediaRecorder = new MediaRecorder(mediaStream);
mediaRecorder.mimeType = "audio/wav";
mediaRecorder.ondataavailable = function (blob) {
// Turn blob (short wav file) into string and send it to server which forwards it to client B
sendToServer(MakeDataURL(blob));
};
mediaRecorder.start(150);
}).catch(function(err) {
alert(err);
});
客户B的代码(接收方):
var audioElement = document.querySelector("audio");
serverConnection.on("message", function(audioAsDataUrl) {
// Works but audio pops each time this is called :(
audioElement.src = audioAsDataUrl;
});
正如您所知,代码已经过简化,但除了音频弹出或其他任何内容之外,一切都有效。
当从代理服务器收到新的音频块时,是否可以在更改音频元素的源后摆脱此弹出窗口?