提高套接字的音质io将音频数据从客户端发送回服务器返回客户端

时间:2017-07-12 03:03:18

标签: javascript node.js audio socket.io getusermedia

此代码实际上有效。每300毫秒,一大块音频数据被发送到服务器并返回到要播放的插座房间中的客户端。只有一个问题。这是非常糟糕的音频质量。每隔300秒就有一个短暂的静电噪声几乎立即消失。我认为这是因为音频块被发送到服务器并返回到房间的插座之间的时间。我没有使用类似套接字io p2p或peerjs的webRTC,因为它们非常复杂并且我是初学者,所以这段代码中我能做些什么来更顺畅地播放音频?我尝试了不同的方法,例如将setInterval函数中的毫秒更改为60并将其提高到5000. choppier的间隔越小但播放越快但质量越高但延迟时间为5秒。

客户端:

var constraints = { audio: true };
    navigator.mediaDevices.getUserMedia(constraints).then(function(mediaStream) {
        var mediaRecorder = new MediaRecorder(mediaStream);
        mediaRecorder.onstart = function(e) {
            this.chunks = [];
        };

        mediaRecorder.ondataavailable = function(e) {
            this.chunks.push(e.data);
        };
        mediaRecorder.onstop = function(e) {
            var blob = new Blob(this.chunks);
            var url = <%- JSON.stringify(url) %>;
            socket.emit('radio', {blob : blob, url : url});
        };

        mediaRecorder.start();

        setInterval(function() {
            mediaRecorder.stop()
            mediaRecorder.start();
        }, 300);
    });

    socket.on('voice', function(arrayBuffer) {
        var blob = new Blob([arrayBuffer], { 'type' : 'audio/webm;codecs=opus' });
        var audio = document.createElement('audio');
        audio.src = window.URL.createObjectURL(blob);
        audio.play();
    });

服务器:

socket.on('radio', function(data) {
    socket.broadcast.to(data.url).emit('voice', data.blob);
    socket.join(data.url);
});

1 个答案:

答案 0 :(得分:1)

您的音频质量很好。您的问题是音频块之间的播放间隙。好的音频看起来像这样。每个音频样本均为*。您每秒可能有44K个样本。

 ***********************************************

您为音频元素提供的样本如下

 ******* ******* ******* *******   ******** *******   ****

注意差距。那些是流行音乐。请注意,播放音频要比捕获花费更长的时间。那是由于差距。

您的任务(如果您决定接受),就是弄清楚如何将音频块放入队列中,以便音频播放器可以连续播放它们,恰好在最后一个音频停止播放时才开始播放下一个音频。您需要某种“解雇”机制。

对于堆栈溢出问题,要完全解释很多,所以我将提供一些提示。

  1. 请勿启动和停止mediaRecorder。让它继续运行。
  2. mediaRecorder.start(nn)中放置几毫秒,例如10
  3. ondataavailable事件处理程序(而不是onstop处理程序)将套接字(示例缓冲区)通过套接字发送到服务器。这使得它们基本上流到服务器。
  4. 使用Web Audio API将示例缓冲区排队到用户的音频设备。大话题。查一下。