Cum am accelerat codificarea videoclipurilor de opt ori

Cum am accelerat codificarea videoclipurilor de opt ori

În fiecare zi, milioane de spectatori urmăresc videoclipuri pe internet. Dar pentru ca videoclipul să devină disponibil, acesta trebuie să fie nu numai încărcat pe server, ci și procesat. Cu cât acest lucru se întâmplă mai repede, cu atât este mai bine pentru serviciu și pentru utilizatorii săi.

Numele meu este Askar Kamalov, acum un an m-am alăturat echipei de tehnologie video Yandex. Astăzi voi spune pe scurt cititorilor Habr despre cum, prin paralelizarea procesului de codificare, am reușit să grăbim semnificativ livrarea video către utilizator.

Această postare va fi de interes în primul rând pentru cei care nu s-au gândit anterior la ceea ce se întâmplă sub capota serviciilor video. În comentarii puteți pune întrebări și puteți sugera subiecte pentru postările viitoare.

Câteva cuvinte despre sarcina în sine. Yandex nu numai că vă ajută să căutați videoclipuri pe alte site-uri, ci stochează și videoclipuri pentru propriile servicii. Indiferent dacă este un program original sau un meci sportiv în direct, un film pe KinoPoisk sau videoclipuri pe Zen și Știri - toate acestea sunt încărcate pe serverele noastre. Pentru ca utilizatorii să vizioneze videoclipul, acesta trebuie să fie pregătit: convertit în formatul necesar, creat o previzualizare sau chiar rulați prin tehnologie DeepHD. Un fișier nepregătit doar ocupă spațiu. Mai mult, vorbim nu numai despre utilizarea optimă a hardware-ului, ci și despre viteza de livrare a conținutului către utilizatori. Exemplu: o înregistrare a momentului decisiv al unui meci de hochei poate fi căutată într-un minut după evenimentul în sine.

Codificare secvenţială

Deci, fericirea utilizatorului depinde în mare măsură de cât de repede devine disponibil videoclipul. Și acest lucru este determinat în principal de viteza de transcodare. Când nu există cerințe stricte pentru viteza de încărcare a videoclipurilor, atunci nu există probleme. Luați un singur fișier indivizibil, îl convertiți și îl încărcați. La începutul călătoriei noastre, așa am lucrat:

Cum am accelerat codificarea videoclipurilor de opt ori

Clientul încarcă videoclipul în stocare, componenta Analizor colectează meta informații și transferă videoclipul în componenta Worker pentru conversie. Toate etapele sunt efectuate secvenţial. În acest caz, pot exista multe servere de codificare, dar numai unul este ocupat cu procesarea unui anumit videoclip. Diagrama simplă, transparentă. Aici se termină avantajele sale. Această schemă poate fi scalată doar pe verticală (datorită achiziționării de servere mai puternice).

Codificare secvenţială cu rezultat intermediar

Pentru a ușura cumva așteptarea dureroasă, industria a venit cu o opțiune de codare rapidă. Numele este înșelător, deoarece, de fapt, codarea completă are loc secvenţial și durează la fel de mult. Dar cu un rezultat intermediar. Ideea este aceasta: pregătiți și publicați cât mai repede posibil o versiune cu rezoluție joasă a videoclipului și abia apoi versiuni cu rezoluție mai mare.

Pe de o parte, videoclipul devine disponibil mai repede. Și este util pentru evenimente importante. Dar, pe de altă parte, imaginea se dovedește neclară, iar acest lucru enervează telespectatorii.

Se pare că trebuie nu numai să procesați rapid videoclipul, ci și să-i mențineți calitatea. Asta se așteaptă acum utilizatorii de la un serviciu video. Poate părea că este suficient să cumpărați cele mai productive servere (și să le faceți upgrade regulat pe toate simultan). Dar acesta este un punct mort, pentru că există întotdeauna un videoclip care va face până și cel mai puternic hardware să încetinească.

