Continutul video se bucura de un interes enorm in mediul online, genereaza multe vizite, in consecinta venituri bune din publicitate. Cea mai folosita metoda de a transmite continut video de durata relativ scurta este pseudo-streaming-ul. Aceasta metoda este suportata de catre cele mai populare servere HTTP, Apache si Lighttpd.
Am ales pentru acest articol Lighttpd, in detrimentul Apache, in principal datorita experientei personale.
Principiul de functionare a presudo-streaming-ului este urmatorul: player-ul folosit pe pagina de web, un player flash (JWplayer, Flowplayer), trimite catre server-ul HTTP o cerere GET impreuna cu parametrul start, iar server-ul HTTP va trimite catre player continutul video incepand de la timpul precizat in parametrul start. In logurile Lighttpd vom avea:
“GET /content/7ea1bbe55369bb97caea64d37ca0e370/4bbf5ad1/test.flv?start=0 HTTP/1.1” 200 12933917 “-” “Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3”
Lighttpd ofera urmatoarele optiuni:
- servirea fisierelor FLV si H.264 cu ajutorul a doua module: mod_flv_streaming, respectiv mod_h264_streaming;
- controlul perioadei pentru care browser-ele vor tine continutul video in cache (expire.url);
- protectia impotriva celor care vor sa faca hotlink continutului video pe alte site-uri (mod_secdownload), inlocuind calea reala a fisierului video cu una temporara; ati observat desigur calea fisierului folosit in exemplu: “/content/7ea1bbe55369bb97caea64d37ca0e370/4bbf5ad1/test.flv”;
- bandwidth shaping: se poate limita rata de transfer a fisierului video pentru fiecare utilizator/conexiune (connection.kbytes-per-second);
Optiunile de mai sus se pot regasi astfel in fisierul de configurare a Lighttpd:
server.modules = (
"mod_expire",
"mod_secdownload",
"mod_flv_streaming",
"mod_h264_streaming"
)
$HTTP["url"] =~ ".(mp4|f4v|flv)Acum putem incepe sa construim propriul nostru YouTube!quot; {
expire.url = ( "" => "access 8 hours" )
}
$HTTP["host"] == "testdomain.ro" {
server.document-root = "/var/www/testdomain.ro"
dir-listing.activate = "disable"
connection.kbytes-per-second = 512
}
flv-streaming.extensions = ( ".flv" )
h264-streaming.extensions = ( ".mp4", ".f4v" )
h264-streaming.buffer-seconds = 10
secdownload.secret = "secret"
secdownload.document-root = "calea_reala_catre_directorul_video"
secdownload.uri-prefix = "/content/"
secdownload.timeout = 3600
Folosirea metodei pseudo-streaming ridica unele probleme de scalabilitate/implementare, cum ar fi:
- nevoia de a folosi mai multe servere HTTP/front-end-uri pentru a face fata unui numar mare de vizitatori; exista in linux metode mature de balansare a traficului HTTP, de exemplu http://www.linuxvirtualserver.org/;
- nevoia de a stoca distribuit si de a indexa continutul video; nu la fel de simplu de rezolvat ca si prima provocare, pentru inceput folosirea unui sistem centralizat de stocare, FiberChannel, impreuna cu NFS si Cachefilesd pe serverele front-end, poate oferi un start facil.
Desigur aceasta metoda ofera si o serie de avantaje:
- o implementare rapida si ieftina, folosind solutii opensource usor de configurat;
- buffering/caching pentru continutul video;
- utilizatorul poate accesa momente aleatoare din continutul video (fisierele video trebuie insa sa contina metadata);
Metadata poate fi usor de generat, folosind sub Linux/Unix utilitarul FLVTool2, http://rubyforge.org/projects/flvtool2/:
flvtool2 -U [fisier_video]
FLVTool2 poate fi folosit alaturi de FFMPEG, pentru a obtine din fiecare fisier video o imagine pe care sa o folosim ca si preview, si ImageMagick, pentru a putea suprapune durata materialului video peste imaginea folosita pentru preview.
Iata cateva exemple de cum pot fi folosite FFMPEG si ImageMagick sub Linux:
- Pentru a obtine durata materialului video,
ffmpeg -i [calea_catre_fisier] 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//
- Sa spunem ca vrem sa folosim ca si imagine preview frame-ul video corespunzator secundei 10 (-itsoffset),
ffmpeg -y -itsoffset -10 -i [fisierul_video] -vcodec mjpeg -vframes 1 -an -f rawvideo -s [imagine_preview]
- In coltul sud-est (-gravity) al pozei obtinute anterior, folosind ImageMagick, vrem sa punem durata materialului video pe un fundal gri (-undercolor), pentru a o putea distinge usor indiferent de culorile imaginii preview,
convert [imagine_preview_initiala] -pointsize font_size -fill overlay_color -undercolor '#00000080' -gravity SouthEast -annotate +0+5 ' [durata_video] ' [imagine_preview_finala]
Acum putem incepe sa construim propriul nostru YouTube!
eu imi creez fisierele .mp4 cu softul avidemux in linux apoi folosesc lighttpd / mod_h264_streaming si JWplayer asa cum ai specificat si tu in acest articol si merge perfect.