Kako smo osemkrat pospešili video kodiranje

Kako smo osemkrat pospešili video kodiranje

Vsak dan na milijone gledalcev gleda video posnetke na internetu. Da pa je video na voljo, ga je treba ne samo naložiti na strežnik, ampak tudi obdelati. Hitreje ko se to zgodi, bolje je za storitev in njene uporabnike.

Moje ime je Askar Kamalov, pred enim letom sem se pridružil ekipi video tehnologije Yandex. Danes bom bralcem Habra na kratko povedal, kako nam je z vzporednim procesom kodiranja uspelo bistveno pohitriti dostavo videa uporabniku.

Ta objava bo zanimiva predvsem za tiste, ki še niso razmišljali o tem, kaj se dogaja pod pokrovom video storitev. V komentarjih lahko postavite vprašanja in predlagate teme za prihodnje objave.

Nekaj ​​besed o sami nalogi. Yandex vam ne pomaga le pri iskanju videoposnetkov na drugih spletnih mestih, ampak tudi shranjuje videoposnetke za svoje storitve. Ne glede na to, ali gre za izvirni program ali športno tekmo v oddaji, film na KinoPoisk ali videe na Zen in News - vse to je naloženo na naše strežnike. Da si lahko uporabniki ogledajo video, ga je treba pripraviti: pretvoriti v zahtevano obliko, ustvariti predogled ali celo pregnati tehnologijo DeepHD. Nepripravljena datoteka samo zavzame prostor. Poleg tega ne govorimo le o optimalni uporabi strojne opreme, temveč tudi o hitrosti dostave vsebin uporabnikom. Primer: posnetek odločilnega trenutka hokejske tekme lahko iščemo v minuti po samem dogodku.

Zaporedno kodiranje

Sreča uporabnika je torej v veliki meri odvisna od tega, kako hitro postane video na voljo. In to je odvisno predvsem od hitrosti transkodiranja. Ko ni strogih zahtev glede hitrosti nalaganja videa, potem ni težav. Vzamete eno samo nedeljivo datoteko, jo pretvorite in naložite. Na začetku naše poti smo delali takole:

Kako smo osemkrat pospešili video kodiranje

Odjemalec naloži videoposnetek v shrambo, komponenta Analyzer zbere metainformacije in prenese video v komponento Worker za pretvorbo. Vse stopnje se izvajajo zaporedno. V tem primeru je lahko veliko strežnikov za kodiranje, vendar je samo eden zaposlen z obdelavo določenega videa. Preprost, pregleden diagram. Tu se njegove prednosti končajo. To shemo je mogoče skalirati le vertikalno (zaradi nakupa zmogljivejših strežnikov).

Zaporedno kodiranje z vmesnim rezultatom

Da bi nekako ublažili boleče čakanje, je industrija pripravila možnost hitrega kodiranja. Ime je zavajajoče, saj se dejansko celotno kodiranje izvaja zaporedno in traja prav toliko časa. Ampak z vmesnim rezultatom. Ideja je naslednja: čim hitreje pripravite in objavite različico videa v nizki ločljivosti in šele nato različice v višji ločljivosti.

Po eni strani postane video hitreje dostopen. Uporaben je za pomembne dogodke. Toda po drugi strani se slika izkaže zamegljena, kar gledalce moti.

Izkazalo se je, da morate ne le hitro obdelati video, ampak tudi ohraniti njegovo kakovost. To zdaj uporabniki pričakujejo od video storitve. Morda se zdi, da je dovolj, da kupite najbolj produktivne strežnike (in jih redno nadgrajujete vse naenkrat). Toda to je slepa ulica, saj se vedno najde kakšen videoposnetek, ki bo upočasnil tudi najzmogljivejšo strojno opremo.

Vzporedno kodiranje

