Prvi dio:
Kaj? Videokodek je deo softverskog/hardverskog sistema koji kompresuje i/ili dekompresuje digitalni video.
Zašto? I pored određenih ograničenja u propusnosti i prostoru za skladištenje podataka, tržište zahteva sve kvalitetniji video. Sećate se kako smo u prošlom postu izračunali minimalne zahteve za 30 frejmova u sekundi, 24 bita po pikselu, sa rezolucijom 480×240? To nam je dalo 82,944 Mbit/s bez kompresije. Kompresija je trenutno jedini način da se prenose HD/FullHD/4K sadržaji na televizorima i internetu. Kako se to postiže? Sada ćemo ukratko razmotriti osnovne metode.
Bavimo se
Prevod je urađen uz podršku kompanije EDISON Software.integracijom sistema video nadzora , kao i .
Česta greška početnika je mešanje kodeka digitalnog videa i kontejnera digitalnog videa. Kontejner je neki format, omotač koji sadrži metapodatke videa (i možda audio). Kompresovani video se može posmatrati kao korisni teret kontejnera.
Obično ekstenzija video fajla označava njegovu vrstu kontejnera. Na primer, fajl video.mp4 je verovatno kontejner
MPEG-4 Part 14 , a fajl pod nazivom video.mkv verovatno jematrioška Pre nego što pređemo na ili .
Nekaj zgodovine
, hajde da se malo vratimo u istoriju kako bismo bolje razumeli neke stare kodeke. Kako?Videokodek
H.261 se pojavio 1990. godine (tehnički 1988) i bio je napravljen za rad na brzini prenosa od 64 Kbit/s. Koristile su se ideje kao što su supdiskretizacija boje, makroblokovi itd. Godine 1995. objavljen je standard videokodeka H.263 , koji se razvijao do 2001. godine.Godine 2003. završena je prva verzija
H.264/AVC. Te godine kompanija „TrueMotion“ je izdala svoj besplatni videokodek koji kompresuje video sa gubicima pod nazivomVP3. Godine 2008. Google je kupio ovu kompaniju i izdaoVP8 iste godine. U decembru 2012. Google je izdao , i podržava ga otprilike ¾ tržišta pretraživača (uključujući mobilne uređaje). VP9to je novi besplatni videokodek sa otvorenim izvorom, razvijen
AV1 Alijansom za otvorene medije. Альянсом за открытые медиа (AOMedia), ki ga sestavljajo znana podjetja, kot so: Google, Mozilla, Microsoft, Amazon, Netflix, AMD, ARM, NVidia, Intel in Cisco. Prva različica kodeka 0.1.0 je bila objavljena 7. aprila 2016.
Rojstvo AV1
Na začetku leta 2015 je Google delal na VP10, Xiph (ki pripada Mozilli) je delal na Daala, Cisco pa je ustvaril svoj brezplačni video kodek, imenovan Thor.
Then MPEG LA je najprej napovedal letne omejitve za HEVC (H.265) in ceno, ki je bila 8-krat višja kot za H.264, a so kmalu spet spremenili pravila:
brez letne omejitve,
cene za vsebino (0,5% od prihodkov) in
cene na enoto, ki so bile približno 10-krat višje kot za H.264.
Zavezništvo za odprte medije je bilo ustanovljeno s strani podjetij iz različnih sektorjev: proizvajalci opreme (Intel, AMD, ARM, Nvidia, Cisco), dobavitelji vsebine (Google, Netflix, Amazon), ustvarjalci brskalnikov (Google, Mozilla) in drugi.
Podjetja so imela skupen cilj — video kodek brez licenčnin. Nato se pojavi AV1 z veliko preprostejšim patentnim licenčnim sistemom. Timothy B. Terriberry je predstavil osupljivo predstavitev, ki je postala vir trenutne zasnove AV1 in njenega modela licenciranja.
Presenetilo vas bo, da lahko analiziraš kodek AV1 prek brskalnika (tisti, ki jih zanima, lahko obiščejo).

