带有AudioContext的Socket.io在接收时发送和接收音频错误

时间:2015-07-09 17:26:09

标签: node.js sockets audio socket.io audiocontext

我正在尝试构建一些东西,用户可以立即向许多人发送音频,使用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);
  }

P.S如果有人对我想做的事情感兴趣,请随时与我联系。

0 个答案:

没有答案