Audio en direct via socket.io 1.0

À partir du site web socket.io

Streaming binary

À partir de la version 1.0, il est possible d’envoyer n’importe quel blob: image, audio, vidéo.

Je me demande maintenant si cela ne pourrait pas être la solution à quelque chose que j’essaie de réaliser récemment.

En fait, je cherche un moyen de diffuser un stream audio en direct de (A – c’est-à-dire une entrée micro ..) à tous les clients connectés à un de mes sites Web. Est-ce que quelque chose comme ça est possible? Je bousille avec des exemples WebRTC ( https://www.webrtc-experiment.com/ ) mais je n’ai pas été en mesure de gérer l’objective pour plus de quelques clients connectés.

Mon idée concerne quelque chose comme getUserMedia ou toute autre source audio (PCM, peu importe ..) du côté A qui est hachée en morceaux et fournie au client et jouée par exemple avec un élément audio html5 ou n’importe quoi .. J’ai besoin de faire ce stream autant En temps réel, aucun service de crier / lancer de glace n’était assez rapide (en fait, ils ne sont pas une solution à mon problème, ils sont censés être utilisés de cette façon) et la qualité audio ne m’intéresse pas vraiment. La compatibilité entre plates-formes serait géniale.

Est-ce que quelque chose comme ça est possible? En utilisant socket.io comme moyen de fournir ces données aux clients?

Je serais très reconnaissant pour toute référence, allusion ou source qui pourrait m’aider à atteindre cet objective. Merci beaucoup.

Cet exemple vous montre comment utiliser MediaRecorder pour télécharger de l’audio, puis le transférer à l’aide de socket.io . Ce code ne sera diffusé que lorsque vous aurez appelé mediaRecorder.stop() . Vous pouvez choisir de diffuser à l’intérieur d’ ondataavailable . Si vous faites cela, vous voudrez peut-être passer un timeslice à mediaRecorder.start() , pour que cela ne déclenche pas si souvent ondataavailable .

Cette solution n’est pas vraiment opérationnelle, mais je pense qu’elle aidera les personnes qui reviennent à trouver cette question.

Code client

 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(); }); 

Code serveur

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

vous pouvez voir cette démo https://github.com/LingyuCoder/SkyRTC-demo espérons de l’aide

Dans le code client, vous pouvez écrire setInterval () à la place de setTimeout (), puis appeler récursivement mediaRecorder.start () de manière à ce que le blob soit émis en continu toutes les 5 secondes.

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

Code client

 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(); }); 

Code serveur

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