我可以使用 nodejs 将麦克风音频从客户端流式传输到客户端吗?
Can I stream microphone audio from client to client using nodejs?
我正在尝试创建实时语音聊天。一旦客户端按下按钮并通话,我希望通过套接字将声音发送到 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,任何人都可以指点我一个好的资源或告诉我我错过了什么吗?
几周前我自己构建了这样的东西。我 运行 遇到的问题(你会在某个时候遇到):
- 不降低比特率和采样率(通过互联网)的大量数据
- 没有插值或更好的音频压缩的音频质量差
- 即使没有向您展示,您也会从不同的计算机声卡(我的 PC = 48kHz,我的笔记本电脑 = 32Khz)获得不同的采样率,这意味着您必须编写一个重采样器
- 在 WebRTC 中,如果检测到互联网连接不良,它们会降低音频质量。你不能这样做,因为这是低级的东西!
- 你必须快速实现它,因为如果不使用 webworkers,JS 会阻塞你的前端
- 用于 JS 的音频编解码器 t运行 非常慢,您会得到意想不到的结果(请参阅我的一个音频编解码器问题:here) I have tried Opus,但还没有好的结果。
我目前不参与此项目,但您可以在以下位置获取代码:https://github.com/cracker0dks/nodeJsVoip
和工作示例:(link 已删除)用于多用户 voip 音频。 (不再工作了!Websocketserver 挂了!)
如果您进入设置>音频(在页面上),您可以选择更高的位和采样率以获得更好的音频质量。
编辑:你能告诉我为什么你不想使用 WebRTC 吗?
我正在尝试创建实时语音聊天。一旦客户端按下按钮并通话,我希望通过套接字将声音发送到 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,任何人都可以指点我一个好的资源或告诉我我错过了什么吗?
几周前我自己构建了这样的东西。我 运行 遇到的问题(你会在某个时候遇到):
- 不降低比特率和采样率(通过互联网)的大量数据
- 没有插值或更好的音频压缩的音频质量差
- 即使没有向您展示,您也会从不同的计算机声卡(我的 PC = 48kHz,我的笔记本电脑 = 32Khz)获得不同的采样率,这意味着您必须编写一个重采样器
- 在 WebRTC 中,如果检测到互联网连接不良,它们会降低音频质量。你不能这样做,因为这是低级的东西!
- 你必须快速实现它,因为如果不使用 webworkers,JS 会阻塞你的前端
- 用于 JS 的音频编解码器 t运行 非常慢,您会得到意想不到的结果(请参阅我的一个音频编解码器问题:here) I have tried Opus,但还没有好的结果。
我目前不参与此项目,但您可以在以下位置获取代码:https://github.com/cracker0dks/nodeJsVoip
和工作示例:(link 已删除)用于多用户 voip 音频。 (不再工作了!Websocketserver 挂了!) 如果您进入设置>音频(在页面上),您可以选择更高的位和采样率以获得更好的音频质量。
编辑:你能告诉我为什么你不想使用 WebRTC 吗?