在node.js中使用socket.io通过webrtc广播现场audio

我试图通过getUserMedia()使用webrtc并使用socket.io将audio发送到服务器(socket.io支持audio,video,二进制数据),然后服务器将其广播到所有连接的客户端。 问题是当stream到达连接的客户端时,它被转换成JSON对象而不是媒体stream对象。 所以我无法发送audio我也试过socket.iostream模块,但我没有succesfull。 你能帮我把audiostream正确地捕获并发送给所有连接的客户端。

这里是发送数据的客户端代码

navigator.getUserMedia({audio: true, video: false}, function(stream) { video.src = window.URL.createObjectURL(stream); webcamstream = stream; media = stream; /// here the datatype of media is mediaStream object socket.emit("sendaudio", media); }, function(e){ console.log(error); }); 

在接收客户端的代码如下

 socket.on('receiveaudio' , function(media) { console.log(media); //but here i am receiving it as a simple object other.src= media; }); 

我从这里复制了我的答案。

本示例显示如何使用MediaRecorder上传audio,然后使用socket.io转发。 此代码只会在您被称为mediaRecorder.stop()后才会广播。 你可以select在ondataavailable里面ondataavailable 。 如果你这样做,你可能想要传递一个timeslicemediaRecorder.start() ,这样它不会经常触发ondataavailable

这个解决scheme并不是真正的生活,但是我认为它会帮助那些回来find这个问题的人。

客户代码

 var constraints = { audio: true }; navigator.mediaDevices.getUserMedia(constraints).then(function(mediaStream) { var mediaRecorder = new MediaRecorder(mediaStream); mediaRecorder.onstart = function(e) { this.chunks = []; }; mediaRecorder.ondataavailable = function(e) { this.chunks.push(e.data); }; mediaRecorder.onstop = function(e) { var blob = new Blob(this.chunks, { 'type' : 'audio/ogg; codecs=opus' }); socket.emit('radio', blob); }; // Start recording mediaRecorder.start(); // Stop recording after 5 seconds and broadcast it to server setTimeout(function() { mediaRecorder.stop() }, 5000); }); // When the client receives a voice message it will play the sound socket.on('voice', function(arrayBuffer) { var blob = new Blob([arrayBuffer], { 'type' : 'audio/ogg; codecs=opus' }); var audio = document.createElement('audio'); audio.src = window.URL.createObjectURL(blob); audio.play(); }); 

服务器代码

 socket.on('radio', function(blob) { // can choose to broadcast it to whoever you want socket.broadcast.emit('voice', blob); });