首页 > 解决方案 > 如何使用 socket.io 发送 MediaStream AUDIO 数据

问题描述

我一直无法获取从麦克风录制的音频数据并将其发送给房间中的其他客户,以便人们可以实时相互交谈。我有一种方法可以做到这一点,但它效率低下且不稳定......

setInterval(() => {
    navigator.mediaDevices.getUserMedia({ audio: true })
    .then(stream => {
      const mediaRecorder = new MediaRecorder(stream);
      mediaRecorder.start();
      const audioChunks = [];
      mediaRecorder.addEventListener("dataavailable", (event) => {
        audioChunks.push(event.data);
      });

      mediaRecorder.addEventListener("stop", () => {
        socket.emit('liveAudioToServer', audioChunks)
      });

      setTimeout(() => {
        mediaRecorder.stop();
      },2000);
    });
  }, 2000);
此片段记录音频并每两秒发送一个缓冲区,以便客户端在接收到数据时对其进行编译和播放。我知道必须有另一种方法来做到这一点。我尝试了一种不同的方法,但只是收到一个错误。

  socket.on('active', () => {
    if(navigator.getUserMedia) {
      navigator.getUserMedia(
        {audio: true}, 
        function(stream) {
          const audioContext3 = new AudioContext();
          const audioSource3 = audioContext3.createMediaStreamSource(stream);
          const analyser3 = audioContext3.createAnalyser();
          audioSource3.connect(analyser3);
          analyser3.fftSize = 256;
          const bufferLength = analyser3.frequencyBinCount;
          const dataArray = new Uint8Array(bufferLength);
          function sendAudioChunks(){
              analyser3.getByteFrequencyData(dataArray);
              requestAnimationFrame(sendAudioChunks);
              socket.emit('liveAudioToServer', dataArray)
          }
          sendAudioChunks();
        },
        function(){ console.log("Error 003.")}
      );
    }
谁能帮我?

标签: javascriptnode.jssocket.iomediastream

解决方案


推荐阅读