通过socket.io 1.0现场audio

从socket.io网站

二进制stream媒体

从1.0开始,可以发送任何blob:图像,audio,video。

我现在想知道,如果这不能解决我最近想做的事情。

实际上,我正在寻找一种方法,将(A – 即麦克风input…)的现场audiostream广播到连接到我的网站的所有客户端。 是这样的可能吗? 我一直在搞乱WebRTC( https://www.webrtc-experiment.com/ )的例子,但是我还没有能够为less数连接的客户端pipe理目标。

我的想法是关于像getUserMedia或任何其他audio源(PCM,无论.. ..)被切碎,并提供给客户端和播放例如HTML5audio元素或任何东西..我需要做的stream尽可能实时,没有大声/冰投服务不够快(事实上,他们不是我的问题的解决scheme,他们的意思是用这种方式),我并不关心audio质量。 跨平台兼容性将会很棒。

是这样的可能吗? 通过使用socket.io作为如何将这些数据提供给客户端?

我将非常感谢任何参考,提示或来源,可以帮助我实现这一点。 非常感谢。

本示例显示如何使用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); }); 

客户端代码中,您可以编写setInterval()而不是setTimeout(),然后recursion调用mediaRecorder.start(),以便每5秒连续发出blob。

 setInterval(function() { mediaRecorder.stop() mediaRecorder.start() }, 5000); 

客户代码

 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 setInterval(function() { mediaRecorder.stop() mediaRecorder.start() }, 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('voice', function(blob) { // can choose to broadcast it to whoever you want socket.broadcast.emit('voice', blob); });