Kaip mes aštuonis kartus pagreitinome vaizdo įrašų kodavimą

Kaip mes aštuonis kartus pagreitinome vaizdo įrašų kodavimą

Kiekvieną dieną milijonai žiūrovų žiūri vaizdo įrašus internete. Tačiau norint, kad vaizdo įrašas būtų pasiekiamas, jis turi būti ne tik įkeltas į serverį, bet ir apdorotas. Kuo greičiau tai įvyks, tuo geriau paslaugai ir jos vartotojams.

Mano vardas Askaras Kamalovas, prieš metus prisijungiau prie „Yandex“ vaizdo technologijų komandos. Šiandien trumpai papasakosiu „Habr“ skaitytojams apie tai, kaip lygiagrečiavus kodavimo procesą pavyko žymiai pagreitinti vaizdo įrašo pristatymą vartotojui.

Šis įrašas pirmiausia bus įdomus tiems, kurie anksčiau negalvojo apie tai, kas vyksta po vaizdo paslaugų gaubtu. Komentaruose galite užduoti klausimus ir siūlyti temas būsimiems įrašams.

Keletas žodžių apie pačią užduotį. „Yandex“ ne tik padeda ieškoti vaizdo įrašų kitose svetainėse, bet ir saugo vaizdo įrašus savo paslaugoms. Nesvarbu, ar tai originali programa, ar sporto rungtynės eteryje, filmas „KinoPoisk“, ar vaizdo įrašai „Zen“ ir „News“ – visa tai įkeliama į mūsų serverius. Kad vartotojai galėtų žiūrėti vaizdo įrašą, jį reikia paruošti: konvertuoti į reikiamą formatą, sukurti peržiūrą ar net paleisti per technologijas DeepHD. Neparuoštas failas tiesiog užima vietos. Be to, kalbame ne tik apie optimalų techninės įrangos panaudojimą, bet ir apie turinio pateikimo vartotojams greitį. Pavyzdys: ledo ritulio rungtynių lemiamo momento įrašo galima ieškoti per minutę po paties įvykio.

Nuoseklus kodavimas

Taigi, vartotojo laimė labai priklauso nuo to, kaip greitai vaizdo įrašas tampa prieinamas. Ir tai daugiausia lemia perkodavimo greitis. Kai nėra griežtų reikalavimų vaizdo įrašų įkėlimo greičiui, problemų nekyla. Jūs paimate vieną nedalomą failą, konvertuojate jį ir įkeliate. Kelionės pradžioje dirbome taip:

Kaip mes aštuonis kartus pagreitinome vaizdo įrašų kodavimą

Klientas įkelia vaizdo įrašą į saugyklą, Analyzer komponentas renka meta informaciją ir perduoda vaizdo įrašą į Worker komponentą konvertuoti. Visi etapai atliekami nuosekliai. Šiuo atveju gali būti daug kodavimo serverių, tačiau tik vienas yra užsiėmęs konkretaus vaizdo įrašo apdorojimu. Paprasta, skaidri diagrama. Čia jo pranašumai ir baigiasi. Ši schema gali būti keičiama tik vertikaliai (dėl galingesnių serverių pirkimo).

Nuoseklus kodavimas su tarpiniu rezultatu

Norėdami kažkaip išlyginti skausmingą laukimą, pramonė pasiūlė greitą kodavimo parinktį. Pavadinimas yra klaidinantis, nes iš tikrųjų pilnas kodavimas vyksta nuosekliai ir trunka tiek pat. Bet su tarpiniu rezultatu. Idėja tokia: kuo greičiau paruoškite ir paskelbkite mažos raiškos vaizdo įrašo versiją, o tik tada didesnę.

Viena vertus, vaizdo įrašas tampa pasiekiamas greičiau. Ir tai naudinga svarbiems įvykiams. Tačiau, kita vertus, vaizdas būna neryškus, o tai erzina žiūrovus.

Pasirodo, reikia ne tik greitai apdoroti vaizdo įrašą, bet ir išlaikyti jo kokybę. To dabar vartotojai tikisi iš vaizdo įrašų paslaugos. Gali atrodyti, kad pakanka nusipirkti produktyviausius serverius (ir reguliariai juos visus atnaujinti iš karto). Bet tai yra aklavietė, nes visada yra vaizdo įrašas, kuris privers sulėtinti net galingiausią aparatūrą.

Lygiagretus kodavimas

