我可以使用 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 将麦克风音频从客户端流式传输到客户端吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过套接字或框架将音频从 iPhone 的麦克风流式传输到 Mac/PC?
使用套接字 IO 和 Node JS 通过套接字流式传输麦克风