Kako smo osemkrat pospešili video kodiranje

Kako smo osemkrat pospešili video kodiranje

Vsak dan si milijoni gledalcev ogledajo videoposnetke na spletu. Da pa je videoposnetek na voljo, ga je treba ne le naložiti na strežnik, ampak tudi obdelati. Hitreje ko se to zgodi, bolje je za storitev in njene uporabnike.

Moje ime je Askar Kamalov in pred enim letom sem se pridružil ekipi za video tehnologijo pri Yandexu. Danes bom z bralci Habra na kratko delil, kako nam je z vzporednim kodiranjem uspelo znatno pospešiti dostavo videa uporabnikom.

Ta objava bo še posebej zanimiva za tiste, ki še niso razmišljali o tem, kaj se dogaja pod pokrovom video storitev. V komentarjih lahko postavljate vprašanja in predlagate teme za prihodnje objave.

Nekaj ​​besed o sami nalogi. Yandex ne pomaga le pri iskanju videoposnetkov na drugih spletnih mestih, temveč tudi shranjuje videoposnetke za lastne storitve. Naj gre za posebno oddajo ali športno tekmo na Efirju, film na KinoPoisku ali videoposnetke na Zenu in Novostih – vse to je naloženo na naše strežnike. Da si uporabniki lahko ogledajo videoposnetek, ga je treba pripraviti: pretvoriti v zahtevano obliko, ustvariti predogled ali celo zagnati s tehnologijo. DeepHDNepripravljena datoteka preprosto zavzame prostor. Poleg tega ne gre le za optimalno izrabo strojne opreme, temveč tudi za hitrost dostave vsebine uporabnikom. Na primer, posnetek odločilnega trenutka na hokejski tekmi je mogoče najti že v minuti po dogodku.

Zaporedno kodiranje

Torej je zadovoljstvo uporabnikov v veliki meri odvisno od tega, kako hitro postane videoposnetek na voljo. In to je v prvi vrsti odvisno od hitrosti transkodiranja. Ko ni strogih zahtev glede hitrosti nalaganja videoposnetka, ni težav. Vzamete eno samo, nedeljivo datoteko, jo pretvorite in naložite. Takole smo delali, ko smo začeli:

Kako smo osemkrat pospešili video kodiranje

Odjemalec naloži videoposnetek v shrambo, komponenta Analizator zbere metapodatke in videoposnetek posreduje komponenti Delavec za pretvorbo. Vse faze se izvajajo zaporedno. Čeprav je lahko več strežnikov za kodiranje, je le eden namenjen obdelavi določenega videoposnetka. Gre za preprosto in pregledno shemo. Tu se njene prednosti končajo. Ta shema se skalira le vertikalno (z nakupom zmogljivejših strežnikov).

Zaporedno kodiranje z vmesnim rezultatom

Da bi ublažili mučno čakanje, si je industrija izmislila metodo, imenovano »hitro kodiranje«. Ime je zavajajoče, saj celotno kodiranje dejansko poteka zaporedno in prav tako dolgo. Vendar pa ponuja vmesni rezultat. Ideja je, da se čim hitreje pripravi in ​​naloži različica videoposnetka z nizko ločljivostjo, nato pa se kasneje objavijo različice z višjo ločljivostjo.

Po eni strani je videoposnetek na voljo hitreje, kar je uporabno za pomembne dogodke. Po drugi strani pa je slika zamegljena, kar gledalce moti.

Izkazalo se je, da je treba video ne le hitro obdelati, ampak tudi ohraniti njegovo kakovost. To je tisto, kar uporabniki danes pričakujejo od video storitev. Morda se zdi, da je nakup najzmogljivejših strežnikov (in njihovo redno nadgrajevanje naenkrat) dovolj. Vendar je to slepa ulica, saj bo vedno obstajal video, ki bo upočasnil tudi najmočnejšo strojno opremo.

Vzporedno kodiranje

Veliko bolj učinkovito je razdeliti kompleksno nalogo na več manj kompleksnih in jih reševati vzporedno na različnih strežnikih. To je MapReduce za video. V tem primeru nismo omejeni z zmogljivostjo enega samega strežnika in lahko horizontalno skaliramo (z dodajanjem več strojev).

