Kako smo ubrzali kodiranje videa za osam puta

Kako smo ubrzali kodiranje videa za osam puta

Svaki dan milioni gledalaca gledaju video zapise na internetu. Ali da bi video postao dostupan, ne samo da mora biti postavljen na server, već i obrađen. Što se to brže dogodi, to bolje za uslugu i njene korisnike.

Moje ime je Askar Kamalov, prije godinu dana sam se pridružio Yandex video tehnološkom timu. Danas ću ukratko ispričati čitateljima Habra kako smo, paralelizirajući proces kodiranja, uspjeli značajno ubrzati isporuku videa korisniku.

Ovaj post će prvenstveno zanimati one koji ranije nisu razmišljali o tome šta se dešava 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 da tražite video zapise na drugim web lokacijama, već i pohranjuje video zapise za svoje usluge. Bilo da se radi o originalnom programu ili sportskoj utakmici u eteru, filmu na KinoPoisk-u ili video zapisima na Zen i News - sve se to prenosi na naše servere. Da bi korisnici mogli pogledati video, potrebno ga je pripremiti: konvertirati u traženi format, napraviti pregled ili čak proći kroz tehnologiju DeepHD. Nepripremljena datoteka samo zauzima prostor. Štaviše, ne govorimo samo o optimalnom korišćenju hardvera, već i o brzini isporuke sadržaja korisnicima. Primjer: snimak odlučujućeg trenutka hokejaške utakmice može se tražiti u roku od jednog minuta nakon samog događaja.

Sekvencijalno kodiranje

Dakle, sreća korisnika umnogome zavisi od toga koliko brzo video postane dostupan. A to je uglavnom određeno brzinom transkodiranja. Kada ne postoje strogi zahtjevi za brzinu učitavanja videa, onda nema problema. Uzimate jednu, nedjeljivu datoteku, pretvarate je i otpremate. Na početku našeg putovanja, ovako smo radili:

Kako smo ubrzali kodiranje videa za osam puta

Klijent učitava video u skladište, komponenta Analyzer prikuplja meta informacije i prenosi video na Worker komponentu radi konverzije. Sve faze se izvode uzastopno. U ovom slučaju može postojati mnogo servera za kodiranje, ali samo jedan je zauzet obradom određenog videa. Jednostavan, transparentan dijagram. Tu prestaju njegove prednosti. Ova šema se može skalirati samo okomito (zbog kupovine moćnijih servera).

Sekvencijalno kodiranje sa srednjim rezultatom

Kako bi nekako izgladila bolno čekanje, industrija je osmislila opciju brzog kodiranja. Naziv je pogrešan, jer se u stvari, potpuno kodiranje događa uzastopno i traje isto toliko. Ali sa srednjim rezultatom. Ideja je sljedeća: pripremite i objavite verziju videa u nižoj rezoluciji što je prije moguće, a tek onda verzije u većoj rezoluciji.

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

Ispostavilo se 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 servere (i redovno ih nadograđivati ​​odjednom). Ali ovo je ćorsokak, jer uvijek postoji video koji će usporiti čak i najmoćniji hardver.

Paralelno kodiranje

Mnogo je efikasnije složen problem podijeliti na mnogo manje složenih i rješavati ih paralelno na različitim serverima. Ovo je MapReduce za video. U ovom slučaju, nismo ograničeni performansama jednog servera i možemo horizontalno skalirati (dodavanjem novih mašina).

Inače, ideja o cijepanju videa na male komadiće, 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 generalno ne čini lakšim, jer ne možete samo uzeti gotovo rješenje i ugraditi ga u svoj dom. Potrebna nam je adaptacija na našu infrastrukturu, naš video, pa čak i naše opterećenje. Općenito, lakše je napisati svoje.

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

Kako smo ubrzali kodiranje videa za osam puta

  1. Segmenter razbija video na fragmente od otprilike 10 sekundi. Fragmenti se sastoje od jednog ili više GOP-ova (grupa slika). Svaki GOP je nezavisan i kodiran zasebno tako da se može dekodirati bez pozivanja na okvire iz drugih GOP-ova. To jest, fragmenti se mogu reprodukovati nezavisno jedan od drugog. Ovo dijeljenje smanjuje kašnjenje, omogućavajući da obrada počne ranije.
  2. Tcoder obrađuje svaki fragment. Uzima zadatak iz reda čekanja, preuzima fragment iz skladišta, kodira ga u različite rezolucije (zapamtite da igrač može odabrati verziju na osnovu brzine veze), zatim vraća rezultat u memoriju i označava fragment kao obrađen. u bazi podataka. Nakon obrade svih fragmenata, Tcoder šalje zadatak da generiše rezultate za sljedeću komponentu.
  3. Combiner zajedno prikuplja rezultate: preuzima sve fragmente koje je napravio Tcoder, generiše streamove za različite rezolucije.

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

Rezulʹtaty

Zahvaljujući paralelnoj obradi video zapisa, značajno smo smanjili kašnjenje između video zapisa koji nam je postavljen i dostupan korisnicima. Na primjer, ranije je moglo potrajati dva sata za stvaranje nekoliko punih verzija različitog kvaliteta za FullHD film u trajanju od sat i po. Sada sve ovo traje 15 minuta. Štaviše, uz paralelnu obradu, kreiramo verziju visoke rezolucije čak i brže od verzije niske rezolucije sa starim pristupom srednjeg rezultata.

I još nešto. Sa starim pristupom, ili nije bilo dovoljno servera, ili su mirovali bez zadataka. Paralelno kodiranje vam omogućava da povećate udio recikliranja željeza. Sada je naš klaster od više od hiljadu servera uvijek zauzet nečim.

U stvari, još uvijek ima prostora za poboljšanje. Na primjer, možemo značajno uštedjeti vrijeme ako počnemo obraditi fragmente videa prije nego što nam stigne u cijelosti. Kako kažu, slijedi još.

Napišite u komentarima o kojim zadacima iz oblasti rada sa videom želite da čitate.

Korisni linkovi do iskustava kolega iz industrije

izvor: www.habr.com

Dodajte komentar