Del ett:
Vad? En videokodek Àr en programvara/hÄrdvara som komprimerar och/eller dekomprimerar digital video.
För vad? Trots vissa begrÀnsningar bÄde vad gÀller bandbredd och
och nĂ€r det gĂ€ller lagringsutrymme krĂ€ver marknaden alltmer högkvalitativ video. Kommer du ihĂ„g hur vi i förra inlĂ€gget berĂ€knade det nödvĂ€ndiga minimumet för 30 bilder per sekund, 24 bitar per pixel, med en upplösning pĂ„ 480Ă240? Vi fick 82,944 Mbps utan komprimering. Komprimering Ă€r för nĂ€rvarande det enda sĂ€ttet att överföra HD/FullHD/4K till TV-skĂ€rmar och internet. Hur uppnĂ„s detta? LĂ„t oss nu kortfattat titta pĂ„ de viktigaste metoderna.
ĂversĂ€ttningen gjordes med stöd av EDISON Software.Vi Ă€r engagerade i Och .
Codec vs. behÄllare
Ett vanligt misstag nybörjare gör Àr att förvÀxla en digital videokodek med en digital videobehÄllare. En behÄllare Àr ett format. Ett omslag som innehÄller videometadata (och eventuellt ljud). Den komprimerade videon kan betraktas som behÄllarens nyttolast.
Vanligtvis anger en videofils filÀndelse dess containertyp. Till exempel Àr en video.mp4-fil sannolikt en container MPEG-4 del 14, och filen med namnet video.mkv Àr troligtvis För att vara helt sÀker pÄ kodeken och containerformatet kan du anvÀnda eller .
Lite historia
Innan vi gÄr vidare till Hur?, lÄt oss dyka ner i lite historia för att förstÄ nÄgra av de Àldre codecs lite bÀttre.
Video codec H.261 dök upp 1990 (tekniskt sett 1988) och var utformad för att fungera med en dataöverföringshastighet pÄ 64 kbps. Den anvÀnde redan idéer som fÀrgsubsampling, makroblock etc. à r 1995 publicerades videokodekstandarden H.263, som utvecklades fram till 2001.
Den första versionen fĂ€rdigstĂ€lldes 2003. H.264 / AVCSamma Ă„r slĂ€ppte TrueMotion sin gratis förlustbringande videokodek som heter VP3Ă r 2008 köpte Google företaget och slĂ€ppte VP8 samma Ă„r. I december 2012 slĂ€ppte Google VP9, och den stöds av ungefĂ€r Ÿ av webblĂ€sarmarknaden (inklusive mobila enheter).
AV1 Àr en ny gratis och öppen kÀllkodsbaserad videokodek utvecklad av Alliansen för öppna medier (Aomedia), vilket inkluderar sÄ vÀlkÀnda företag som Google, Mozilla, Microsoft, Amazon, Netflix, AMD, ARM, NVidia, Intel och Cisco. Den första versionen av kodeken 0.1.0 publicerades den 7 april 2016.
AV1:s födelse
I början av 2015 arbetade Google med VP10, Xiph (som Àgs av Mozilla) arbetade pÄ daala, och Cisco skapade sin egen gratis videokodek som heter Thor.
dÀrefter MPEG LA först tillkÀnnagivna Ärliga grÀnser för HEVC (H.265) och en avgift 8 gÄnger högre Àn för H.264, men snart Àndrade de reglerna igen:
ingen Ärlig grÀns,
innehÄllsavgift (0,5 % av intÀkterna) och
Kostnaden per enhet Àr ungefÀr 10 gÄnger högre Àn för H.264.
Alliansen för öppna medier skapades av företag frÄn olika omrÄden: utrustningstillverkare (Intel, AMD, ARM, Nvidia, Cisco), innehÄllsleverantörer (Google, Netflix, Amazon), webblÀsarskapare (Google, Mozilla) och andra.
Företagen hade ett gemensamt mÄl: en royaltyfri videokodek. Sedan kom det AV1 med en mycket enklare patentlicens. Timothy B. Terryberry höll en fantastisk presentation som blev kÀllan till det nuvarande AV1-konceptet och dess licensmodell.
Du kommer att bli förvÄnad över att du kan analysera AV1-kodeken via en webblÀsare (de som Àr intresserade kan gÄ till).