Daug efektyviau sudėtingą problemą padalinti į daug mažiau sudėtingų ir lygiagrečiai jas spręsti skirtinguose serveriuose. Tai MapReduce vaizdo įrašams. Šiuo atveju mūsų neriboja vieno serverio našumas ir galime keisti mastelį horizontaliai (pridėdami naujų mašinų).

Beje, idėja suskaidyti vaizdo įrašus į mažus gabalėlius, juos lygiagrečiai apdoroti ir suklijuoti nėra kažkokia paslaptis. Galite rasti daug nuorodų į šį metodą (pavyzdžiui, Habré rekomenduoju įrašą apie projektą DistVIDc). Tačiau tai apskritai nepalengvina, nes negalite tiesiog paimti paruošto sprendimo ir pastatyti jį savo namuose. Mums reikia prisitaikyti prie mūsų infrastruktūros, vaizdo įrašų ir net apkrovos. Apskritai lengviau parašyti savo.

Taigi naujoje architektūroje monolitinį Worker bloką su nuosekliu kodavimu suskirstėme į mikropaslaugas Segmenter, Tcoder, Combiner.

Kaip mes aštuonis kartus pagreitinome vaizdo įrašų kodavimą

  1. Segmenter suskaido vaizdo įrašą į maždaug 10 sekundžių trukmės fragmentus. Fragmentai susideda iš vieno ar daugiau GOP (paveikslėlių grupė). Kiekvienas GOP yra nepriklausomas ir užkoduotas atskirai, kad jį būtų galima iššifruoti neatsižvelgiant į kadrus iš kitų GOP. Tai yra, fragmentai gali būti žaidžiami nepriklausomai vienas nuo kito. Šis atskyrimas sumažina delsą, todėl apdorojimas gali prasidėti anksčiau.
  2. Tcoder apdoroja kiekvieną fragmentą. Jis paima užduotį iš eilės, atsisiunčia fragmentą iš saugyklos, užkoduoja jį skirtingomis raiškomis (atminkite, kad žaidėjas gali pasirinkti versiją pagal ryšio greitį), tada grąžina rezultatą į saugyklą ir pažymi fragmentą kaip apdorotą. duomenų bazėje. Apdorojęs visus fragmentus, „Tcoder“ siunčia užduotį, kad sugeneruotų rezultatus kitam komponentui.
  3. „Combiner“ renka rezultatus kartu: atsisiunčia visus „Tcoder“ sukurtus fragmentus, generuoja srautus skirtingoms raiškoms.

Keletas žodžių apie garsą. Populiariausias AAC garso kodekas turi nemalonią savybę. Jei užkoduosite fragmentus atskirai, paprasčiausiai negalėsite jų sklandžiai suklijuoti. Perėjimai bus pastebimi. Vaizdo kodekai neturi šios problemos. Teoriškai galima ieškoti sudėtingo techninio sprendimo, tačiau šis žaidimas tiesiog dar nevertas žvakės (garsas sveria žymiai mažiau nei vaizdo įrašas). Todėl lygiagrečiai užkoduojamas tik vaizdo įrašas, o apdorojamas visas garso takelis.

rezultatai

Lygiagretaus vaizdo apdorojimo dėka žymiai sumažinome uždelsimą nuo vaizdo įrašo įkėlimo mums iki jo pateikimo vartotojams. Pavyzdžiui, anksčiau pusantros valandos trukmės FullHD filmo kelių pilnų skirtingų kokybės versijų sukūrimas užtrukdavo dvi valandas. Dabar visa tai trunka 15 minučių. Be to, lygiagrečiai apdorojant didelės raiškos versiją sukuriame net greičiau nei mažos raiškos versiją taikant seną tarpinio rezultato metodą.

Ir dar vienas dalykas. Taikant seną metodą, arba nebuvo pakankamai serverių, arba jie buvo nenaudojami be užduočių. Lygiagretus kodavimas leidžia padidinti geležies perdirbimo dalį. Dabar mūsų daugiau nei tūkstančio serverių grupė visada kažkuo užimta.

Tiesą sakant, dar yra kur tobulėti. Pavyzdžiui, galime sutaupyti daug laiko, jei pradėsime apdoroti vaizdo įrašo fragmentus prieš jam pasiekus visą. Kaip sakoma, bus daugiau.

Komentaruose parašykite apie kokias užduotis darbo su video srityje norėtumėte paskaityti.

Naudingos nuorodos į pramonės kolegų patirtį

Šaltinis: www.habr.com

Добавить комментарий