Univerzalni kodek
Razdelimo osnovne mehanizme, ki ležijo v ozadju univerzalnega video kodeka. Večina teh konceptov je uporabnih in se uporablja v sodobnih kodekih, kot je VP9, AV1 in HEVC. Opozarjam, da bodo mnoge razložene stvari poenostavljene. Včasih bodo uporabljeni dejanski primeri (kot v primeru H.264) za prikaz tehnologij.
1. korak — razdelitev slike
Prvi korak je razdelitev okvira na več delov, poddelov in tako naprej.

Zakaj? Obstaja več razlogov. Ko razdelimo sliko, lahko natančneje napovemo vektor gibanja, pri tem pa uporabimo majhne dele za majhne gibajoče se dele. Medtem pa lahko za statično ozadje uporabimo tudi večje dele.
Običajno kodeki organizirajo te dele v sekcije (ali fragmente), makrobloke (ali bloke drevesne kode) in več poddelov. Največja velikost teh delov se razlikuje; HEVC določa 64×64, medtem ko AVC uporablja 16×16, poddelki pa se lahko delijo do velikosti 4×4.
Spomínate si na rôzne druhy snímok z predchádzajúceho článku?! Môže sa to aplikovať aj na bloky, takže môžeme mať I-fragment, B-blok, P-makroblok atď.
Pre záujemcov o prax — pozrite sa, ako sa obrázok rozdelí na sekcie a podsekcie. Na tento účel môžete využiť už spomínané z predchádzajúceho článku. (ten, ktorý je platený, ale s bezplatnou skúšobnou verziou s obmedzením na prvých 10 snímok). Tu sú analyzované sekcie. VP9:

2. krok — predikcia.
Akonáhle máme sekcie, môžeme zostaviť astrologické predpovede na ich základe. Pre INTER-predikciu je potrebné preniesť vektory pohybu a zostatok, a pre INTRA-predikciu sa prenáša smer predpovede a zostatok.
3. krok — transformácia.
Akonáhle získame zostatkový blok (predpokladaná sekcia → skutočná sekcia), je možné ho transformovať tak, aby sme vedeli, ktoré pixely môžeme vyhodiť, pričom zachováme celkovú kvalitu. Existujú niektoré transformácie, ktoré zabezpečujú presné správanie.
Aj keď sú aj iné metódy, podrobnejšie sa pozrime na diskrétnu kosínusovú transformáciu (DCT — od discrete cosine transform). Hlavné funkcie DCT:
- Transformuje bloky pixelov na bloky frekvenčných koeficientov rovnakej veľkosti.
- Kompresuje moc, pomáha odstraňovať priestorovú nadbytočnosť.
- Zabezpečuje reverzibilitu.
2. februára 2017 Cintra R.J. a Bayer F.M. publikovali článok o DCT-podobnej transformácii na kompresiu obrázkov, ktorá vyžaduje len 14 doplnkov.
Nebojte sa, ak ste nepochopili výhody každého bodu. Teraz si to na konkrétnych príkladoch ukážeme v ich reálnej hodnote.
Poďme si vziať taký blok pixelov 8×8:

Tento blok sa zobrazuje ako nasledujúci obrázok 8 na 8 pixelov:

Aplikujme DCT na tento blok pixelov a dostaneme blok koeficientov o veľkosti 8×8:

A ak tento blok koeficientov zobrazíme, dostaneme takýto obrázok:

Ako vidíme, to nie je podobné pôvodnému obrázku. Môžeme si všimnúť, že prvý koeficient sa výrazne líši od všetkých ostatných. Tento prvý koeficient je známy ako DC-koeficient, predstavujúci všetky vzorky v vstupnom poli, niečo ako priemerná hodnota.
Ta blok koeficientov ima zanimivo lastnost: ločuje visoko frekvenčne komponente od nizkofrekvenčnih.

