
Iga päev vaatavad miljonid vaatajad veebis videoid. Aga et video oleks kergesti kättesaadav, tuleb see mitte ainult serverisse laadida, vaid ka töödelda. Mida kiiremini see toimub, seda parem on teenusele ja tema kasutajatele.
Minu nimi on Askar Kamalov. Aasta tagasi liitusin Yandexi videotehnoloogia meeskonnaga. Täna jagan ma Habra lugejatega, kuidas suutsime kodeerimisprotsessi paralleelitlemise abil video edastamist kasutajatele mitu korda kiirendada.
See postitus huvitab eelkõige neid, kes pole kunagi mõelnud, mis toimub videoteenuste taga. Kommentaarides saate esitada küsimusi ja pakkuda teemasid tulevaste postituste jaoks.
Mõned sõnad ülesande kohta. Yandex mitte ainult ei aita otsida videoid teistel saitidel, vaid salvestab videoid ka oma teenustele. Olgu selleks autorisaade või spordimäng otseülekandes, film KinoPoiskis või lõigud Zenis ja Uudistes — kõik see laaditakse meie serveritesse. Et kasutajad saaksid videot vaadata, tuleb see ette valmistada: konverteerida vajalikku formaati, luua eelvaade või isegi läbi viia tehnoloogilisi protsesse. . Valmistamata fail lihtsalt võtab ruumi. Ja see puudutab mitte ainult optimaalset riistvara kasutamist, vaid ka sisu edastamise kiirusest kasutajateni. Näide: salvestus otsustavast hetkes hoki mängust võib otsingus olla juba minuti pärast pärast sündmust.
Järkjärguline kodeerimine
Nii et kasutaja õnnelikkus sõltub suurel määral sellest, kui kiiresti video kättesaadavaks muutub. Ja see sõltub peamiselt transkodeerimise kiirusest. Kui pole rangeid nõudmisi video üleslaadimise kiirusel, pole ka probleeme. Võtate tervikliku faili, konverteerite selle ja laadite üles. Oma teekonna alguses tegime me just niimoodi.

Klient laadib video salvestusse, komponent Analyzer kogub metaandmeid ja edastab video töötlemiseks komponendile Worker. Kõik etapid toimuvad järjestikku. Samas võib kodeerimiseks olla mitu serverit, kuid ainult üks on konkreetse video töötlemiseks hõivatud. Lihtne ja läbipaistev skeem. Selle kasud sellega lõppevad. Tegu on skeemaga, mis skaleerub ainult vertikaalselt (ostes võimsamaid servereid).
Järjestikune kodeerimine vahepealse tulemusega
Ootamise leevendamiseks on tööstuses välja mõeldud kiire kodeerimise variant. Petlik nimetus, kuna tegelikult toimub täiemahuline kodeerimine järjestikuses protsessis ja sama kaua. Ent selle eelisega, et on vahepealne tulemus. Idee on võimalikult kiiresti valmistada ja avaldada video madala eraldusvõimega versioon, ning hiljem — kõrgema eraldusvõimega versioonid.
Ühest küljest saab video kergemini kätte. See on kasulik oluline sündmuste puhul. Kuid teisest küljest jääb pilt häguseks, mis häirib vaatjaid.
Seega tuleb videote töötlemisega mitte ainult kiiresti tegeleda, vaid ka säilitada nende kvaliteet. Just seda ootavad kasutajad tänapäeva videoteenustelt. Võib tunduda, et piisab lihtsalt kõige võimekamate serverite ostmisest (ja nende regulaarsetest uuendamistest). Kuid see on pimeda tee, sest alati leidub video, mis paneb isegi kõige jõulisemat riistvara pidurduma.
Paralleelne kodeerimine
Oluliselt tõhusam on jagada keeruline ülesanne väiksemateks, vähem keerukateks osadeks ja lahendada neid paralleelselt erinevates serverites. Selline MapReduce videode jaoks. Sel juhul ei jää me kinni ühe serveri jõudluses ja saame horisontaalselt skaleeruda (uute masinate lisamise kaudu).
Muide, idee jagada video väikesteks tükkideks, neid paralleelselt töödelda ja seejärel kokku panna — ei ole mingi saladus. Võite leida palju viiteid sellele lähenemisele (näiteks soovitan Habras postitust projekti ). Kuid sellest ei muutu asi lihtsamaks, sest ei saa lihtsalt võtta juba olemasolevat lahendust ja seda enda juurde integreerida. Me vajame kohandamist meie infrastruktuuri, meie video ja isegi meie koormuse järgi. Ühesõnaga, on lihtsam kirjutada oma.
Nüüd oleme uues arhitektuuri monoliitse Workeri ploki, kus on järk-järgulise kodeerimise, jaganud mikroteenusteks Segmenter, Tcoder, Combiner.

