2010-10-29 30 views
7

1- ¿Cuál es mejor usar para transmitir video? Socket TCP o UDP y por qué?Live Streaming (Socket): cómo sincronizar audio y video?

2- Mientras se transmiten en vivo, el audio y el video provienen del servidor por separado, entonces, ¿cómo puedo asegurarme de que el video que visualice y el audio que reproduzco en el dispositivo estén sincronizados?

Respuesta

5

Escribí una aplicación de chat de voz hace un tiempo y TCP estaba fuera de cuestión, la multidifusión UDP es realmente la única manera de hacerlo si está buscando un flujo de datos casi en tiempo real. Hay dos problemas principales con la transmisión de la materia a través de UDP sin embargo:

  1. La pérdida de paquetes. En el caso del audio, es una solución bastante fácil. Por lo general, los paquetes eliminados no harán una diferencia audible (los paquetes se descomprimen individualmente). Sin embargo, cuando se trata de video, especialmente si el video está comprimido (normalmente lo es), encontrar un protocolo de transferencia adecuado que garantice la robustez de la red es una tarea desalentadora, por decir lo menos, especialmente si lo hace desde cero. Los marcos de video se dividen en varios paquetes. Averiguar qué hacer cuando faltan estos paquetes es difícil.
  2. Sincronización entre audio y video. Este es un problema muy difícil y sugiero leer protocolos como RTSP (Real-Time Streaming Protocol). Esta no es una tarea fácil, pero aquí hay información introductoria: http://www.cs.columbia.edu/~hgs/rtsp/ - a veces se hace enviando paquetes de sincronización por separado (algunos protocolos los envían a través de TCP) que le dicen al reproductor cómo el sonido debe coincidir con el video.
1

Haría UDP. Sin embargo, depende de lo que quieras. UDP arrojará paquetes en lugar de esperar (TCP). La compensación es si desea un establo, pero a veces lento y costoso, o uno que es eficiente, pero a veces puede no ser entregado. La elección es suya cuando se trata de cómo desea implementarlo y cómo lo está utilizando.

0

Hoy en día, incluso YouTube transmite a través de HTTP ... aquí es una aplicación nodejs que fluye un archivo en el cliente de navegador ... utilizar como punto de partida para vivir secuencia de vídeo con audio bien sincronizados

// 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 + "/"); 
Cuestiones relacionadas