Universell kodek
LÄt oss titta pÄ de grundlÀggande mekanismerna som ligger till grund för en universell videokodek. De flesta av dessa koncept Àr anvÀndbara och anvÀnds i moderna kodekar som VP9, AV1 О HEVCVar medveten om att mÄnga saker som förklaras kommer att förenklas. Ibland kommer verkliga exempel att anvÀndas (som i fallet med H.264) för att demonstrera tekniker.
Steg 1 - Dela bilden
Det första steget Àr att dela upp ramen i flera sektioner, underavsnitt och sÄ vidare.

Varför? Det finns mÄnga anledningar. NÀr vi delar upp bilden kan vi mer exakt förutsÀga rörelsevektorn genom att anvÀnda smÄ sektioner för smÄ rörliga delar. Medan vi för en statisk bakgrund kan begrÀnsa oss till större sektioner.
Codecs organiserar vanligtvis dessa avsnitt i sektioner (eller fragment), makroblock (eller kodningstrÀdblock) och flera underavsnitt. Den maximala storleken pÄ dessa avsnitt varierar, dÀr HEVC stÀller in den pÄ 64x64 medan AVC anvÀnder 16x16, och underavsnitt kan vara sÄ smÄ som 4x4.
Kommer ni ihÄg ramtyperna frÄn föregÄende artikel?! Detta kan ocksÄ tillÀmpas pÄ block, sÄ vi kan ha ett I-fragment, ett B-block, ett P-makroblock, etc.
För er som vill öva, se hur bilden Àr uppdelad i sektioner och underavsnitt. För detta kan ni anvÀnda den som redan nÀmnts i föregÄende artikel. (den som Àr betald, men som har en gratis provversion som har en begrÀnsning pÄ de första 10 bildrutorna). HÀr Àr de analyserade avsnitten. VP9:

Steg 2 - Prognoser
NÀr vi har sektioner kan vi göra astrologiska prognoser för dem. INTER-prognoser det Àr nödvÀndigt att överföra rörelsevektorer och resten, och för INTRA-prognoser överförs den prognosriktning och resten.
Steg 3 - Transformation
NĂ€r vi vĂ€l har det kvarvarande blocket (förutspĂ„dd partition â verklig partition) Ă€r det möjligt att transformera det pĂ„ ett sĂ„dant sĂ€tt att vi vet vilka pixlar som kan tas bort samtidigt som den övergripande kvaliteten bibehĂ„lls. Det finns vissa transformationer som sĂ€kerstĂ€ller exakt beteende.
Ăven om det finns andra metoder, lĂ„t oss titta pĂ„ dem mer i detalj. diskret cosinustransform (DCT - frĂ„n diskret cosinustransform). DCT:s huvudfunktioner:
- Konverterar block av pixlar till lika stora block med frekvenskoefficienter.
- Komprimerar kraften och hjÀlper till att eliminera rumslig redundans.
- Ger reversibilitet.
Den 2 februari 2017 publicerade Cintra, RJ och Bayer, FM en artikel om en DCT-liknande transformation för bildkomprimering som endast krÀver 14 utfyllnader.
Oroa dig inte om du inte förstÄr fördelarna med varje punkt. Nu ska vi se deras verkliga vÀrde med nÄgra konkreta exempel.
LÄt oss ta ett block med pixlar 8x8 sÄ hÀr:

Detta block renderas till följande 8x8 pixlars bild:

Vi tillĂ€mpar DCT pĂ„ detta block av pixlar och fĂ„r ett block av koefficienter av storleken 8Ă8:

Och om vi renderar detta koefficientblock fÄr vi följande bild:

Som du kan se ser detta inte ut som originalbilden. Du kan se att den första koefficienten skiljer sig mycket frÄn alla de andra. Denna första koefficient kallas DC-koefficienten, som representerar alla samplingar i inmatningsmatrisen, ungefÀr som ett medelvÀrde.
Detta koefficientblock har en intressant egenskap: det separerar högfrekventa komponenter frÄn lÄgfrekventa.

