我可以使用nodejs将麦克风音频从客户端传输到客户端吗?

时间:2015-06-20 18:40:12

标签: javascript node.js socket.io web-audio socket.io-1.0

我正在尝试创建实时语音聊天。一旦客户端按住按钮并进行通话,我希望通过套接字将声音发送到nodejs后端,然后我想将此数据传输到另一个客户端。

这是发件人客户端代码:

socket.on('connect', function() {
      var session = {
          audio: true,
          video: false
      };

      navigator.getUserMedia(session, function(stream){
          var audioInput = context.createMediaStreamSource(stream);
          var bufferSize = 2048;

          recorder = context.createScriptProcessor(bufferSize, 1, 1);

          recorder.onaudioprocess = onAudio;

          audioInput.connect(recorder);

          recorder.connect(context.destination);

      },function(e){

      });

      function onAudio(e) {

          if(!broadcast) return;

          var mic = e.inputBuffer.getChannelData(0);

          var converted = convertFloat32ToInt16(mic);

          socket.emit('broadcast', converted);
      }

    });

服务器然后获取此缓冲区并将其流式传输到另一个客户端(在此示例中为同一客户端)

服务器代码

socket.on('broadcast', function(buffer) {
    socket.emit('broadcast', new Int16Array(buffer));
});

然后,为了在另一侧(接收器)播放声音,客户端代码如下:

socket.on('broadcast', function(raw) {

      var buffer = convertInt16ToFloat32(raw);

      var src = context.createBufferSource();
      var audioBuffer = context.createBuffer(1, buffer.byteLength, context.sampleRate);

      audioBuffer.getChannelData(0).set(buffer);

      src.buffer = audioBuffer;

      src.connect(context.destination);

      src.start(0);
    });

我的预期结果是来自客户端A的声音将在客户端B中听到,我可以在服务器上看到缓冲区,我可以在客户端看到缓冲区,但我什么都没听到。

我知道socket.io 1.x支持二进制数据,但我找不到任何进行语音聊天的例子,我也试过使用BinaryJS但结果是一样的,同样,我知道用WebRTC这是一个简单的任务,但我不想使用WebRTC,任何人都可以指向一个好资源或告诉我我缺少什么?

1 个答案:

答案 0 :(得分:8)

几周前,我自己建立了类似的东西。我遇到的问题(你会在某个时候):

  • 在不降低比特率和采样率(通过互联网)的情况下获取大量数据
  • 没有内插或更好的音频压缩的错误音频质量
  • 即使它没有显示给你,你也可以从不同的计算机声卡中获得不同的采样率(我的PC = 48kHz,我的笔记本电脑= 32Khz),这意味着你必须写一个重采样器
  • 在WebRTC中,如果检测到错误的互联网连接,它们会降低音频质量。你不能这样做,因为这是低级别的东西!
  • 你必须以快速的方式实现这一点,因为JS会阻止你的前卫,如果不是>使用webworkers
  • 转换为JS的音频编码很慢,你会得到意想不到的结果(请参阅我的一个audiocodex问题:here)我也试过了Opus,但还没有很好的结果。

我目前不参与此项目,但您可以在以下位置获取代码:https://github.com/cracker0dks/nodeJsVoip

以及多用户voip音频的工作示例:(已删除链接)。 (不再工作了!Websocketserver已关闭!) 如果您进入设置>音频(在页面上),您可以选择更高的位和采样率以获得更好的音质。

编辑:你能告诉我为什么你不想使用WebRTC吗?