I am trying to create a live chat. as soon as the client holds the button and speaks, I want the sound to be transmitted over the socket to the nodejs server, then I want to transfer this data to another client.
here is the sender client code:
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); } });
Then the server receives this buffer and passes it to another client (in this example, the same client)
Server code
socket.on('broadcast', function(buffer) { socket.emit('broadcast', new Int16Array(buffer)); });
And then, to play the sound from the other side (receiver), the client code looks like this:
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); });
My expected result is that the sound from client A will be heard in client B, I can see the buffer on the server, I see the buffer back in the client, but I don’t hear anything.
I know that socket.io 1.x supports binary data, but I can not find any example of voice chat, I also tried using BinaryJS, but the results are the same, I also know that using WebRTC is a simple task, but I I don’t want to use WebRTC, can someone point me to a good resource or tell me what I am missing?