- Segmenter jagab video umbes 10-sekundilisteks fragmentideks. Fragmendid koosnevad ühest või mitmest GOP-st (). Iga GOP on sõltumatu ja kodeeritakse eraldi, seega saab seda dekodeerida ilma viiteta teiste GOP-de raamidele. See tähendab, et fragmente saab esitamiseks eraldi kasutada. Selline segmenteerimine vähendab viivitust, võimaldades töötlemise kiiret algust.
- Tcoder töötleb iga fragmenti. Ta võtab ülesande järjekorrast, laadib fragi välja ladustamisest, kodeerib erinevatesse lahendustesse (meenutame, et mängija võib valida versiooni võrguühenduse kiirusest lähtudes), seejärel salvestab tulemuse tagasi ladustamisse ja märgib fragmendi andmebaasis töödeldud. Pärast kõigi fragmentide töötlemist saadab Tcoder ülesande tulemuste genereerimiseks järgmisele komponendile.
- Combiner kogub tulemused kokku: laadib alla kõik Tcodere loodud fragmendid ja moodustab voogusid erinevate lahenduste jaoks.
Veidi helist. Populaarseimatel helikodekitel AAC-l on üks ebameeldiv omadus. Kui koodida fragmente eraldi, siis ei õnnestu neid sujuvalt kokku liita. Üleminekud on silmatorkavad. Videokodekitel sellist probleemi ei esine. Teoreetiliselt võib otsida keerulist tehnilist lahendust, kuid see mäng ei tasu end hetkel ära (heli kaalub oluliselt vähem kui video). Seetõttu kodeeritakse meil paralleelselt ainult video, samas kui heliriba töödeldakse tervikuna.
Tulemused
Paralleelse video töötlemise tõttu oleme oluliselt vähendanud viivitust video üleslaadimise ja selle kasutajatele kättesaadavuse vahel. Näiteks varem võis täielike eri kvaliteediklassidega versioonide loomine FullHD filmi kestusega üks ja pool tundi võtta kuni kaks tundi. Nüüd kulub selleks vaid 15 minutit. Veelgi enam, paralleelse töötlemise korral loome kõrge eraldusvõimega versiooni isegi kiiremini, kui madala eraldusvõimega versiooni vanade vahenditega, mille tulemuseks oli vahepealne variant.
Ja veel midagi. Vanas lähenemisviisis kas jäi serveritest puudu või seisid nad lihtsalt tegevuseta. Paralleelne kodeerimine aitab tõsta riistvara kasutusprotsenti. Nüüd on meie klaster, mis koosneb üle tuhande serveri, pidevalt millegagi hõivatud.
Tegelikult on veel kuhu püüelda. Näiteks saame oluliselt aega kokku hoida, kui hakkame videofragmente töötlema juba enne, kui need täielikult meieni jõuavad. Nagu öeldakse, edasi -- rohkem.
Kirjutage kommentaaridesse, millistest videotöötlemise ülesannetest sooviksite lugeda.
Kasulikud lingid kolleegide tööstuse kogemustele
Allikas: habr.com
