Kuidas me kiirendasime video kodeerimist kaheksa korda

Kuidas me kiirendasime video kodeerimist kaheksa korda

Iga päev vaatavad miljonid vaatajad Internetis videoid. Kuid selleks, et video oleks saadaval, tuleb seda mitte ainult serverisse laadida, vaid ka töödelda. Mida kiiremini see juhtub, seda parem on teenusele ja selle kasutajatele.

Minu nimi on Askar Kamalov, aasta tagasi liitusin Yandexi videotehnoloogia meeskonnaga. Täna räägin Habri lugejatele lühidalt sellest, kuidas kodeerimisprotsessi paralleelsusega õnnestus meil oluliselt kiirendada video edastamist kasutajani.

See postitus pakub huvi eelkõige neile, kes pole varem mõelnud, mis videoteenuste kapoti all toimub. Kommentaarides saate esitada küsimusi ja soovitada teemasid tulevasteks postitusteks.

Paar sõna ülesandest endast. Yandex mitte ainult ei aita teil otsida videoid teistelt saitidelt, vaid salvestab ka videoid enda teenuste jaoks. Olgu selleks originaalsaade või eetris olev spordimatš, KinoPoiski film või Zeni ja Newsi videod – kõik see laaditakse üles meie serveritesse. Selleks, et kasutajad saaksid videot vaadata, tuleb see ette valmistada: teisendada nõutavasse vormingusse, luua eelvaade või isegi läbi viia tehnoloogia DeepHD. Ettevalmistamata fail võtab lihtsalt ruumi. Pealegi ei räägi me mitte ainult riistvara optimaalsest kasutamisest, vaid ka sisu kasutajatele edastamise kiirusest. Näide: hokimatši otsustava hetke salvestist saab otsida minuti jooksul pärast sündmust ennast.

Järjestikune kodeerimine

Seega sõltub kasutaja õnn suuresti sellest, kui kiiresti video kättesaadavaks saab. Ja selle määrab peamiselt ümberkodeerimise kiirus. Kui video üleslaadimise kiirusele ranged nõuded puuduvad, siis probleeme pole. Võtate ühe jagamatu faili, teisendate selle ja laadite üles. Meie teekonna alguses töötasime järgmiselt:

Kuidas me kiirendasime video kodeerimist kaheksa korda

Klient laadib video üles salvestusruumi, komponent Analyzer kogub metainfot ja edastab video teisendamiseks komponendile Worker. Kõik etapid viiakse läbi järjestikku. Sel juhul võib olla palju kodeerimisservereid, kuid ainult üks on hõivatud konkreetse video töötlemisega. Lihtne läbipaistev diagramm. Siin selle eelised lõpevad. Seda skeemi saab skaleerida ainult vertikaalselt (võimsamate serverite ostmise tõttu).

Jadakodeering vahetulemusega

Et piinarikast ootamist kuidagi siluda, tuli tööstuses välja kiire kodeerimisvõimalus. Nimi on eksitav, sest tegelikult toimub täielik kodeerimine järjestikku ja võtab sama kaua aega. Aga vahepealse tulemusega. Idee on järgmine: koostage ja avaldage videost võimalikult kiiresti madala eraldusvõimega versioon ja alles seejärel kõrgema eraldusvõimega versioonid.

Ühest küljest muutub video kiiremini kättesaadavaks. Ja see on kasulik oluliste sündmuste jaoks. Kuid teisest küljest osutub pilt uduseks ja see ärritab vaatajaid.

Selgub, et peate videot mitte ainult kiiresti töötlema, vaid ka säilitama selle kvaliteedi. Seda ootavad kasutajad nüüd videoteenuselt. Võib tunduda, et piisab kõige produktiivsemate serverite ostmisest (ja nende kõigi korraga korrapärasest uuendamisest). Kuid see on ummiktee, sest alati on video, mis paneb isegi kõige võimsama riistvara aeglustuma.

Paralleelkodeering