Na sliki je večina moči skoncentrirana na nižjih frekvencah, zato, če transformiramo sliko v njene frekvenčne komponente in zavržemo višje koeficiente, lahko zmanjšamo količino podatkov, potrebnih za opis slike, ne da bi preveč žrtvovali kakovost slike.
Frekvenca pomeni, kako hitro se signal spreminja.
Poskusimo uporabiti znanje pridobljeno v testnem primeru, tako da pretvorimo izvirno sliko v njeno frekvenco (blok koeficientov), uporabimo DCT in zavržemo del najmanj pomembnih koeficientov.
Najprej jo pretvorimo v frekvenčno območje.

Nato zavržemo del (67%) koeficientov, predvsem spodnjega desnega dela.

Nazadnje obnovimo sliko iz tega zavrženega bloka koeficientov (ne pozabite, da mora biti obratna) in jo primerjamo z izvirnikom.

Vidimo, da spominja na izvirno sliko, a so številne razlike od izvirnika. Zavrgli smo 67,1875% in kljub temu dobili nekaj, kar spominja na prvotno. Lahko bi bolj premišljeno zavrgli koeficiente, da bi dobili sliko še boljše kakovosti, a to je že naslednja tema.
Vsak koeficient se oblikuje z uporabo vseh pikslov
Pomembno: vsak koeficient se neposredno ne nanaša na en pixel, ampak predstavlja uteženo vsoto vseh pikslov. Ta osupljiv grafikon prikazuje, kako se izračunata prvi in drugi koeficient z uporabo uteži, edinstvenih za vsak indeks.
Prav tako lahko poskusite vizualizirati DCT, tako da pogledate preprosto oblikovanje slike na njegovi osnovi. Na primer, tukaj je simbol A, oblikovan z uporabo vsake uteži koeficienta:
4. korak — kvantizacija
Potem ko v prejšnjem koraku zavržemo nekatere koeficiente, v zadnjem koraku (transformacija) izvedemo posebno obliko kvantizacije. V tej fazi je dovoljeno izgubljati podatke. Ali, bolj preprosto povedano, kvantizirali bomo koeficiente za dosego kompresije.
Kako možemo kvantizirati blok koeficijenata? Jedna od najjednostavnijih metoda je uniformno kvantiziranje, kada uzimamo blok, dijelimo ga s jednim vrijednostima (sa 10) i zaokružujemo ono što smo dobili.

Možemo li obrnuti ovaj blok koeficijenata? Da, možemo, množenjem s istom vrijednošću kojom smo dijelili.

Ovaj pristup nije najbolji, jer ne uzima u obzir važnost svakog koeficijenta. Mogli bismo koristiti matricu kvantizatora umjesto jedne vrijednosti, a ta matrica može koristiti svojstvo DCT, kvantizirajući većinu donjih desnih i mali broj gornjih lijevih koeficijenata.
5. korak — entropijsko kodiranje
Nakon što smo kvantizirali podatke (blokove slika, fragmente, okvire), još uvijek možemo komprimirati bez gubitaka. Postoji mnogo algoritamskih načina za kompresiju podataka. Ovdje ćemo se kratko upoznati s nekima od njih; za dublje razumijevanje možete pročitati knjigu «Razumijevanje kompresije: kompresija podataka za moderne programere» (»).
Kodiranje videa pomoću VLC-a
Pretpostavimo da imamo tok simbola: a, e, r in t. Vjerojatnost (u rasponu od 0 do 1) kako se često pojavljuje svaki simbol u toku, predstavljena je u ovoj tablici.
| a | e | r | t | |
|---|---|---|---|---|
| Vjerojatnost | 0,3 | 0,3 | 0,2 | 0,2 |
Možemo dodijeliti jedinstvene binarne kodove (poželjno male) najvjerojatnijim simbolima, a veće kodove — manje vjerojatnim.
| a | e | r | t | |
|---|---|---|---|---|
| Vjerojatnost | 0,3 | 0,3 | 0,2 | 0,2 |
| Binarni kod | 0 | 10 | 110 | 1110 |
Kompresiramo tok, pretpostavljajući da ćemo na kraju potrošiti 8 bita za svaki simbol. Bez kompresije, svaki simbol bi zahtijevao 24 bita. Ako svaki simbol zamijenimo njegovim kodom, dolazimo do uštede!
Prvi korak je kodiranje simbola e, koji je 10, a drugi simbol je a, koji se dodaje (ne matematičkim putem): [10] [0], i konačno, treći simbol t, koji čini naš konačni komprimirani bitni tok jednak [10] [0] [1110] ili 1001110, za što treba samo 7 bitova (3,4 puta manje prostora nego u originalu).
Imajte na umu da svaki kod mora biti jedinstveni prefiksni kod. pomoći će pronaći ove brojeve. Iako ovaj način nije bez nedostataka, postoje video kodeci koji još uvijek nude ovu algoritamsku metodu za kompresiju.
Tako kodirnik kot dekodirnik morata imeti dostop do tabele znakov s svojimi binarnimi kodami. Zato je potrebno poslati tudi tabelo v vhodnih podatkih.
Aritmetično kodiranje
Pretpostavimo da imamo tok simbola: a, e, r, s in t, in njihova verjetnost je predstavljena s to tabelo.
| a | e | r | s | t | |
|---|---|---|---|---|---|
| Vjerojatnost | 0,3 | 0,3 | 0,15 | 0,05 | 0,2 |
S to tabelo bomo zgradili razpone, ki vsebujejo vse možne simbole, razvrščene po največjem številu.

