通过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
。 如果你这样做,你可能想要传递一个timeslice
给mediaRecorder.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); });