我正在尝试创建实时语音聊天。一旦客户端按住按钮并进行通话,我希望声音通过套接字发送到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,任何人都可以向我指出一个好的资源或者告诉我我错过了什么?
几个星期前,我自己建立了这样的东西。我遇到的问题(你会在某些时候):
我目前不在这个项目上工作,但你可以获得代码:https://github.com/cracker0dks/nodeJsVoip
以及多用户voip音频的工作示例:(链接已删除) (不再工作了!Websocketserver已关闭!)如果你进入设置>音频(在页面上),你可以选择更高的位和采样率以获得更好的音频质量。
编辑:你能告诉我你为什么不想使用WebRTC吗?