2010-10-29 32 views
7

1- Quale è meglio usare per lo streaming video? Socket TCP o UDP e perché?Live Streaming (Socket) - Come sincronizzare audio e video?

2- Durante lo streaming live, l'audio e il video provengono dal server separatamente, quindi come posso assicurarmi che il video che mostro e l'audio riprodotto sul dispositivo siano sincronizzati?

risposta

5

Ho scritto un'applicazione di chat vocale qualche tempo fa e TCP era fuori questione, il multicasting UDP è davvero l'unico modo per andare se stai cercando un flusso di dati quasi in tempo reale. Ci sono due problemi principali con lo streaming di roba su UDP anche se:

  1. i pacchetti caduto. Nel caso dell'audio, è una soluzione piuttosto semplice. Di solito i pacchetti rilasciati non fanno una differenza udibile (i pacchetti vengono decompressi individualmente). Tuttavia, quando si ha a che fare con il video, specialmente se il video è compresso (di solito lo è), trovare un protocollo di trasferimento appropriato che garantisca la robustezza della rete è un compito scoraggiante per non dire altro, specialmente se lo stai facendo da zero. I frame video sono suddivisi in vari pacchetti. Capire cosa fare quando questi pacchetti mancano è difficile.
  2. Sincronizzazione audio e video. Questo è un problema molto difficile e suggerisco di leggere su protocolli come RTSP (Real-Time Streaming Protocol). Questo non è un compito facile, ma ecco alcune informazioni introduttive: http://www.cs.columbia.edu/~hgs/rtsp/ - a volte è fatto inviando pacchetti di sincronizzazione separati (alcuni protocolli li inviano su TCP) che dicono al giocatore come il suono deve corrispondere al video.
1

Farei UDP. Comunque dipende da quello che vuoi. UDP lascerà cadere i pacchetti anziché attendere (TCP). Il compromesso è se vuoi una stabile, ma a volte è lenta e costosa, o efficiente, ma a volte potrebbe non essere consegnata. La scelta è tua quando si tratta di come si desidera implementarlo e come lo si utilizza.

0

Oggi anche YouTube trasmette in streaming su HTTP ... ecco un app nodejs che emana un file al client browser ... utilizzare come punto di partenza per vivere streaming di video con audio ben sincronizzati

// usage 
// do following on server side (your laptop running nodejs) 
// node this_file.js 
// 
// then once above is running point your browser at 
// http://localhost:8888 
// 
// of course your browser could be on your mobile or own custom app 



var http = require('http'), 
    fs = require('fs'), 
    util = require('util'); 

var path = "/path/to/audio/or/video/file/local/to/server/cool.mp4"; // put any audio or video file here 

var port = 8888; 
var host = "localhost"; 

http.createServer(function (req, res) { 

    var stat = fs.statSync(path); 
    var total = stat.size; 

    if (req.headers.range) { // meaning client (browser) has moved the forward/back slider 
             // which has sent this request back to this server logic ... cool 
    var range = req.headers.range; 
    var parts = range.replace(/bytes=/, "").split("-"); 
    var partialstart = parts[0]; 
    var partialend = parts[1]; 

    var start = parseInt(partialstart, 10); 
    var end = partialend ? parseInt(partialend, 10) : total-1; 
    var chunksize = (end-start)+1; 
    console.log('RANGE: ' + start + ' - ' + end + ' = ' + chunksize); 

    var file = fs.createReadStream(path, {start: start, end: end}); 
    res.writeHead(206, { 'Content-Range': 'bytes ' + start + '-' + end + '/' + total, 'Accept-Ranges': 'bytes', 'Content-Length': chunksize, 'Content-Type': 'video/mp4' }); 
    file.pipe(res); 

    } else { 

    console.log('ALL: ' + total); 
    res.writeHead(200, { 'Content-Length': total, 'Content-Type': 'video/mp4' }); 
    fs.createReadStream(path).pipe(res); 
    } 
}).listen(port, host); 

console.log("Server running at http://" + host + ":" + port + "/"); 
Problemi correlati