Ako sme osemkrát zrýchlili kódovanie videa

Ako sme osemkrát zrýchlili kódovanie videa

Každý deň sledujú videá na internete milióny divákov. Aby však bolo video dostupné, musí byť nielen nahrané na server, ale aj spracované. Čím rýchlejšie sa to stane, tým lepšie pre službu a jej používateľov.

Volám sa Askar Kamalov, pred rokom som sa pripojil k tímu videotechnológií Yandex. Dnes čitateľom Habr v krátkosti porozprávam o tom, ako sa nám paralelizáciou procesu kódovania podarilo výrazne zrýchliť doručenie videa používateľovi.

Tento príspevok bude v prvom rade zaujímať tých, ktorí sa doteraz nezamýšľali nad tým, čo sa deje pod kapotou video služieb. V komentároch môžete klásť otázky a navrhovať témy pre budúce príspevky.

Pár slov o samotnej úlohe. Yandex vám nielen pomáha vyhľadávať videá na iných stránkach, ale tiež ukladá videá pre svoje vlastné služby. Či už ide o originálny program alebo športový zápas vo vysielaní, film na KinoPoisk alebo videá na Zen a News – to všetko sa nahráva na naše servery. Na to, aby si používatelia video mohli pozrieť, je potrebné ho pripraviť: previesť do požadovaného formátu, vytvoriť náhľad alebo dokonca prejsť technológiou DeepHD. Nepripravený súbor len zaberá miesto. Navyše nehovoríme len o optimálnom využití hardvéru, ale aj o rýchlosti doručovania obsahu používateľom. Príklad: záznam rozhodujúceho momentu hokejového zápasu je možné vyhľadať do minúty po samotnej udalosti.

Sekvenčné kódovanie

Šťastie používateľa teda do značnej miery závisí od toho, ako rýchlo bude video dostupné. A to je určené hlavne rýchlosťou prekódovania. Keď neexistujú prísne požiadavky na rýchlosť nahrávania videa, potom nie sú žiadne problémy. Zoberiete jeden nedeliteľný súbor, skonvertujete ho a nahráte. Na začiatku našej cesty sme pracovali takto:

Ako sme osemkrát zrýchlili kódovanie videa

Klient nahrá video do úložiska, komponent Analyzer zhromažďuje meta informácie a prenesie video do komponentu Worker na konverziu. Všetky fázy sa vykonávajú postupne. V tomto prípade môže existovať veľa kódovacích serverov, ale iba jeden je zaneprázdnený spracovaním konkrétneho videa. Jednoduchý, prehľadný diagram. Tu jeho výhody končia. Túto schému je možné škálovať iba vertikálne (kvôli nákupu výkonnejších serverov).

Sekvenčné kódovanie s medzivýsledkom

Aby sa nejako vyrovnalo bolestivé čakanie, priemysel prišiel s možnosťou rýchleho kódovania. Názov je zavádzajúci, pretože v skutočnosti sa úplné kódovanie vyskytuje postupne a trvá rovnako dlho. Ale s priebežným výsledkom. Myšlienka je takáto: pripraviť a zverejniť verziu videa s nízkym rozlíšením čo najrýchlejšie a až potom verzie s vyšším rozlíšením.

Na jednej strane je video dostupné rýchlejšie. A je to užitočné pri dôležitých udalostiach. Ale na druhej strane je obraz rozmazaný, čo obťažuje divákov.

Ukazuje sa, že musíte nielen rýchlo spracovať video, ale aj zachovať jeho kvalitu. To je to, čo používatelia teraz od video služby očakávajú. Môže sa zdať, že stačí kúpiť najproduktívnejšie servery (a pravidelne ich upgradovať všetky naraz). To je ale slepá ulička, pretože vždy sa nájde video, ktoré spomalí aj ten najvýkonnejší hardvér.

Paralelné kódovanie

