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

Posted

技术标签:

【中文标题】我可以使用 nodejs 将麦克风音频从客户端流式传输到客户端吗?【英文标题】:Can I stream microphone audio from client to client using nodejs? 【发布时间】:2015-09-06 14:01:42 【问题描述】:

我正在尝试创建实时语音聊天。一旦客户端按住按钮并说话,我希望声音通过套接字发送到 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);
    );

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

我知道 socket.io 1.x 支持二进制数据但我找不到任何进行语音聊天的示例,我也尝试使用 BinaryJS 但结果相同,而且我知道使用 WebRTC 这是一个简单的任务,但我不想使用 WebRTC,谁能给我指出一个好的资源或告诉我我错过了什么?

【问题讨论】:

【参考方案1】:

几周前我自己构建了这样的东西。我遇到的问题(你会在某个时候):

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

我目前不在这个项目上工作,但您可以在以下位置获取代码:https://github.com/cracker0dks/nodeJsVoip

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

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

【讨论】:

非常感谢您提供的信息丰富的回答。我不想使用 webrtc 的原因:首先我必须使用 STUN 和 TURN 服务才能使其在互联网上工作,其次,假设您希望一个客户端向 10 个用户广播,这意味着 10 个对等连接,更多聊天中的客户端,每个客户端需要建立的对等连接越多 是的,您需要 STUN 和 TURN 服务器,但您会发现许多服务器可以自己使用或托管一些服务器 (code.google.com/p/rfc5766-turn-server)。对于 many2many 问题,您可以查看名为:MCU 的软件。目前WebRTC(开源)最好的MCU是Licode:lynckia.com/licode我认为(和使用),但你也可以看看:kurento.org和Telepresence:code.google.com/p/telepresence TCP 确保所有数据包以正确的顺序到达。

以上是关于我可以使用 nodejs 将麦克风音频从客户端流式传输到客户端吗?的主要内容,如果未能解决你的问题,请参考以下文章

从 nodejs 录制音频和流式传输到客户端

尝试通过多点连接将音频从麦克风流式传输到另一部手机

如何通过套接字或框架将音频从 iPhone 的麦克风流式传输到 Mac/PC?

使用套接字 IO 和 Node JS 通过套接字流式传输麦克风

如何将媒体文件从服务器流式传输到客户端,例如我在 loopback 4 nodejs 中的 mp3 音频文件?

将音频从 Mac 上的麦克风流式传输到 iPhone