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

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

我几个星期前就自己做了这样的事情。 我遇到的问题(你会在某个时候):

  • 在不减less比特率和采样率的情况下(通过互联网)
  • 坏audio质量没有插值或更好的audio压缩
  • 即使它没有显示给你,你会从不同的电脑声卡(我的PC = 48kHz,我的笔记本电脑= 32Khz)得到不同的采样率,这意味着你必须写一个重采样器
  • Websocket是TCP:每个audio数据包都会到达目标,但是如果条件不好,你可以同时或以不同的顺序获得多个数据包。 (如果你想要UDP,你必须在每个客户端上使用UDP客户端代理)
  • 在WebRTC中,如果检测到互联网连接不良,它们会降低audio质量。 你不能这样做,因为这是低级别的东西!
  • 你必须快速实现这个,因为如果不使用web工作者,JS会阻止你的前进
  • audiocodex转换为JS是非常缓慢的,你会得到意想不到的结果(见我的一个audiocodex问题: 在这里 )我也试过Opus以及,但没有好的结果呢。

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

和工作示例:(链接删除)多用户VoIPaudio。 (不工作了!Websocketserverclosures了!)如果进入设置>audio(在页面上),您可以select更高位和采样率以获得更好的audio质量。

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