Un client vrea să pună un video niște filme în hero, folosind good oldvideo tag. Și mi-am dat seama că nu știu prea multe despre subiect
Conștient sau nu, până acum m-am ferit de a lucra direct cu video în browser, deci nu sunt sigur că o apuc pe calea corectă.
Din ce am citit, MP4 + AVC reprezintă containerul + codec-ul cu cel mai bun suport; deși WEBM + VP9 este mai eficient, nu se bucură de același suport în browsere (mai ales pe iOS/Safari). Am convertit video în mp4 și webm, îl includ
Toate merg bine, doar că unele videouri au >40mb și durează câteva secunde bune (la mine) sau minute (la client) să înceapă să se miște ceva. Fiind un site foarte nișat cu un anumit target demografic, dimensiunea propriu-zisă nu este o problemă (dpdv al costului/traficului adică) ci doar durata de descărcare.
Restricții/cerințe:
este absolut musai să-l hostăm noi (deci nu YT, Vimeo sau alții)
nu am acces la a face config la server (sau mă rog, aș avea acces, dar prefer să fie cât mai neintruziv din punctul ăsta de vedere)
NU este nevoie de chestii ultra complexe, sunt maximum 6 filme de servit, nu este nevoie de statistici, controale sau alte giumbușlucuri. Deci nu caut SF-uri tehnologice, ci fix opusul
play la video de calitate potrivită pentru ecran și conexiune la internet (aici m-am gândit să măsor cât durează descărcarea un chunk și în funcție de asta, următorul chunck va fi mai mic/mare)
playerul NU are vreun fel de control. Nu are audio, nu are scrubbing. Nu are tracking pentru stats, nu are share, nu are nimic. Are doar autoplay și loop (practic este markup de mai sus). Este un video care rulează ca background.
M-am gândit așa:
spart clipul în trei variante (1080, 720, 480). La 480, video-ul are sub 2mb, deci yay?
spart clipul în părți de 4-5s cu ffmpeg, astfel încât să am ~1mb fiecare chunk.
generat playlist pentru chunk-urile asetea.
folosesc o bibliotecă js care lipește bucățile de video, „măsoară” viteza la internet și servește chunk-urile potrivite (am găsit video.js și hls, momentan investighez dacă chiar sunt ce am nevoie)
Iar la ultimul pas m-am oprit. Nu m-am blocat, m-am oprit, pentru că nu sunt sigur dacă merg în direcția corectă.
În hls.js pot specifica un playlist de playlist-uri și se descurcă el mai departe să schimbe sursa în funcție de conexiune (am făcut probă cu throttle din chrome).
Si in functie de ce alegi calitatea pe care o servesti? De obicei unde am vazut video de genul pus in BG, era pixelat, blurry, semn ca a fost redusa drastic calitatea si marimea. Am mai vazut care aveau un color layer pe ele, care banuiesc ca il face monocrom si ca atare mult mai mic. Nu am fost curios niciodata ce e dedesubt, zic doar ce am vazut in interactiunea utilizatorului.
Ideea inițială era să măsor cât durează descărcarea unui chunk. Am dimensiunea unui chunk, am timpul pentru acel chunk => bandwidth. Repet la fiecare chunk, ajustez dacă e nevoie.
Darrrrr se pare că hsl.js face asta automat, deci nu a mai fost nevoie de asta
Cred ca poti sa folosesti optiunea de master_pl_name (nu am link direct e pe undeva pe la optiunile pt muxerul de hls) pentru a lasa ffmpeg sa genereze un manifest care le contine pe celalalte (aka master), fara sa mai fie nevoie sa mai faci partea de la final.
pune un jpg să fie afișat înainte să se încarce primul mp4; se cheamă poster;
poate fi un blurred version base64 encoded;
asigură-te că faci acel loading doar când e pe cale să îți intre <video> în viewport
cum zicea și cineva mai sus, pune fișierele pe un CDN
include toate versiunile de fișiere mp4, webm etc. și lasă browserul să decidă ce anume încarcă; o să facă fallback la mp4 dacă nu merge webm; dar pentru 90% din browserele care suportă webm, o să meargă și aici avantaj tu
inspiră-te de la companii mari cum fac treaba asta; sunt multe site-uri care sunt video heavy și care totuși se mișcă impecabil