Zdaj bomo kodirali tok treh simbolov: eat.
Najprej izberemo prvi simbol e, ki se nahaja v podrazponu od 0,3 do 0,6 (brez vključitve). Vzamemo ta podrazpon in ga znova razdelimo v istih razmerjih kot prej, vendar že za ta nov razpon.

Nadaljujmo z kodiranjem našega toka eat. Zdaj vzamemo drugi simbol a, ki se nahaja v novem podrazponu od 0,3 do 0,39, nato pa vzamemo naš zadnji simbol t in, ponavljajoč isti postopek, dobimo zadnji podrazpon od 0,354 do 0,372.

Preprosto moramo izbrati število v zadnjem podrazponu od 0,354 do 0,372. Izberimo 0,36 (ampak lahko izberete tudi katero koli drugo število v tem podrazponu). Samo s tem številom lahko obnovimo naš izvirni tok. To je tako, kot da bi risali črto znotraj razponov za kodiranje našega toka.

Obratna operacija (torej dekodiranje) je prav tako preprosta: z našim številom 0,36 in našim izvirnim razponom lahko ponovno izvedemo isti postopek. Ampak zdaj, z uporabo tega števila, odkrijemo tok, kodiran s tem številom.
Pri prvem razponu opazimo, da naše število ustreza rezanju, zato je to naš prvi simbol. Zdaj ponovno delimo ta podrazpon, izvajamo isti postopek kot prej. Tukaj lahko opazimo, da 0,36 ustreza simbolu a, in po ponovitvi postopka smo prišli do zadnjega simbola t (oblikujemo naš izvorni kodiran tok eat).
Za kodirnika in dekodirnika mora biti na voljo tabela verjetnosti simbolov, zato je potrebno v vhodnih podatkih poslati tudi njo.
Dokaj elegantno, mar ne? Nekdo, ki je to rešitev izumil, je bil zares pameten. Nekatere video kodeke uporabljajo to tehniko (ali vsaj ponujajo kot opcijo).
Ideja je stisnuti kvantizirani bitni tok bez gubitaka. Sigurno u ovom članku nedostaje mnoštvo detalja, razloga, kompromisa itd. No, ako ste programer, trebali biste znati više. Novi kodeci pokušavaju primijeniti različite algoritme entropijskog kodiranja, poput ANS.
6. korak — format bitnog toka
Nakon što ste sve to učinili, preostaje samo raspakirati komprimirane okvire u kontekstu izvršenih koraka. Potrebno je izričito obavijestiti dekoder o odlukama koje je donio kodera. Dekoderu se mora dati sve potrebne informacije: dubina bita, boja, razlučivost, informacije o predikciji (vektori kretanja, usmjerena INTER-predikcija), profil, razina, frekvencija okvira, tip okvira, broj okvira i još mnogo toga.
Površno ćemo se upoznati s bitnim tokom H.264. Naš prvi korak je izrada minimalnog bitnog toka H.264 (FFmpeg po defaultu dodaje sve parametre kodiranja, poput SEI NAL — malo kasnije ćemo saznati što to znači). To možemo učiniti koristeći naš vlastiti repozitorij i FFmpeg.
./s/ffmpeg -i /files/i/minimal.png -pix_fmt yuv420p /files/v/minimal_yuv420.h264
Ova naredba generirat će neobrađeni bitni tok H.264 s jednim okvirom, razlučivosti 64×64, s bojom YUV420. Kao okvir koristi se sljedeća slika.