I en bild Àr det mesta av effekten koncentrerad till lÀgre frekvenser, sÄ genom att konvertera bilden till dess frekvenskomponenter och ignorera de högre frekvenskoefficienterna kan man minska mÀngden data som behövs för att beskriva bilden utan att offra för mycket bildkvalitet.
Frekvens avser hur snabbt signalen förÀndras.
LÄt oss försöka tillÀmpa kunskapen frÄn testexemplet genom att omvandla originalbilden till dess frekvens (koefficientblock) med hjÀlp av DCT och sedan ignorera nÄgra av de minst viktiga koefficienterna.
Först omvandlar vi det till frekvensdomÀnen.

DÀrefter ignorerar vi en del (67 %) av koefficienterna, frÀmst den nedre högra delen.

Slutligen rekonstruerar vi bilden frÄn detta kasserade koefficientblock (kom ihÄg att den mÄste vara inverterbar) och jÀmför den med originalet.

Vi ser att den liknar originalbilden, men det finns mÄnga skillnader frÄn originalet. Vi kastade bort 67,1875 % och fick fortfarande nÄgot som liknade originalet. Vi kunde ha kastat bort koefficienterna mer genomtÀnkt för att fÄ en Ànnu bÀttre bild, men det Àr en annan sak.
Varje koefficient bildas med hjÀlp av alla pixlar.
Viktigt: Varje koefficient Àr inte direkt mappad till en enda pixel, utan Àr en viktad summa av alla pixlar. Denna fantastiska graf visar hur den första och andra koefficienten berÀknas med hjÀlp av vikter som Àr unika för varje index.
Du kan ocksÄ försöka visualisera DCT genom att titta pÄ en enkel bildformation baserad pÄ den. Till exempel, hÀr Àr en symbol A som bildas med hjÀlp av varje koefficientvikt:
Steg 4 - Kvantisering
Efter att vi i föregÄende steg har tagit bort nÄgra koefficienter, utför vi i det sista steget (transformation), en speciell form av kvantisering. I detta skede Àr det acceptabelt att förlora information. Eller, enklare sagt, kvantiserar vi koefficienterna för att uppnÄ kompression.
Hur kan man kvantisera ett block av koefficienter? En av de enklaste metoderna Àr likformig kvantisering, dÀr man tar ett block, dividerar det med ett vÀrde (med 10) och avrundar resultatet.

Kan vi invertera detta koefficientblock? Ja, det kan vi, genom att multiplicera med samma vÀrde som vi dividerade med.