Veliko bolj učinkovito je kompleksen problem razdeliti na veliko manj kompleksnih in jih reševati vzporedno na različnih strežnikih. To je MapReduce za video. V tem primeru nismo omejeni z zmogljivostjo enega strežnika in lahko horizontalno skaliramo (z dodajanjem novih strojev).

Mimogrede, ideja o razdelitvi videoposnetkov na majhne koščke, njihovi vzporedni obdelavi in ​​lepljenju ni skrivnost. Najdete lahko veliko referenc na ta pristop (na primer, na Habréju priporočam objavo o projektu DistVIDc). Vendar to na splošno ne olajša, saj ne morete kar vzeti že pripravljene rešitve in jo vgraditi v svoj dom. Potrebujemo prilagoditev naši infrastrukturi, našemu videu in celo naši obremenitvi. Na splošno je lažje napisati svoje.

Tako smo v novi arhitekturi monolitni blok Worker s sekvenčnim kodiranjem razdelili na mikrostoritve Segmenter, Tcoder, Combiner.

Kako smo osemkrat pospešili video kodiranje

  1. Segmentator videoposnetek razdeli na približno 10 sekund dolge fragmente. Fragmenti so sestavljeni iz ene ali več GOP (skupina slik). Vsak GOP je neodvisen in kodiran ločeno, tako da ga je mogoče dekodirati brez sklicevanja na okvire iz drugih GOP. To pomeni, da se lahko fragmenti predvajajo neodvisno drug od drugega. To razdeljevanje zmanjša zakasnitev in omogoča zgodnejši začetek obdelave.
  2. Tcoder obdela vsak fragment. Vzame nalogo iz čakalne vrste, prenese fragment iz pomnilnika, ga kodira v različne ločljivosti (ne pozabite, da lahko igralec izbere različico glede na hitrost povezave), nato pa rezultat vrne v pomnilnik in označi fragment kot obdelan v bazi podatkov. Ko obdela vse fragmente, Tcoder pošlje nalogo za generiranje rezultatov za naslednjo komponento.
  3. Combiner zbere rezultate skupaj: prenese vse fragmente, ki jih je ustvaril Tcoder, ustvari tokove za različne ločljivosti.

Nekaj ​​besed o zvoku. Najbolj priljubljen zvočni kodek AAC ima neprijetno lastnost. Če fragmente kodirate ločeno, jih preprosto ne boste mogli brezhibno zlepiti skupaj. Prehodi bodo opazni. Video kodeki nimajo te težave. Teoretično lahko iščete zapleteno tehnično rešitev, vendar ta igra preprosto še ni vredna sveče (avdio tehta bistveno manj kot video). Zato je vzporedno kodiran le video, obdelan pa je celoten zvočni posnetek.

Ugotovitve

Zahvaljujoč vzporedni obdelavi videoposnetkov smo znatno zmanjšali zamik med tem, ko je videoposnetek naložen k nam in je na voljo uporabnikom. Na primer, prej je lahko trajalo dve uri, da ustvarite več polnih različic različne kakovosti za film FullHD, ki traja uro in pol. Zdaj vse to traja 15 minut. Poleg tega z vzporedno obdelavo ustvarimo različico visoke ločljivosti še hitreje kot različico nizke ločljivosti s starim pristopom vmesnega rezultata.

In še nekaj. Pri starem pristopu bodisi ni bilo dovolj strežnikov bodisi so mirovali brez opravil. Vzporedno kodiranje vam omogoča povečanje deleža recikliranja železa. Zdaj je naš grozd z več kot tisoč strežniki vedno z nečim zaposlen.

Pravzaprav je še vedno prostor za izboljšave. Na primer, lahko prihranimo veliko časa, če začnemo obdelovati fragmente videa, preden ta v celoti prispe do nas. Kot pravijo, bo še več.

V komentarje zapišite, o katerih nalogah na področju dela z videom bi radi brali.

Uporabne povezave do izkušenj kolegov iz industrije

Vir: www.habr.com

Dodaj komentar