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

问题描述 投票:6回答:1

我正在尝试创建实时语音聊天。一旦客户端按住按钮并进行通话,我希望声音通过套接字发送到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,任何人都可以向我指出一个好的资源或者告诉我我错过了什么?

javascript node.js socket.io web-audio socket.io-1.0
1个回答
8
投票

几个星期前,我自己建立了这样的东西。我遇到的问题(你会在某些时候):

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

我目前不在这个项目上工作,但你可以获得代码:https://github.com/cracker0dks/nodeJsVoip

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

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

© www.soinside.com 2019 - 2024. All rights reserved.