Bitni tok H.264
Standard AVC (H.264) definira da će informacije biti slane u makro-OKVIRIMA (u mrežnom smislu), nazvanim NAL (to je takva razina apstrakcije u mreži). Glavni cilj NAL-a je pružiti 'umreženo prijateljsko' prikazivanje videa. Ovaj standard bi trebao raditi na televizorima (na osnovu tokova), na internetu (na osnovu paketa).
![]()
Postoji marker sinhronizacije za određivanje granica NAL elemenata. Svaki marker sinhronizacije sadrži vrijednost 0x00 0x00 0x01, osim prve, koja je jednaka 0x00 0x00 0x00 0x01. Ako pokrenemo hexdump za generirani bitni tok H.264, identificirat ćemo barem tri NAL uzorka na početku datoteke.

Kao što je rečeno, dekoder mora znati ne samo podatke o slici, već i detalje videa, okvira, boje, korištene parametre i još mnogo toga. Prvi bajt svakog NAL-a određuje njegovu kategoriju i tip.
| Identifikator tipa NAL | Opis |
|---|---|
| 0 | Nepoznat tip |
| 1 | Kodirani fragment slike bez IDR |
| 2 | Kodirani razdel podataka sreza A |
| 3 | Kodirani razdel podataka sreza B |
| 4 | Kodirani razdel podataka sreza C |
| 5 | Kodirani IDR-fragment IDR-slike |
| 6 | Dodatne informacije o proširenju SEI |
| 7 | Skup parametara SPS-sekvencije |
| 8 | Skup parametara PPS-slike |
| 9 | Razdelnik pristupa |
| 10 | Kraj sekvence |
| 11 | Kraj toka |
| … | … |
Obično je prvi NAL bit streama SPS. Ova vrsta NAL-a odgovara za obaveštavanje o opštim varijablama kodiranja, kao što su profil, nivo, rezolucija i drugo.
Ako preskočimo prvi marker sinhronizacije, možemo dekodirati prvi bajt da saznamo koji tip NAL je prvi.
Na primer, prvi bajt posle markera sinhronizacije iznosi 01100111, gde je prvi bit (0) u polju forbidden_zero_bit. Sledeća 2 bita (11) nam govore o polju nal_ref_idc, koje ukazuje da li je ovaj NAL referentno polje ili ne. I ostatnih 5 bita (00111) nam govore o polju nal_unit_type, u ovom slučaju to je blok SPS (7) NAL.
Drugi bajt (binarno=01100100, heks=0x64, dec=100) u SPS NAL-ju je polje profile_idc, koje pokazuje profil koji je koristio kodirnik. U ovom slučaju korišćen je ograničeni visoki profil (tj. visoki profil bez podrške za dvostrani B-segment).

Ako se upoznate sa specifikacijom bitnog toka H.264 za SPS NAL, otkrićete mnogo vrednosti za ime parametra, kategoriju i opis. Na primer, hajde da pogledamo polja pic_width_in_mbs_minus_1 in pic_height_in_map_units_minus_1.
| Ime parametra | Kategorija | Opis |
|---|---|---|
| pic_width_in_mbs_minus_1 | 0 | ue(v) |
| pic_height_in_map_units_minus_1 | 0 | ue(v) |
Ako izvršite neke matematičke operacije sa vrednostima tih polja, dobićete rezoluciju. Može se predstaviti 1920 x 1080 koristeći pic_width_in_mbs_minus_1 sa vrednošću 119 ((119 + 1) * macroblock_size = 120 * 16 = 1920). Ponovo, štedeći prostor, umesto kodiranja 1920, učinili su to sa 119.
Ako nastavite sa proverom našeg kreiranog videa u binarnom obliku (na primer: xxd -b -c 11 v/minimal_yuv420.h264), možete preći na poslednji NAL, koji je sam kadar.

