stream flv con apache: seek, http headers e diagnosi con curl
Se dobbiamo embeddare in una pagina web un file video video flv molto grande ci si aspetta che la barra di scorrimento del player funzioni, ovvero che sia possibile andare a un certo punto del filmato senza dover attenderne tutto il caricamento.
Ma non sempre è così.
Questa funzionalità viene implementata dal player che chiede al server di dargli il file flv non dall’inizio ma da un punto arbitrario che dipende da dove abbiamo messo la barra di scorrimento.
Per fare questo il player mette, nell’header HTTP della richiesta un header particolare, chiamato Range Retrieval Requests.
Se il server implementa questa funzionalità l’operazione di “seek” avrà successo, altrimenti no, e saremo costretti ad attendere che il player arrivi a caricare tutto il file flv per fare seek dove vogliamo, con spreco di banda e di tempo.
La prima cosa da fare è capire se il nostro server implementa, nella richiesta http, l’header “Range”.
Come fare ?
Una volta individuato la url del file flv, usiamo curl per capire come ci risponde il server.
Vediamo cosa deve rispondere un server ben configurato.
Con questo primo comando chiedo l’header HTTP al server che in questo caso risponde con il giusto Content-Type “video/x-flv” e la lunghezza del file.
curl -I -s -D - http://flv.kataweb.it/repubblicatv/file/2009/treno090208.flv -o /dev/null HTTP/1.1 200 OK Date: Wed, 11 Feb 2009 14:09:25 GMT Server: Apache/2.2.11-1960-ev Last-Modified: Mon, 09 Feb 2009 12:52:45 GMT ETag: "a09d96-d975e-4627bd8d7b4ef" Accept-Ranges: bytes Content-Length: 890718 Age: 3582 Content-Type: video/x-flv
A questo punto scarichiamo il file in locale
curl -s -D - http://flv.kataweb.it/repubblicatv/file/2009/treno090208.flv -o test.flv
Il file scaricato è della giusta lunghezza.
Proviamo a questo punto a fare al server una richiesta Range, sempre con curl, per vedere come risponde e cosa ci restituisce.
curl -s -v -r0-499 http://flv.kataweb.it/repubblicatv/file/2009/treno090208.flv -o test.flv ... > GET /repubblicatv/file/2009/treno090208.flv HTTP/1.1 > Range: bytes=0-499 > User-Agent: curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1 > Host: flv.kataweb.it > Accept: */* > < HTTP/1.1 206 Partial Content < Date: Wed, 11 Feb 2009 14:28:42 GMT < Server: Apache/2.2.11-1960-ev < Last-Modified: Mon, 09 Feb 2009 12:52:45 GMT < ETag: "a09d96-d975e-4627bd8d7b4ef" < Accept-Ranges: bytes < Content-Length: 500 < Age: 812 < Content-Range: bytes 0-499/890718 < Content-Type: video/x-flv <....
In questo caso il server http implementa l’header Range:
il codice della risposta non è 200 ma 206 (Partial Content).
Il file tornato è della lunghezza richiesta ( in questo caso 500 bytes ).
E’ importante anche che il server risponda con il giusto content-type (video/x-flv).
Se così non fosse potete installare mod_flvx in questo modo ( su Debian Etch )
- Scaricare mod_flvx.c
- Compilarlo
apxs2 -i -a -c mod_flvx.c
-
Creare il file /etc/apache2/mods-available/flvx.load scrivendoci questo
LoadModule flvx_module /usr/lib/apache2/modules/mod_flvx.so
-
Fare in modo che apache carichi questo modulo creando un link simbolico a questo file su
/etc/apache2/mods-enabledroot@ippocrate:/etc/apache2/mods-enabled$ ln -s ../mods-available/flvx.load
-
Aggiungere la direttiva
<IfModule mod_flvx.c> AddHandler flv-stream .flv </IfModule>
dove serve, esempio in apache2.conf o nei virtual host
Oppure semplicemente aggiungere questa direttiva nel .htaccess o nel file di configurazione di Apache
AddType video/x-flv .flv
A questo punto ritestate tutto con curl: se le risposte http sono corrette e i files della giusta lunghezza l’operazione di seek funzionerà.
Non tutti i player swf supportano la seek, le varie prove le ho fatte FLV-Scrubber che la supporta.
Occorre ricordare che affinchè possa essere fatta la seek sui files flv, il file deve contenere i “onMetaData tag”, che possono essere inseriti usando FLVTool2 con il comando
flvtool2 -U <file flv>
2 Commenti
commenta | feed commenti [?] | trackback uri [?]