Si e përshpejtuam kodimin e videos me tetë herë

Si e përshpejtuam kodimin e videos me tetë herë

Çdo ditë, miliona shikues shikojnë video në internet. Por që videoja të bëhet e disponueshme, ajo jo vetëm që duhet të ngarkohet në server, por edhe të përpunohet. Sa më shpejt të ndodhë kjo, aq më mirë për shërbimin dhe përdoruesit e tij.

Emri im është Askar Kamalov, një vit më parë u bashkua me ekipin e teknologjisë video Yandex. Sot do t'u tregoj shkurtimisht lexuesve të Habr se si, duke paralelizuar procesin e kodimit, arritëm të përshpejtojmë ndjeshëm dërgimin e videos tek përdoruesi.

Ky postim do të jetë kryesisht me interes për ata që nuk kanë menduar më parë se çfarë ndodh nën kapuçin e shërbimeve video. Në komente mund të bëni pyetje dhe të sugjeroni tema për postimet e ardhshme.

Disa fjalë për vetë detyrën. Yandex jo vetëm që ju ndihmon të kërkoni video në faqe të tjera, por gjithashtu ruan video për shërbimet e veta. Pavarësisht nëse është një program origjinal ose një ndeshje sportive në transmetim, një film në KinoPoisk ose video në Zen dhe News - e gjithë kjo ngarkohet në serverët tanë. Në mënyrë që përdoruesit të shikojnë videon, ajo duhet të përgatitet: të konvertohet në formatin e kërkuar, të krijosh një pamje paraprake ose madje të ekzekutohet përmes teknologjisë DeepHD. Një skedar i papërgatitur thjesht zë hapësirë. Për më tepër, ne po flasim jo vetëm për përdorimin optimal të harduerit, por edhe për shpejtësinë e dërgimit të përmbajtjes tek përdoruesit. Shembull: një regjistrim i momentit vendimtar të një ndeshje hokej mund të kërkohet brenda një minute pas vetë ngjarjes.

Kodimi sekuencial

Pra, lumturia e përdoruesit varet kryesisht nga sa shpejt video bëhet e disponueshme. Dhe kjo përcaktohet kryesisht nga shpejtësia e transkodimit. Kur nuk ka kërkesa strikte për shpejtësinë e ngarkimit të videos, atëherë nuk ka probleme. Ju merrni një skedar të vetëm, të pandashëm, e konvertoni dhe e ngarkoni. Në fillim të udhëtimit tonë, ne kemi punuar kështu:

Si e përshpejtuam kodimin e videos me tetë herë

Klienti ngarkon videon në ruajtje, komponenti Analyzer mbledh meta informacion dhe e transferon videon te komponenti Worker për konvertim. Të gjitha fazat kryhen në mënyrë sekuenciale. Në këtë rast, mund të ketë shumë serverë kodues, por vetëm njëri është i zënë me përpunimin e një videoje specifike. Diagram i thjeshtë, transparent. Këtu përfundojnë avantazhet e tij. Kjo skemë mund të shkallëzohet vetëm vertikalisht (për shkak të blerjes së serverëve më të fuqishëm).

Kodimi sekuencial me rezultat të ndërmjetëm

Për të zbutur disi pritjen e dhimbshme, industria doli me një opsion të shpejtë kodimi. Emri është mashtrues, sepse në fakt, kodimi i plotë ndodh në mënyrë sekuenciale dhe zgjat po aq kohë. Por me një rezultat të ndërmjetëm. Ideja është kjo: përgatitni dhe publikoni një version me rezolucion të ulët të videos sa më shpejt të jetë e mundur, dhe vetëm atëherë versione me rezolucion më të lartë.

Nga njëra anë, video bëhet e disponueshme më shpejt. Dhe është e dobishme për ngjarje të rëndësishme. Por nga ana tjetër, fotografia rezulton e turbullt dhe kjo i bezdis shikuesit.