Oveľa efektívnejšie je rozdeliť zložitý problém na veľa menej zložitých a riešiť ich paralelne na rôznych serveroch. Toto je MapReduce pre video. V tomto prípade nie sme limitovaní výkonom jedného servera a môžeme škálovať horizontálne (pridávaním nových strojov).

Mimochodom, myšlienka rozdeliť videá na malé kúsky, spracovať ich paralelne a zlepiť ich nie je žiadnym tajomstvom. Na tento prístup nájdete množstvo referencií (napríklad na Habré odporúčam príspevok o projekte DistVIDc). To to však celkovo neuľahčuje, pretože nemôžete len vziať hotové riešenie a zabudovať ho do svojho domova. Potrebujeme prispôsobenie našej infraštruktúre, nášmu videu a dokonca aj nášmu zaťaženiu. Vo všeobecnosti je jednoduchšie napísať svoj vlastný.

V novej architektúre sme teda rozdelili monolitický blok Worker so sekvenčným kódovaním na mikroslužby Segmenter, Tcoder, Combiner.

Ako sme osemkrát zrýchlili kódovanie videa

  1. Segmenter rozdelí video na približne 10-sekundové fragmenty. Fragmenty pozostávajú z jednej alebo viacerých GOP (skupina obrázkov). Každá GOP je nezávislá a kódovaná samostatne, takže ju možno dekódovať bez odkazu na snímky z iných GOP. To znamená, že fragmenty možno prehrávať nezávisle od seba. Toto sharding znižuje latenciu, čo umožňuje skoršie spustenie spracovania.
  2. Tcoder spracováva každý fragment. Zoberie úlohu z fronty, stiahne fragment z úložiska, zakóduje ho do rôznych rozlíšení (nezabudnite, že hráč si môže vybrať verziu na základe rýchlosti pripojenia), potom uloží výsledok späť do úložiska a označí fragment ako spracovaný. v databáze. Po spracovaní všetkých fragmentov Tcoder odošle úlohu na generovanie výsledkov pre ďalší komponent.
  3. Combiner zhromažďuje výsledky spolu: sťahuje všetky fragmenty vytvorené Tcoderom, generuje prúdy pre rôzne rozlíšenia.

Pár slov o zvuku. Najpopulárnejší audio kodek AAC má nepríjemnú vlastnosť. Ak fragmenty kódujete oddelene, jednoducho ich nebudete môcť bez problémov zlepiť. Prechody budú viditeľné. Video kodeky tento problém nemajú. Teoreticky môžete hľadať zložité technické riešenie, ale táto hra zatiaľ jednoducho nestojí za sviečku (audio váži podstatne menej ako video). Preto sa paralelne kóduje iba video a spracováva sa celá zvuková stopa.

výsledky

Vďaka paralelnému spracovaniu videa sme výrazne skrátili oneskorenie medzi nahraním videa a jeho dostupnosťou pre používateľov. Napríklad predtým mohlo vytvorenie niekoľkých plných verzií rôznej kvality pre film s rozlíšením FullHD trvajúci hodinu a pol trvať dve hodiny. Teraz to všetko trvá 15 minút. Navyše pri paralelnom spracovaní vytvárame verziu s vysokým rozlíšením ešte rýchlejšie ako verziu s nízkym rozlíšením so starým prístupom k medzivýsledkom.

A ešte jedna vec. Pri starom prístupe buď nebolo dostatok serverov, alebo boli nečinné bez úloh. Paralelné kódovanie umožňuje zvýšiť podiel recyklácie železa. Teraz je náš klaster s viac ako tisíckou serverov stále niečím zaneprázdnený.

V skutočnosti je stále čo zlepšovať. Môžeme napríklad ušetriť značný čas, ak začneme spracovávať fragmenty videa skôr, ako nám dorazí celé. Ako sa hovorí, pribudnú ďalšie.

Do komentárov napíšte, o akých úlohách v oblasti práce s videom by ste si chceli prečítať.

Užitočné odkazy na skúsenosti kolegov z odvetvia

Zdroj: hab.com

Pridať komentár