Palju tõhusam on jagada keeruline probleem paljudeks vähemkeerulisteks ja neid paralleelselt erinevates serverites lahendada. See on MapReduce video jaoks. Sel juhul ei piira meid ühe serveri jõudlus ja saame skaleerida horisontaalselt (uute masinate lisamisega).

Muide, idee jagada videod väikesteks tükkideks, neid paralleelselt töödelda ja kokku liimida pole saladus. Sellele lähenemisele leiate palju viiteid (näiteks Habré lehel soovitan postitust projekti kohta DistVIDc). Kuid see ei muuda seda üldiselt lihtsamaks, sest te ei saa lihtsalt võtta valmis lahendust ja ehitada seda oma koju. Vajame kohandamist oma infrastruktuuri, video ja isegi koormusega. Üldiselt on lihtsam ise kirjutada.

Niisiis jagasime uues arhitektuuris järjestikuse kodeerimisega monoliitse Workeri ploki mikroteenusteks Segmenter, Tcoder, Combiner.

Kuidas me kiirendasime video kodeerimist kaheksa korda

  1. Segmenter jagab video umbes 10 sekundi pikkusteks fragmentideks. Fragmendid koosnevad ühest või mitmest GOP-ist (piltide rühm). Iga GOP on sõltumatu ja kodeeritud eraldi, nii et seda saab dekodeerida ilma teiste GOP-ide kaadritele viitamata. See tähendab, et fragmente saab mängida üksteisest sõltumatult. See jagamine vähendab latentsust, võimaldades töötlemist varem alustada.
  2. Tcoder töötleb iga fragmenti. See võtab järjekorrast ülesande, laadib salvestuselt alla killu, kodeerib selle erinevatesse eraldusvõimetesse (pidage meeles, et mängija saab valida ühenduse kiiruse järgi versiooni), seejärel paneb tulemuse tagasi salvestusruumi ja märgib fragmendi töödeldud andmebaasis. Pärast kõigi fragmentide töötlemist saadab Tcoder ülesande järgmise komponendi jaoks tulemuste genereerimiseks.
  3. Combiner kogub tulemused kokku: laadib alla kõik Tcoderi tehtud fragmendid, genereerib erinevate eraldusvõimete jaoks vooge.

Paar sõna heli kohta. Kõige populaarsemal AAC-helikoodekil on ebameeldiv funktsioon. Kui kodeerite fragmendid eraldi, ei saa te neid lihtsalt sujuvalt kokku liimida. Üleminekud on märgatavad. Videokodekitel seda probleemi pole. Teoreetiliselt võib otsida keerulist tehnilist lahendust, kuid see mäng pole lihtsalt veel küünalt väärt (heli kaalub oluliselt vähem kui video). Seetõttu kodeeritakse paralleelselt ainult video ja töödeldakse kogu heliriba.

Järeldused

Tänu paralleelsele videotöötlusele oleme oluliselt vähendanud viivitust video meile üleslaadimise ja kasutajatele kättesaadavaks tegemise vahel. Näiteks võis varem poolteist tundi kestva FullHD filmi jaoks mitme erineva kvaliteediga täisversiooni loomiseks kuluda kaks tundi. Nüüd võtab see kõik 15 minutit. Pealegi loome paralleeltöötlusega kõrge eraldusvõimega versiooni isegi kiiremini kui madala eraldusvõimega versiooni vana vahetulemuse lähenemisega.

Ja veel üks asi. Vana lähenemise korral ei olnud servereid piisavalt või olid need ilma ülesanneteta jõude. Paralleelne kodeerimine võimaldab suurendada raua taaskasutamise osakaalu. Nüüd on meie enam kui tuhandest serverist koosnev klaster alati millegagi hõivatud.

Tegelikult on veel arenguruumi. Näiteks saame oluliselt aega säästa, kui hakkame video fragmente töötlema enne, kui see tervikuna meieni jõuab. Nagu öeldakse, tuleb veel.

Kirjuta kommentaaridesse, millistest videoga töötamise valdkonna ülesannetest soovid lugeda.

Kasulikud lingid valdkonna kolleegide kogemustele

Allikas: www.habr.com

Lisa kommentaar