2010-07-21 8 views
12

Ultimamente sto studiando diversi metodi per lo streaming di MP4 al browser. Flash Media Server è una scelta ovvia qui (utilizzando Cloudfront) e la maggior parte delle soluzioni che ho visto utilizzano il protocollo RTMP.Tecnologia di streaming video HD di YouTube?

Tuttavia, ho trascorso un po 'di tempo su YouTube con Firebug e il debugger di Chrome per capire come funzionava il loro streaming e ho scoperto alcune differenze interessanti tra alcuni dei loro video e le tariffe di qualità.

I miei due video di esempio sono A e B. A è disponibile fino a 480p e B è disponibile fino a 1080p. Per entrambi i video, tutte le frequenze fino a 480p vengono offerte in un contenitore FLV con video H.264 e audio AAC, su HTTP. Ciò che è interessante qui è che se non hai ancora scaricato (memorizzato nella cache) l'intero video, e provi a saltare a una parte non codificata del video, verrà creata una nuova richiesta con un parametro 'begin' uguale all'offset target in millisecondi. Esempio da video a 480p A:

http://v11.lscache8.c.youtube.com/videoplayback?ip=0.0.0.0&sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Calgorithm%2Cburst%2Cfactor%2Coc%3AU0dWTldQVF9FSkNNNl9PSlhJ&fexp=904806%2C902906%2C903711&algorithm=throttle-factor&itag=35&ipbits=0&burst=40&sver=3&expire=1279756800&key=yt1&signature=D2D704D63C242CF187CAA5B5D5BAFB8DFACAC5FF.39180C01559C976717B651A7EB1D0C6249231EB7&factor=1.25&id=8568eb3135971f6f&begin=111863 

Response Headers: 
Cache-Control:public,max-age=23472 
Connection:close 
Content-Length:14320637 
Content-Type:video/x-flv 
Date:Wed, 21 Jul 2010 17:23:48 GMT 
Expires:Wed, 21 Jul 2010 23:55:00 GMT 
Last-Modified:Wed, 19 May 2010 12:31:41 GMT 
Server:gvs 1.0 
X-Content-Type-Options:nosniff 

Il file restituito da questo URL è un FLV pienamente valida che contiene solo la parte del video dopo l'offset richiesto.

Ho eseguito lo stesso tipo di test sulle versioni a risoluzione più alta del video B. A 720p e 1080p, YouTube restituirà un video in un contenitore MP4, anche con video H.264 e audio AAC. Quello che mi colpisce è che il loro server utilizza lo stesso tipo di offset per un video MP4 (tramite il parametro 'begin') e restituisce un MP4 valido (l'atomo di moov nella parte anteriore del file con offset corretti) che include anche solo la parte richiesta del video.

Quindi, come fa YouTube? Come generano al volo il contenitore FLV o MP4 con le intestazioni corrette e solo il segmento desiderato del video richiesto? So che questo può essere ottenuto usando FFMPEG per cercare il punto di partenza desiderato e lo script qt-faststart per riposizionare l'atomo moov nella parte anteriore dello stream, ma sembra che questo sarebbe troppo lento per gestire on-demand per milioni di Spettatori di YouTube

Idee?

Grazie in anticipo!

Nota: non mi è permesso di includere più di 1 collegamento a questo punto, ecco l'URL del video A: http: // www.youtube .com/watch v = hWjrMTWXH28 "Video disponibile fino a 480p"

?
+0

Come nota a margine .. Vimeo non utilizza alcuna tecnologia simile. Quando si visualizza un video su Vimeo, l'intero MP4 viene scaricato progressivamente e non è possibile scorrere in avanti la porzione che è già stata memorizzata. – bgentry

risposta

0

Non penso che YouTube usi FFMPEG per il suo streaming. Il formato del contenitore, flv o mp4, è abbastanza semplice e non richiede un calcolo intensivo. È importante trovare solo il fotogramma chiave più vicino al timestamp specificato begin e iniziare da esso.

3

Una domanda simile è stata posta in questo forum. http://www.flashforum.de/forum/video/flv-ab-beliebiger-position-streamen-248483.html

ci sono due soluzioni avaiable:

  1. utilizzare un server di streaming
  2. Utilizzare un file-wrapper scritto in un linguaggio di programmazione a scelta (ad esempio è scritto in PHP)

In entrambe le soluzioni è necessario modificare tutti i tuoi video usando flvmid per aggiungere le informazioni key-frame al flv-video.

Nella seconda soluzione, php-script riceve la richiesta che hai postato sopra e analizza il flv-video finché non raggiunge la posizione data dal parametro inizio. Dopodiché inizia a inviare il contenuto del video al visitatore della pagina. Leggi il thread per avere maggiori informazioni e un esempio di codice php.

Il thread originale è scritto in tedesco, ma è possibile utilizzare http://translate.google.com per ottenere un cattivo inglese :)

Il HTTP-risposta che hai postato contiene la seguente riga:

Server:gvs 

Forse GVS significa qualcosa come "Google Video Server". Ho cercato gvs ma non ho trovato nulla di valore.

+0

gvs potrebbe anche significare, sistemi di grand vitesse, penso che stiano ospitando i loro video su una rete di contenuti su misura per i video, e la rete di contenuti potrebbe essere costituita da server gvs di qualche tipo. –

1

Youtube utilizza il server lighttpd per lo streaming. In realtà utilizza lo streaming pseudo non in streaming. Questo meccanismo consente agli spettatori di cercare parti non ancora scaricate di un video

2

Dai un'occhiata al server NGINX, ha i moduli per fare esattamente questo. L'autore ha eseguito tutte le operazioni di parsing e riscrittura dei contenitori FLV e MP4 per produrre l'offset richiesto esatto. Non c'è bisogno di ffmpeg nella parte di streaming in quanto sarebbe eccessivo.