/ / Mam strumień danych audio z ffmpeg, jak mogę go odtworzyć w przeglądarce? - node.js, audio, ffmpeg, strona klienta

Mam strumień danych audio od ffmpeg, w jaki sposób mogę go odtworzyć w przeglądarce? - node.js, audio, ffmpeg, strona klienta

Byłem w stanie z powodzeniem przesyłać dźwięk na żywo z mojego mikrofonu do mojego serwera węzła Chciałbym teraz przesłać go strumieniowo do wszystkich podłączonych klientów, próbowałem to zrobić za pomocą gniazd internetowych.

Przesyłam dźwięk za pomocą tego polecenia

ffmpeg -f alsa -i hw:0 -acodec mp2 -f mp3 -r 30 http://localhost:8086

Węzeł pobiera tablicę buforów i piszę ją do wszystkich podłączonych klientów, tak jak w przypadku pakietu "ws"

// HTTP Server to accept incomming MP3 Stream (audio)
var audioServer = require("http").createServer( function(request, response) {

audioSocket.broadcast(data, {binary:true});

}).listen(8086);

var audioSocket = new (require("ws").Server)({port: 8088});
audioSocket.broadcast = function(data, opts) {

for( var i in this.clients ) {
this.clients[i].send(data);
}
};

Masz pomysł, jak mogę odtwarzać te dane w przeglądarce? Próbowałem to zrobić temat ale metoda decodeAudioData () nie działa.

Mój kod po stronie klienta

node={};
var audio = new WebSocket("ws://localhost:8088/");
audio.binaryType = "arraybuffer";
var context = new webkitAudioContext();

audio.onmessage = function(data){
node.buf=data.data;
node.sync=0;
node.retry=0;
decode(node);
}

function syncStream(node){ // should be done by api itself. and hopefully will.
var buf8 = new Uint8Array(node.buf);
buf8.indexOf = Array.prototype.indexOf;
var i=node.sync, b=buf8;
while(1) {
node.retry++;
i=b.indexOf(0xFF,i); if(i==-1 || (b[i+1] & 0xE0 == 0xE0 )) break;
i++;
}
if(i!=-1) {
var tmp=node.buf.slice(i); //carefull there it returns copy
delete(node.buf); node.buf=null;
node.buf=tmp;
node.sync=i;
return true;
}
return false;
}

function decode(node) {
context.decodeAudioData(node.buf,
function(decoded){
node.source  = context.createBufferSource();
node.source.connect(context.destination);
node.source.buffer=decoded;
node.source.noteOn(context.currentTime);
console.log("IT WORKED!  DECODED", decoded);
},
function(){ // only on error attempt to sync on frame boundary
//console.log("error");
if(syncStream(node)) decode(node);
});
}

Odpowiedzi:

0 dla odpowiedzi № 1

robisz to dla zabawy lub dla prawdziwego produktu życia? z powodzeniem użyliśmy serwera streamingowego vlc w jednym z naszych projektów, instalacja na Ubuntu była łatwa http://www.videolan.org/vlc/streaming.html