Ovde vidimo njegovih prvih 6 bajtnih vrednosti: 01100101 10001000 10000100 00000000 00100001 11111111. Pošto je poznato da prvi bajt ukazuje na tip NAL, u ovom slučaju (00101) to je IDR fragment (5), i tada će se dodatno istražiti:

Koristeći informacije iz specifikacije, može se dekodirati tip fragmenta (slice_type) i broj kadra (frame_num) među drugim važnim poljima.
Da bismo dobili vrednosti nekih polja (ue(v), me(v), se(v) nebo te(v), potrebno je dekodirati fragment koristeći poseban dekoder zasnovan na . Ta metoda je zelo učinkovita za kodiranje vrednosti spremenljivk, zlasti kadar je veliko privzetih vrednosti.
Vrednosti slice_type in frame_num ta videoposnetka sta enaka 7 (I-del) in 0 (prvi okvir).
Bitni tok lahko razumemo kot protokol. Če želite izvedeti več o bitnem toku, se posvetujte s specifikacijo ITU H.264. Tukaj je maketa, ki prikazuje, kje se nahajajo podatki o sliki (YUV v stisnjeni obliki).

Lahko raziskujete tudi druge bitne tokove, kot so VP9, H.265 (HEVC) ali celo naš nov najboljši bitni tok AV1. Ali so vsi podobni? Ne, toda razumeti vsaj enega — olajša razumevanje ostalih.
Želite vaditi? Raziščite bitni tok H.264
Lahko ustvarite enokadro video in uporabite MediaInfo za raziskovanje bitnega toka H.264. Dejstvo je, da vam nič ne preprečuje niti ogleda izvorne kode, ki analizira bitni tok H.264 (AVC).
Za vajo lahko uporabite Intel Video Pro Analyzer (že sem omenil, da je program plačljiv, ampak obstaja brezplačna preskusna različica s omejitvijo na 10 okvirjev?).
Pregled
Opomnimo, da mnogi sodobni kodeki uporabljajo isto model, ki smo ga pravkar preučili. Poglejmo shemo video kodeka Thor. Vsebuje vse korake, ki smo jih prehodili. Celotna poanta te opombe je ta, da bi vsaj bolje razumeli inovacije in dokumentacijo na tem področju.

Prej smo izračunali, da bi potrebovali 139 GB prostora na disku za shranjevanje vide datoteke, dolge eno uro pri kakovosti 720p in 30 fps. Če uporabimo metode, ki smo jih razpravljali v tem članku (medokvirne in notranje napovedi, transformacija, kvantizacija, entropijsko kodiranje itd.), lahko dosežemo (ob predpostavki, da porabimo 0,031 bitov na piksel) videoposnetek povsem zadovoljive kakovosti, ki zavzame le 367,82 MB, namesto 139 GB pomnilnika.
Kako H.265 doseže boljše stiskanje kot H.264?
Zdaj, ko je znanega več o tem, kako delujejo kodeki, je lažje razumeti, kako novi kodeki lahko zagotavljajo višjo resolucijo z manjšim številom bitov.
Če primerjamo AVC in HEVC, je treba upoštevati, da gre skoraj vedno za izbiro med večjim obremenitvijo CPU in stopnjo stiskanja.
HEVC ima več možnosti razdelkov (in podrazdelkov) kot AVC, več smeri notranje napovedi, izboljšano kodiranje entropije in še veliko več. Vse te izboljšave so omogočile H.265 stiskanje za 50 % več, kot H.264.

Prvi dio:
Izvor: habr.com