Denna metod Àr inte den bÀsta eftersom den inte tar hÀnsyn till vikten av varje koefficient. Man skulle kunna anvÀnda en matris av kvantiserare istÀllet för ett enda vÀrde, och denna matris kan anvÀnda egenskapen hos den dubbla koefficienten (DCT), vilket kvantiserar majoriteten av det nedre högra partiet och minoriteten av det övre vÀnstra partiet.
Steg 5 - Entropikodning
NÀr vi vÀl har kvantiserat data (bildblock, bitar, bildrutor) kan vi fortfarande komprimera den förlustfritt. Det finns mÄnga algoritmiska sÀtt att komprimera data. Vi kommer kortfattat att presentera nÄgra av dem. För en djupare förstÄelse kan du lÀsa boken "Understanding Compression: Data Compression for Modern Developers" (").
Koda videor med VLC
LÄt oss anta att vi har en ström av tecken: a, e, r О tSannolikheten (mellan 0 och 1) för hur ofta varje symbol förekommer i strömmen presenteras i den hÀr tabellen.
| a | e | r | t | |
|---|---|---|---|---|
| sannolikhet | 0,3 | 0,3 | 0,2 | 0,2 |
Vi kan tilldela unika binÀra koder (helst smÄ) till de mest sannolika, och större koder till de mindre sannolika.
| a | e | r | t | |
|---|---|---|---|---|
| sannolikhet | 0,3 | 0,3 | 0,2 | 0,2 |
| BinÀr kod | 0 | 10 | 110 | 1110 |
Vi komprimerar strömmen, förutsatt att vi i slutÀndan kommer att spendera 8 bitar pÄ varje symbol. Utan komprimering skulle det behövas 24 bitar per symbol. Om varje symbol ersÀtts med sin kod fÄr vi besparingar!
Det första steget Àr att koda symbolen e, vilket Àr 10, och den andra symbolen Àr a, vilket lÀggs till (inte matematiskt): [10] [0], och slutligen det tredje tecknet t, vilket gör vÄr slutliga komprimerade bitström lika med [10] [0] [1110] eller 1001110, vilket bara krÀver 7 bitar (3,4 gÄnger mindre utrymme Àn originalet).
Observera att varje kod mĂ„ste vara en unik kod med ett prefix. hjĂ€lper dig att hitta dessa siffror. Ăven om den hĂ€r metoden inte Ă€r utan sina brister, finns det videokodekar som fortfarande erbjuder denna algoritmiska metod för komprimering.
BÄde kodaren och avkodaren mÄste ha tillgÄng till symboltabellen med sina binÀra koder. DÀrför mÄste tabellen ocksÄ skickas med i indata.
Aritmetisk kodning
LÄt oss anta att vi har en ström av tecken: a, e, r, s О t, och deras sannolikhet presenteras i denna tabell.
| a | e | r | s | t | |
|---|---|---|---|---|---|
| sannolikhet | 0,3 | 0,3 | 0,15 | 0,05 | 0,2 |
Med den hÀr tabellen konstruerar vi intervall som innehÄller alla möjliga symboler, sorterade efter största tal.

Nu ska vi koda en ström av tre symboler: Àt.
VÀlj först det första tecknet e, vilket ligger i delintervallet frÄn 0,3 till 0,6 (exklusive). Vi tar detta delintervall och delar det igen i samma proportioner som tidigare, men för detta nya intervall.

LÄt oss fortsÀtta koda vÄr ström ÀtNu tar vi den andra symbolen a, vilket ligger i det nya delomrÄdet frÄn 0,3 till 0,39, och sedan tar vi vÄr sista symbol t och genom att upprepa samma process igen fÄr vi det sista delomrÄdet frÄn 0,354 till 0,372.

Vi behöver bara vÀlja ett tal i det sista delomrÄdet frÄn 0,354 till 0,372. LÄt oss vÀlja 0,36 (men du kan vÀlja vilket annat tal som helst i detta delomrÄde). Endast med detta tal kan vi rekonstruera vÄr ursprungliga ström. Det Àr som om vi ritade en linje inom intervallen för att koda vÄr ström.

Den omvÀnda operationen (dvs. avkodning) Àr lika enkelt: med vÄrt tal 0,36 och vÄrt initiala intervall kan vi köra samma process. Men nu, med hjÀlp av detta tal, upptÀcker vi flödet som kodas av detta tal.
Med det första intervallet mÀrker vi att vÄrt tal motsvarar segmentet, dÀrför Àr detta vÄr första symbol. Nu dividerar vi detta delintervall igen, enligt samma process som tidigare. HÀr kan vi se att 0,36 motsvarar symbolen a, och efter att ha upprepat processen kom vi till den sista symbolen t (bildar vÄr ursprungliga kodade ström Àt).
BÄde kodaren och avkodaren mÄste ha en tabell över symbolsannolikheter, sÄ den mÄste skickas in som indata.
Ganska elegant, eller hur? Den som kom pÄ den hÀr lösningen var riktigt smart. Vissa videokodekar anvÀnder den hÀr tekniken (eller erbjuder den Ätminstone som ett alternativ).
Tanken Àr att komprimera en kvantiserad bitström utan förlust. Jag Àr sÀker pÄ att det saknas massor av detaljer, anledningar, avvÀgningar etc. i den hÀr artikeln. Men om du Àr utvecklare borde du veta mer. Nya codecs försöker anvÀnda olika entropikodningsalgoritmer, som till exempel ANS.
Steg 6 - Bitströmsformat
NÀr allt detta Àr klart ÄterstÄr bara att dekomprimera de komprimerade bildrutorna i samband med de vidtagna stegen. Avkodaren mÄste uttryckligen informeras om de beslut som fattas av kodaren. Avkodaren mÄste förses med all nödvÀndig information: bitdjup, fÀrgrymd, upplösning, prediktionsinformation (rörelsevektorer, riktningsbaserad INTER-prediktion), profil, nivÄ, bildhastighet, bildtyp, bildnummer och mycket mer.
Vi ska ta en ytlig titt pĂ„ bitströmmen. H.264VĂ„rt första steg Ă€r att skapa en minimal H.264-bitström (FFmpeg lĂ€gger som standard till alla kodningsalternativ som SEI NAL â vi fĂ„r reda pĂ„ vad det Ă€r lite lĂ€ngre fram). Vi kan göra detta med hjĂ€lp av vĂ„rt eget repository och FFmpeg.
./s/ffmpeg -i /files/i/minimal.png -pix_fmt yuv420p /files/v/minimal_yuv420.h264
Det hÀr kommandot genererar en rÄ bitström. H.264 med en enda bildruta, 64x64 upplösning, med fÀrgrymd YUV420Följande bild anvÀnds som ram.

H.264 Bitström
Standard AVC (H.264) anger att informationen kommer att skickas i makroramar (i nÀtverksmekanism), kallade nal (detta Àr ett nÀtverksabstraktionslager). HuvudmÄlet med NAL Àr att tillhandahÄlla en "nÀtverksvÀnlig" representation av video. Denna standard bör fungera pÄ TV-apparater (strömbaserat) och pÄ internet (paketbaserat).
![]()
Det finns en synkroniseringsmarkör för att definiera grĂ€nserna för NAL-element. Varje synkroniseringsmarkör innehĂ„ller ett vĂ€rde. 0x00 0x00 0x01, förutom den allra första, som Ă€r lika med 0x00 0x00 0x00 0x01. Om vi ââlanserar hexdump För den genererade H.264-bitströmmen identifierar vi minst tre NAL-mönster i början av filen.

Som nÀmnts mÄste avkodaren inte bara kÀnna till bilddata, utan Àven videodetaljer, bildrutedetaljer, fÀrger, parametrar som anvÀnds med mera. Den första byten i varje NAL definierar dess kategori och typ.
| NAL-typidentifierare | beskrivning |
|---|---|
| 0 | OkÀnd typ |
| 1 | Kodat bildfragment utan IDR |
| 2 | Kodad datasegmentsektion A |
| 3 | Kodad datasegmentsektion B |
| 4 | Kodad datasegmentsektion C |
| 5 | Kodat IDR-fragment av IDR-bild |
| 6 | Ytterligare information om SEI-förlÀngningen |
| 7 | SPS-sekvensparameteruppsÀttning |
| 8 | PPS-bildparameteruppsÀttning |
| 9 | Ă tkomstavskiljare |
| 10 | Slut pÄ sekvensen |
| 11 | Slutet av strömmen |
| . | . |
Vanligtvis Àr den första NAL:en i en bitström SPSDenna NAL-typ ansvarar för att kommunicera vanliga kodningsvariabler som profil, nivÄ, upplösning etc.
Om vi ââhoppar över den första synkroniseringsmarkören kan vi avkoda den första byten för att ta reda pĂ„ vilken NAL-typ som Ă€r först.
Till exempel Àr den första byten efter synkroniseringsmarkören 01100111, dÀr den första biten (0) Àr i f-fÀltetorbid_zero_bitDe kommande 2 bitarna (11) berÀttar för oss fÀltet nal_ref_idc, vilket anger om denna NAL Àr ett referensfÀlt eller inte. Och de ÄterstÄende 5 bitarna (00111) berÀttar för oss fÀltet nal_enhetstyp, i det hÀr fallet Àr det SPS-blocket (7) NAL.
Andra byten (binÀr=01100100, hex=0x64, december=100) i SPS NAL Àr ett fÀlt profil_idc, vilket visar den profil som kodaren anvÀnde. I det hÀr fallet anvÀndes den begrÀnsade höga profilen (dvs. höga profilen utan stöd för dubbelriktat B-segment).

Om du tittar pÄ bitströmsspecifikationen H.264 För SPS NAL hittar vi mÄnga vÀrden för parameternamn, kategori och beskrivning. LÄt oss till exempel titta pÄ fÀlten pic_width_in_mbs_minus_1 О pic_height_in_map_units_minus_1.
| Parameternamn | kategori | beskrivning |
|---|---|---|
| pic_width_in_mbs_minus_1 | 0 | ue(v) |
| pic_height_in_map_units_minus_1 | 0 | ue(v) |
Om du rÀknar lite pÄ vÀrdena i dessa fÀlt fÄr du upplösningen. Du kan representera 1920 x 1080 med hjÀlp av pic_width_in_mbs_minus_1 med vÀrdet 119 ((119 + 1) * macroblock_size = 120 * 16 = 1920). à terigen, för att spara utrymme, istÀllet för att koda 1920, gjorde vi det med 119.
Om vi ââfortsĂ€tter att kontrollera vĂ„r skapade video i binĂ€r form (till exempel: xxd -b -c 11 v/minimal_yuv420.h264), sedan kan vi gĂ„ vidare till den sista NAL, vilket Ă€r sjĂ€lva ramen.

HÀr ser vi dess första 6 byte-vÀrden: 01100101 10001000 10000100 00000000 00100001 11111111Eftersom det Àr kÀnt att den första byten anger NAL-typen, i detta fall (00101) detta Àr IDR-fragmentet (5), och sedan kommer det att vara möjligt att utforska det ytterligare:

Med hjÀlp av specifikationsinformationen kommer det att vara möjligt att avkoda fragmenttypen (skivtyp) och bildrutenummer (bildnummer) bland andra viktiga omrÄden.
För att fÄ vÀrdena för vissa fÀlt (ue(v), me(v), se(v) eller te(v)), vi behöver avkoda fragmentet med hjÀlp av en speciell avkodare baserad pÄ Den hÀr metoden Àr mycket effektiv för att koda variabelvÀrden, sÀrskilt nÀr det finns mÄnga standardvÀrden.
innebörd skivtyp О bildnummer i den hÀr videon Àr 7 (I-fragment) och 0 (första bildrutan).
Bitströmmen kan betraktas som ett protokoll. Om du vill veta mer om bitströmmen bör du se specifikationen ITU H.264HÀr Àr ett makrodiagram som visar var bilddata finns (YUV i komprimerad form).

Andra bitströmmar kan ocksĂ„ utforskas, sĂ„som VP9, H.265 (HEVC) eller till och med vĂ„r nya bĂ€sta bitstream AV1Ăr de alla lika? Nej, men nĂ€r du vĂ€l förstĂ„r minst en Ă€r det mycket lĂ€ttare att förstĂ„ resten.
Vill du öva? Utforska H.264-bitströmmen
Du kan generera en video med en enda bildruta och anvÀnda MediaInfo för att undersöka bitströmmen. H.264Faktum Àr att ingenting hindrar dig frÄn att ens titta pÄ kÀllkoden som analyserar bitströmmen. H.264 (AVC).
För övning kan du anvÀnda Intel Video Pro Analyzer (jag har redan sagt att programmet Àr betalt, men finns det en gratis testversion med en grÀns pÄ 10 bildrutor?).
ĐĐ±Đ·ĐŸŃ
Observera att mÄnga moderna codecs anvÀnder samma modell som vi just studerade. HÀr ska vi titta pÄ blockschemat för en videocodec. ThorDen innehÄller alla steg vi har tagit. Hela poÀngen med det hÀr inlÀgget Àr att Ätminstone ge dig en bÀttre förstÄelse för innovationerna och dokumentationen inom detta omrÄde.

Tidigare berĂ€knade vi att 139 GB diskutrymme skulle krĂ€vas för att lagra en videofil som varar i en timme med 720p-kvalitet och 30 fps. Om vi ââanvĂ€nder metoderna som vi diskuterade i den hĂ€r artikeln (prediktioner mellan och mellan bildrutor, transformation, kvantisering, entropikodning etc.) kan vi (förutsatt att vi anvĂ€nder 0,031 bitar per pixel) uppnĂ„ en video av ganska tillfredsstĂ€llande kvalitet som bara tar upp 367,82 MB, inte 139 GB minne.
Hur uppnÄr H.265 bÀttre komprimering Àn H.264?
Nu nÀr vi vet mer om hur codecs fungerar Àr det lÀttare att förstÄ hur nya codecs kan leverera högre upplösning med fÀrre bitar.
Om du jÀmför AVC О HEVC, Àr det vÀrt att komma ihÄg att detta nÀstan alltid Àr ett val mellan högre CPU-belastning och komprimeringsgraden.
HEVC har fler alternativ för avsnitt (och underavsnitt) Àn AVC, fler riktningar för intern prediktion, förbÀttrad entropikodning och mer. Alla dessa förbÀttringar har gjort H.265 kapabel att komprimera 50 % mer Àn H.264.

Del ett:
KĂ€lla: will.com




