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 )

  1. Scaricare mod_flvx.c
  2. Compilarlo
    apxs2 -i -a -c mod_flvx.c
    
  3. Creare il file /etc/apache2/mods-available/flvx.load scrivendoci questo

    LoadModule flvx_module /usr/lib/apache2/modules/mod_flvx.so
    
  4. Fare in modo che apache carichi questo modulo creando un link simbolico a questo file su
    /etc/apache2/mods-enabled

    root@ippocrate:/etc/apache2/mods-enabled$ ln -s ../mods-available/flvx.load
    
  5. 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>

Riferimenti