Kako smo ubrzali video kodiranje za osam puta

Kako smo ubrzali video kodiranje za osam puta

Svaki dan milijuni gledatelja gledaju video zapise na internetu. Ali da bi video postao dostupan, mora se ne samo prenijeti na poslužitelj, već i obraditi. Što se to brže dogodi, to bolje za uslugu i njezine korisnike.

Moje ime je Askar Kamalov, prije godinu dana pridružio sam se Yandexovom timu za videotehnologiju. Danas ću čitateljima Habra ukratko ispričati kako smo paraleliziranjem procesa kodiranja uspjeli značajno ubrzati isporuku videa korisniku.

Ovaj će post prvenstveno biti zanimljiv onima koji dosad nisu razmišljali o tome što se događa ispod haube video servisa. U komentarima možete postavljati pitanja i predlagati teme za buduće objave.

Nekoliko riječi o samom zadatku. Yandex ne samo da vam pomaže u potrazi za videozapisima na drugim stranicama, već i pohranjuje videozapise za vlastite usluge. Bilo da se radi o originalnom programu ili sportskoj utakmici u eteru, filmu na KinoPoisku ili video zapisima na Zen i News - sve se to učitava na naše poslužitelje. Kako bi korisnici mogli pogledati video, potrebno ga je pripremiti: pretvoriti u traženi format, napraviti pretpregled ili čak proći kroz tehnologiju DeepHD. Nepripremljena datoteka samo zauzima prostor. Štoviše, ne govorimo samo o optimalnom korištenju hardvera, već io brzini isporuke sadržaja korisnicima. Primjer: snimku odlučujućeg trenutka hokejaške utakmice moguće je pretraživati ​​unutar minute nakon samog događaja.

Sekvencijalno kodiranje

Dakle, sreća korisnika uvelike ovisi o tome koliko brzo video postane dostupan. A to je uglavnom određeno brzinom transkodiranja. Kada nema strogih zahtjeva za brzinu uploada videa, onda nema problema. Uzmete jednu, nedjeljivu datoteku, pretvorite je i učitate. Na početku našeg puta radili smo ovako:

Kako smo ubrzali video kodiranje za osam puta

Klijent prenosi video u pohranu, komponenta Analyzer prikuplja meta informacije i prenosi video u radnu komponentu za konverziju. Sve faze se izvode uzastopno. U ovom slučaju može postojati mnogo poslužitelja za kodiranje, ali samo je jedan zauzet obradom određenog videa. Jednostavan, transparentan dijagram. Ovdje završavaju njegove prednosti. Ova se shema može skalirati samo okomito (zbog kupnje snažnijih poslužitelja).

Sekvencijalno kodiranje s međurezultatom

Kako bi nekako ublažili bolno čekanje, industrija je smislila opciju brzog kodiranja. Naziv je pogrešan, jer se zapravo potpuno kodiranje odvija uzastopno i traje jednako dugo. Ali s međurezultatom. Ideja je sljedeća: što je brže moguće pripremiti i objaviti verziju videa u niskoj rezoluciji, a tek onda u višoj.

S jedne strane, video postaje brže dostupan. I korisno je za važne događaje. Ali s druge strane, slika ispada mutna, a to smeta gledateljima.

Ispada da morate ne samo brzo obraditi video, već i zadržati njegovu kvalitetu. To je ono što korisnici sada očekuju od video usluge. Može se činiti da je dovoljno kupiti najproduktivnije poslužitelje (i redovito ih nadograđivati ​​sve odjednom). Ali ovo je slijepa ulica, jer uvijek postoji video koji će usporiti i najjači hardver.

Paralelno kodiranje

Mnogo je učinkovitije složeni problem podijeliti na mnogo manje složenih i rješavati ih paralelno na različitim poslužiteljima. Ovo je MapReduce za video. U ovom slučaju nismo ograničeni performansama jednog poslužitelja i možemo horizontalno skalirati (dodavanjem novih strojeva).

Usput, ideja o dijeljenju videa na male dijelove, njihovoj paralelnoj obradi i lijepljenju nije neka tajna. Možete pronaći mnoge reference na ovaj pristup (na primjer, na Habréu preporučujem post o projektu DistVIDc). Ali to općenito ne čini ništa lakšim, jer ne možete samo uzeti gotovo rješenje i ugraditi ga u svoj dom. Potrebna nam je prilagodba našoj infrastrukturi, našem videu, pa čak i našem opterećenju. Općenito, lakše je napisati svoje.

Tako smo u novoj arhitekturi monolitni Worker blok sa sekvencijalnim kodiranjem podijelili na mikroservise Segmenter, Tcoder, Combiner.

Kako smo ubrzali video kodiranje za osam puta

  1. Segmentator rastavlja video na fragmente od otprilike 10 sekundi. Fragmenti se sastoje od jednog ili više GOP-ova (skupina slika). Svaki GOP je neovisan i zasebno kodiran tako da se može dekodirati bez pozivanja na okvire iz drugih GOP-ova. Odnosno, fragmenti se mogu reproducirati neovisno jedan o drugom. Ovo dijeljenje smanjuje kašnjenje, omogućujući da obrada započne ranije.
  2. Tcoder obrađuje svaki fragment. Uzima zadatak iz reda čekanja, preuzima fragment iz pohrane, kodira ga u različite rezolucije (ne zaboravite da igrač može odabrati verziju na temelju brzine veze), zatim vraća rezultat natrag u pohranu i označava fragment kao obrađen u bazi podataka. Nakon što je obradio sve fragmente, Tcoder šalje zadatak za generiranje rezultata za sljedeću komponentu.
  3. Combiner skuplja rezultate zajedno: preuzima sve fragmente koje je izradio Tcoder, generira streamove za različite rezolucije.

Nekoliko riječi o zvuku. Najpopularniji AAC audio kodek ima neugodnu značajku. Ako kodirate fragmente odvojeno, jednostavno ih nećete moći neprimjetno zalijepiti. Prijelazi će biti primjetni. Video kodeci nemaju ovaj problem. Teoretski, možete potražiti složeno tehničko rješenje, ali ova igra jednostavno još nije vrijedna svijeća (audio teži znatno manje od videa). Stoga se samo video kodira paralelno, a cijeli audio zapis se obrađuje.

Nalazi

Zahvaljujući paralelnoj obradi videozapisa, znatno smo smanjili kašnjenje između prijenosa videozapisa nama i dostupnosti korisnicima. Na primjer, prije je moglo biti potrebno dva sata za stvaranje nekoliko punih verzija različite kvalitete za FullHD film koji traje sat i pol. Sada sve ovo traje 15 minuta. Štoviše, s paralelnom obradom, stvaramo verziju visoke razlučivosti čak i brže nego verziju niske razlučivosti sa starim pristupom srednjeg rezultata.

I još jedna stvar. Sa starim pristupom ili nije bilo dovoljno poslužitelja ili su bili u stanju mirovanja bez zadataka. Paralelno kodiranje omogućuje vam povećanje udjela recikliranja željeza. Sada je naš klaster od više od tisuću poslužitelja uvijek zauzet nečim.

Zapravo, još ima prostora za napredak. Na primjer, možemo značajno uštedjeti vrijeme ako počnemo obrađivati ​​fragmente videa prije nego što nam on stigne u cijelosti. Kako kažu, još će doći.

U komentarima napišite o kojim zadacima iz područja rada s videom želite čitati.

Korisne poveznice na iskustva kolega iz industrije

Izvor: www.habr.com

Dodajte komentar