Mimogrede, ideja o razbijanju videoposnetkov na manjše koščke, njihovi vzporedni obdelavi in ​​sestavljanju ni skrivnost. Na ta pristop lahko najdete veliko referenc (na primer, priporočam objavo o projektu na Habru). DistVIDc). Vendar to stvari ne olajša, saj ne morete kar vzeti že pripravljene rešitve in jo implementirati. Prilagoditi jo morate svoji infrastrukturi, videoposnetkom in celo delovni obremenitvi. V bistvu je lažje napisati svojo lastno rešitev.

Torej smo v novi arhitekturi monolitni blok Worker z zaporednim kodiranjem razdelili na mikroservise Segmenter, Tcoder in Combiner.

Kako smo osemkrat pospešili video kodiranje

  1. Segmenter razdeli videoposnetek na fragmente, dolge približno 10 sekund. Fragmenti so sestavljeni iz ene ali več skupinskih slik (GOP).skupina slik). Vsaka skupina elementov (GOP) je neodvisna in kodirana ločeno, zato jo je mogoče dekodirati brez sklicevanja na okvirje iz drugih skupin elementov. To pomeni, da se fragmenti lahko predvajajo neodvisno drug od drugega. Ta segmentacija zmanjša zakasnitev, kar omogoča, da se obdelava začne prej.
  2. Tcoder obdela vsak fragment. Iz čakalne vrste vzame nalogo, prenese fragment iz pomnilnika, ga kodira v različnih ločljivostih (ne pozabite, da lahko igralec izbere različico glede na hitrost povezave), nato pa rezultat shrani nazaj v pomnilnik in v bazi podatkov označi fragment kot obdelan. Po obdelavi vseh fragmentov Tcoder pošlje nalogo v generiranje rezultatov za naslednjo komponento.
  3. Combiner zbere rezultate skupaj: prenese vse fragmente, ki jih je ustvaril Tcoder, in oblikuje tokove za različne ločljivosti.

Nekaj ​​besed o zvoku. Najbolj priljubljen zvočni kodek, AAC, ima nesrečno posebnost. Če fragmente kodirate ločeno, jih preprosto ne morete brezhibno združiti. Prehodi bodo opazni. Video kodeki te težave nimajo. Teoretično bi lahko našli sofisticirano tehnično rešitev, vendar se zaenkrat preprosto ne splača (zvok je bistveno manjši od videa). Zato vzporedno kodiramo samo video, medtem ko se zvočni posnetek obdela v celoti.

Ugotovitve

Zahvaljujoč vzporedni obdelavi videoposnetkov smo znatno zmanjšali zakasnitev med nalaganjem videoposnetka k nam in njegovo dajanjem na voljo uporabnikom. Na primer, prej je lahko ustvarjanje več različic filma Full HD v polni kakovosti, ki je trajal uro in pol, trajalo dve uri. Zdaj celoten postopek traja le 15 minut. Poleg tega z vzporedno obdelavo ustvarimo različico z visoko ločljivostjo še hitreje kot različico z nizko ločljivostjo, pri čemer uporabljamo stari pristop vmesnih rezultatov.

In še nekaj. S starim pristopom bodisi ni bilo dovolj strežnikov bodisi so mirovali. Vzporedno kodiranje nam omogoča povečanje izkoriščenosti strojne opreme. Zdaj je naša gruča z več kot tisoč strežniki nenehno zasedena.

Pravzaprav je še vedno prostor za izboljšave. Na primer, lahko bi prihranili veliko časa, če bi začeli obdelovati video fragmente, še preden bi bili v celoti prejeti. Kot pravijo, prihodnost še ni končana.

V komentarjih nam sporočite, o katerih nalogah, povezanih z videoposnetki, bi radi prebrali.

Koristne povezave do izkušenj kolegov iz industrije

Vir: www.habr.com

Kupite zanesljivo gostovanje za strani z DDoS zaščito, VPS VDS strežniki 🔥 Kupite zanesljivo spletno gostovanje z zaščito DDoS, VPS VDS strežniki | ProHoster