Rezulton se ju duhet jo vetëm të përpunoni shpejt videon, por edhe të ruani cilësinë e saj. Kjo është ajo që përdoruesit presin nga një shërbim video tani. Mund të duket se mjafton të blini serverët më produktivë (dhe t'i azhurnoni rregullisht të gjithë menjëherë). Por kjo është një rrugë pa krye, sepse gjithmonë ekziston një video që do të bëjë që edhe hardueri më i fuqishëm të ngadalësojë.

Kodimi paralel

Është shumë më efikase të ndash një problem kompleks në shumë më pak komplekse dhe t'i zgjidhësh ato paralelisht në serverë të ndryshëm. Ky është MapReduce për video. Në këtë rast, ne nuk jemi të kufizuar nga performanca e një serveri dhe mund të shkallëzojmë horizontalisht (duke shtuar makina të reja).

Nga rruga, ideja e ndarjes së videove në copa të vogla, përpunimi i tyre paralel dhe ngjitja e tyre nuk është ndonjë sekret. Ju mund të gjeni shumë referenca për këtë qasje (për shembull, në Habré unë rekomandoj një postim rreth projektit DistVIDc). Por kjo nuk e bën më të lehtë, sepse nuk mund të merrni vetëm një zgjidhje të gatshme dhe ta ndërtoni në shtëpinë tuaj. Ne kemi nevojë për përshtatje me infrastrukturën tonë, videon tonë dhe madje edhe ngarkesën tonë. Në përgjithësi, është më e lehtë të shkruani tuajën.

Pra, në arkitekturën e re, ne e ndamë bllokun monolit Worker me kodim sekuencial në mikroshërbime Segmenter, Tcoder, Combiner.

Si e përshpejtuam kodimin e videos me tetë herë

  1. Segmenter e ndan videon në fragmente prej afërsisht 10 sekondash. Fragmentet përbëhen nga një ose më shumë GOP (grup fotografish). Çdo GOP është i pavarur dhe i koduar veçmas, në mënyrë që të mund të dekodohet pa iu referuar kornizave nga GOP të tjera. Kjo do të thotë, fragmentet mund të luhen në mënyrë të pavarur nga njëri-tjetri. Kjo ndarje zvogëlon vonesën, duke lejuar që përpunimi të fillojë më herët.
  2. Tcoder përpunon çdo fragment. Ai merr një detyrë nga radha, shkarkon një fragment nga hapësira ruajtëse, e kodon atë në rezolucione të ndryshme (mos harroni se luajtësi mund të zgjedhë një version bazuar në shpejtësinë e lidhjes), më pas e vendos rezultatin përsëri në memorie dhe shënon fragmentin si të përpunuar në bazën e të dhënave. Pasi ka përpunuar të gjitha fragmentet, Tcoder dërgon detyrën për të gjeneruar rezultate për komponentin tjetër.
  3. Combiner mbledh rezultatet së bashku: shkarkon të gjitha fragmentet e bëra nga Tcoder, gjeneron transmetime për rezolucione të ndryshme.

Disa fjalë për zërin. Kodiku më i njohur audio AAC ka një veçori të pakëndshme. Nëse i kodoni fragmentet veç e veç, atëherë thjesht nuk do të jeni në gjendje t'i ngjitni së bashku pa probleme. Tranzicionet do të jenë të dukshme. Kodekët e videove nuk e kanë këtë problem. Teorikisht, mund të kërkoni një zgjidhje teknike komplekse, por kjo lojë thjesht nuk ia vlen ende qiriun (audio peshon dukshëm më pak se video). Prandaj, vetëm videoja është e koduar paralelisht dhe e gjithë pjesa audio përpunohet.

Gjetjet

Falë përpunimit paralel të videos, ne kemi reduktuar ndjeshëm vonesën ndërmjet ngarkimit të një videoje tek ne dhe disponueshmërisë së përdoruesve. Për shembull, më parë mund të duheshin dy orë për të krijuar disa versione të plota me cilësi të ndryshme për një film FullHD që zgjat një orë e gjysmë. Tani e gjithë kjo zgjat 15 minuta. Për më tepër, me përpunim paralel, ne krijojmë një version me rezolucion të lartë edhe më shpejt se versioni me rezolucion të ulët me qasjen e vjetër të rezultateve të ndërmjetme.

Dhe një gjë tjetër. Me qasjen e vjetër, ose nuk kishte mjaft serverë, ose ata ishin të papunë pa detyra. Kodimi paralel ju lejon të rrisni pjesën e riciklimit të hekurit. Tani grupi ynë me më shumë se një mijë serverë është gjithmonë i zënë me diçka.

Në fakt, ka ende vend për përmirësim. Për shembull, mund të kursejmë kohë të konsiderueshme nëse fillojmë të përpunojmë fragmente të videos përpara se ajo të arrijë tek ne në tërësi. Siç thonë ata, më shumë do të vijnë.

Shkruani në komente për cilat detyra do të dëshironit të lexoni në fushën e punës me video.

Lidhje të dobishme me përvojën e kolegëve të industrisë

Burimi: www.habr.com

Shto një koment