Codare paralelă

Este mult mai eficient să împărțiți o problemă complexă în multe altele mai puțin complexe și să le rezolvați în paralel pe diferite servere. Acesta este MapReduce pentru video. În acest caz, nu suntem limitați de performanța unui server și putem scala orizontal (prin adăugarea de noi mașini).

Apropo, ideea de a împărți videoclipurile în bucăți mici, de a le procesa în paralel și de a le lipi împreună nu este un secret. Puteți găsi multe referințe la această abordare (de exemplu, pe Habré vă recomand o postare despre proiect DistVIDc). Dar acest lucru nu ușurează în general, pentru că nu poți doar să iei o soluție gata făcută și să o construiești în casa ta. Avem nevoie de adaptare la infrastructura noastră, la video și chiar la sarcina noastră. În general, este mai ușor să-ți scrii pe al tău.

Deci, în noua arhitectură, am împărțit blocul monolitic Worker cu codare secvențială în microservicii Segmenter, Tcoder, Combiner.

Cum am accelerat codificarea videoclipurilor de opt ori

  1. Segmentator împarte videoclipul în fragmente de aproximativ 10 secunde. Fragmentele constau din unul sau mai multe GOP-uri (grup de poze). Fiecare GOP este independent și codificat separat, astfel încât să poată fi decodat fără referire la cadrele din alte GOP. Adică, fragmentele pot fi redate independent unul de celălalt. Această fragmentare reduce latența, permițând procesării să înceapă mai devreme.
  2. Tcoder procesează fiecare fragment. Preia o sarcină din coadă, descarcă un fragment din stocare, îl codifică în diferite rezoluții (rețineți că jucătorul poate alege o versiune în funcție de viteza conexiunii), apoi pune rezultatul înapoi în stocare și marchează fragmentul ca procesat. în baza de date. După ce a procesat toate fragmentele, Tcoder trimite sarcina pentru a genera rezultate pentru următoarea componentă.
  3. Combiner colectează rezultatele împreună: descarcă toate fragmentele realizate de Tcoder, generează fluxuri pentru diferite rezoluții.

Câteva cuvinte despre sunet. Cel mai popular codec audio AAC are o caracteristică neplăcută. Dacă codificați fragmente separat, atunci pur și simplu nu le veți putea lipi fără probleme. Tranzițiile vor fi vizibile. Codecurile video nu au această problemă. Teoretic, puteți căuta o soluție tehnică complexă, dar acest joc pur și simplu nu merită încă lumânarea (audioul cântărește mult mai puțin decât videoclipul). Prin urmare, doar videoclipul este codificat în paralel și întreaga pistă audio este procesată.

Constatări

Datorită procesării video paralele, am redus semnificativ întârzierea dintre încărcarea unui videoclip la noi și disponibilizarea utilizatorilor. De exemplu, anterior ar putea dura două ore pentru a crea mai multe versiuni complete de calitate diferită pentru un film FullHD care dura o oră și jumătate. Acum toate acestea durează 15 minute. Mai mult, cu procesare paralelă, creăm o versiune de înaltă rezoluție chiar mai rapid decât o versiune cu rezoluție joasă, cu vechea abordare a rezultatelor intermediare.

Și încă ceva. Cu vechea abordare, fie nu erau suficiente servere, fie erau inactivi fără sarcini. Codarea paralelă vă permite să creșteți ponderea de reciclare a fierului. Acum clusterul nostru de peste o mie de servere este mereu ocupat cu ceva.

De fapt, mai este loc de îmbunătățire. De exemplu, putem economisi timp semnificativ dacă începem să procesăm fragmente din videoclip înainte de a ajunge la noi în întregime. După cum se spune, urmează mai multe.

Scrieți în comentarii ce sarcini în domeniul lucrului cu videoclipuri ați dori să citiți.

Link-uri utile către experiența colegilor din industrie

Sursa: www.habr.com

Adauga un comentariu