2

我正在尝试构建一些东西,用户可以在其中使用 socket.io、audioContext、js 的前端和 Node.js、socket.io 的服务器立即向许多人发送音频。

我可以录制音频,将其发送到服务器并发送回其他用户,但我无法播放数据。我想这一定是我如何发送它们或我如何处理接收它们的缓冲区的问题。

我收到以下错误:更新!

传递给 decodeAudioData 的缓冲区包含未知的内容类型。

音频通过正常,缓冲区创建时没有错误,但没有声音反馈。

用户按下记录并开始使用以下功能进行记录/流式传输:

这就是一切的开始:

navigator.getUserMedia({audio: true,video: false}, initializeRecorder, errorCallback);



function initializeRecorder(stream) {

  var bufferSize = 2048;
  audioCtx = new (window.AudioContext || window.webkitAudioContext)();
  var source = audioCtx.createMediaStreamSource(stream);
  var recorder = audioCtx.createScriptProcessor(bufferSize, 1, 1);
  recorder.onaudioprocess = recorderProcess;
  source.connect(recorder);
  recorder.connect(audioCtx.destination);
  recording = true;
  initialized = true;
  play = false;
  stop = true;
}

function recorderProcess(e) {
          var left = e.inputBuffer.getChannelData(0);
          socket.emit('audio-blod-send', convertFloat32ToInt16(left));
       }

function convertFloat32ToInt16(buffer) {
     l = buffer.length;
     buf = new Int16Array(l);
     while (l--) {
       buf[l] = Math.min(1, buffer[l])*0x7FFF;
     }
     return buf.buffer;
   }

然后服务器使用套接字广播原始发送者发送的内容:

socket.on('audio-blod-send',function(data){
  socket.broadcast.to(roomName).emit('audio-blod-receive', data);
});

然后播放数据:更新! 我正在使用 audioContext.decodeData ,我发现它仅用于从 MP3 或 WAV 文件中读取/解码音频而不是流式传输。使用新代码不会出现错误,但是没有音频反馈。

    socket.on('audio-blod-receive',function(data) {
      playAudio(data);
    });

function playAudio(buffer)
  {
    var audioCtx;
    var started = false;
    if(!audioCtx) {
      audioCtx = new (window.AudioContext || window.webkitAudioContext)();
    }

    source = audioCtx.createBufferSource();
    audioBuffer = audioCtx.createBuffer( 1, 2048, audioCtx.sampleRate );
    audioBuffer.getChannelData( 0 ).set( buffer );
    source.buffer = audioBuffer;
    source.connect( audioCtx.destination );
    source.start(0);
    console.log(buffer);
  }

PS如果有人对我正在尝试做的事情进一步感兴趣,请随时与我联系。

4

0 回答 0