2015-12-05 20 views
9

Sono nuovo ai dati binari e getUserMedia, quale sarebbe il modo consigliato di trasmettere getUserMedia (video/audio) a un server e quindi preparare lo streaming (video/audio) per altre connessioni?streaming getUserMedia sul server

Il mio primo pensiero è stato quello di inviare i dati sopra WebSockets e quindi scrivere i dati in un file (mp4) in questo modo:

getUserMedia -->(websockets)--> server -->(file.mp4)--> video.src.

Ho cercato a MediaStreamRecorder e posso inviare un tampone in questo modo:

multiStreamRecorder.ondataavailable = function (blobs) { 
    socket.emit('blobs', blobs) 
}; 

sul server ottengo

{ audio: <Buffer 52 49 46 46 2c 10 04 00 57 41 56 45 66 6d 74 20 10 00 00 00 01 00 01 00 44 ac 00 00 10 b1 02 00 02 00 10 00 64 61 74 61 00 10 04 00 f8 ff 04 00 0d 00 ... >, 
    video: <Buffer 1a 45 df a3 40 20 42 86 81 01 42 f7 81 01 42 f2 81 04 42 f3 81 08 42 82 40 04 77 65 62 6d 42 87 81 02 42 85 81 02 18 53 80 67 10 0a 41 54 15 49 a9 66 ... >, 
    onDataAvailableEventFired: true } 

Ora penso che dovrei scrivere questo in un file, servire quel file e quindi richiedere quel file dalla sorgente di un elemento video. Se è tutto corretto, come farei per scrivere il file sul filesystem? o sto facendo qualcosa di sbagliato?

Capisco che WebRTC abbia funzionalità p2p, servirei lo streaming video a ~ 50 o più client, quindi non è un'opzione.

Aggiornamento con la soluzione websocket:

Ora sto emettendo i dati indietro sopra WebSockets in questo modo:

socket.on('blobs', function(data){ 
    socket.emit('blobs', data) 
}) 

e sul lato client spingendola in un mediaSource e poi un elemento video con un timestampOffset per mantenerlo liscio.

var mediaSource = new MediaSource(), 
    mediaBuffer, 
    // init duration of 0 seems fine 
    duration = 0; 

var video = $('video').get(0); 
video.src = window.URL.createObjectURL(mediaSource); 

mediaSource.addEventListener('sourceopen', function(e) { 
    mediaBuffer = mediaSource.addSourceBuffer('video/webm; codecs="vp8"') 
    mediaBuffer.addEventListener('update', function() { 
     // wait for mediaBuffer update to fire before setting the new duration 
     duration = video.duration 
    }); 
}, false); 

socket.on('blobs', function (data) { 
    mediaBuffer.timestampOffset = duration; 
    mediaBuffer.appendBuffer(new Uint8Array(data.video)); 
}); 
+0

Ho trovato questa domanda mentre cercavo una soluzione utilizzando [API MediaRecorder] (https://www.w3.org/TR/mediastream-recording/#MediaRecorderAPI) anziché la libreria MediaStreamRecorder. C'è una [bella risposta in un'altra domanda] (http://stackoverflow.com/a/27821586/3256574) – marcw

+0

E lo script server.js come ha gestito l'ascolto di una porta, per favore ho bisogno dello script lato server? –

+1

@ASahra la soluzione è già fornita per il lato server. OP sta usando 'socket.on ('blobs', function (data) {socket.emit ('blobs', data)})' per inviare lo stream agli altri utenti, in pratica lo usa come trasferimento 1: 1 . – zillaofthegods

risposta

5

Per fare in modo che funzioni correttamente, è necessario che il server "parli" WebRTC. L'uso di websocket non ti darà il risultato desiderato e non sarà così reattivo come WebRTC - non sarà in tempo reale.

Per ottenere WebRTC in esecuzione su un server, è possibile utilizzare lo stack WebRTC in webrtc.org o OpenWebRTC come punto di partenza, utilizzare GStreamer o fare qualcosa di un po 'più completo. I buoni progetti di media server framework per WebRTC da cui iniziare sono Kurento, Jitsi e Janus.

A causa della natura della domanda, il mio suggerimento è di iniziare con uno dei più completi framework di media server menzionati sopra.

+0

Grazie amico, penso che Janus avrebbe funzionato abbastanza bene per le mie esigenze anche se per ora ho trovato una soluzione carina usando websockets (aggiunto alla domanda). – brod

Problemi correlati