Hur fungerar en videocodec? Del 1: Grunderna

Andra delen: Hur videocodec fungerar

Vilket raster som helst bild kan representeras i formen tvådimensionell matris. När det kommer till färger kan idén utvecklas genom att titta på en bild som tredimensionell matris, där ytterligare dimensioner används för att lagra data för var och en av färgerna.

Om vi ​​betraktar den slutliga färgen som en kombination av den så kallade. primärfärger (röd, grön och blå), i vår tredimensionella matris definierar vi tre plan: det första för rött, det andra för grönt och det sista för blått.
Hur fungerar en videocodec? Del 1: Grunderna
Vi kommer att kalla varje punkt i denna matris för en pixel (bildelement). Varje pixel innehåller information om intensiteten (vanligtvis som ett numeriskt värde) för varje färg. Till exempel, röd pixel betyder att den innehåller 0 grönt, 0 blått och maximalt rött. Rosa pixel kan formas med en kombination av tre färger. Med ett numeriskt område från 0 till 255 definieras en rosa pixel som Röd = 255, Grön = 192 и Blå = 203.

Hur fungerar en videocodec? Del 1: Grunderna

Den här artikeln publicerades med stöd av EDISON.

Vi utvecklas applikationer för videoövervakning, videoströmning, och även vi är förlovade videoinspelning i operationsrummet.

Alternativa sätt att koda en färgbild

Det finns många andra modeller för att representera färgerna som utgör en bild. Till exempel kan du använda en indexerad palett, som bara kräver en byte för att representera varje pixel, istället för de tre som krävs när du använder RGB-modellen. I en sådan modell är det möjligt att använda en 2D-matris istället för en 3D-matris för att representera varje färg. Detta sparar minne, men ger ett mindre färgomfång.

Hur fungerar en videocodec? Del 1: Grunderna

RGB

Ta till exempel en titt på den här bilden nedan. Det första ansiktet är helt målat. De andra är de röda, gröna och blå planen (intensiteten för motsvarande färger visas i gråskala).

Hur fungerar en videocodec? Del 1: Grunderna

Vi ser att nyanserna av rött i originalet kommer att vara på samma ställen där de ljusaste delarna av det andra ansiktet observeras. Medan blues bidrag huvudsakligen bara kan ses i Marios ögon (sista ansikte) och delar av hans kläder. Lägg märke till var alla tre färgplanen bidrar med minst (de mörkaste delarna av bilderna) - Marios mustasch.

För att lagra intensiteten för varje färg krävs ett visst antal bitar - denna kvantitet kallas bitdjup. Låt oss säga att 8 bitar spenderas (baserat på ett värde från 0 till 255) per färgplan. Då har vi ett färgdjup på 24 bitar (8 bitar * 3 R/G/B-plan).

En annan egenskap hos en bild är tillstånd, vilket är antalet pixlar i en dimension. Betecknas ofta som bredd × höjd, som i 4 x 4 exempelbilden nedan.
Hur fungerar en videocodec? Del 1: Grunderna

En annan egenskap vi sysslar med när vi arbetar med bilder/filmer är sidförhållande, som beskriver det normala proportionella förhållandet mellan bredden och höjden på en bild eller pixel.

När de säger att en viss film eller bild är 16 gånger 9 stor menar de oftast bildförhållande (DAR - från Visa bildförhållande). Men ibland kan det finnas olika former av enskilda pixlar - i det här fallet talar vi om pixelförhållande (PAR - från Pixelbildförhållande).

Hur fungerar en videocodec? Del 1: Grunderna

Hur fungerar en videocodec? Del 1: Grunderna

Kommentar till värdinnan: dvd motsvarar DAR 4 till 3

Även om den faktiska DVD-upplösningen är 704x480, bibehåller den fortfarande ett bildförhållande på 4:3 eftersom PAR är 10:11 (704x10 / 480x11).

Och slutligen kan vi avgöra video som en sekvens av n ramar för perioden tid, vilket kan betraktas som en ytterligare dimension. A n då är bildhastigheten eller antalet bilder per sekund (FPS - från Bildrutor per sekund).

Hur fungerar en videocodec? Del 1: Grunderna

Antalet bitar per sekund som krävs för att visa en video är dess överföringshastighet - bithastighet.

bithastighet = bredd * höjd * bitdjup * bildrutor per sekund

Till exempel skulle en video på 30 fps, 24 bps, 480x240 kräva 82,944,000 82,944 30 bps eller 480 240 Mbps (24xXNUMXxXNUMXxXNUMX) - men det är om ingen komprimeringsmetod används.

Om överföringshastigheten nästan konstant, då heter det konstant överföringshastighet (CBR - från konstant bithastighet). Men det kan också variera, i det här fallet kallas det variabel överföringshastighet (VBR - från variabel bithastighet).

Den här grafen visar begränsad VBR, där inte för många bitar går till spillo vid en helt mörk ram.

Hur fungerar en videocodec? Del 1: Grunderna

Ingenjörer utvecklade initialt en metod för att fördubbla den upplevda bildhastigheten för en videoskärm utan att använda ytterligare bandbredd. Denna metod är känd som sammanflätad video; I princip skickar den halva skärmen i den första "bildrutan" och den andra halvan i nästa "ram".

För närvarande renderas scener mestadels med hjälp av progressiva skanningstekniker. Det är en metod för att visa, lagra eller överföra rörliga bilder där alla linjer i varje bildruta ritas sekventiellt.

Hur fungerar en videocodec? Del 1: Grunderna

Väl! Nu är vi medvetna om hur en bild representeras digitalt, hur dess färger är ordnade, hur många bitar per sekund vi spenderar på att visa video, om bithastigheten är konstant (CBR) eller variabel (VBR). Vi känner till en given upplösning med en given bildhastighet, vi är bekanta med många andra termer, såsom interlaced video, PAR och några andra.

Ta bort redundans

Det är känt att video utan komprimering inte kan användas normalt. En timslång video med 720p-upplösning och 30 bilder per sekund skulle ta upp 278 GB. Vi kommer fram till detta värde genom att multiplicera 1280 x 720 x 24 x 30 x 3600 (bredd, höjd, bitar per pixel, FPS och tid i sekunder).

Använd förlustfria komprimeringsalgoritmer, som DEFLATE (används i PKZIP, Gzip och PNG), kommer inte att minska den erforderliga bandbredden tillräckligt. Vi måste leta efter andra sätt att komprimera video.

För att göra detta kan du använda funktionerna i vår vision. Vi är bättre på att särskilja ljusstyrka än färg. En video är en serie bilder i följd som upprepas över tiden. Det finns små skillnader mellan intilliggande bildrutor av samma scen. Dessutom innehåller varje ram många områden som använder samma (eller liknande) färg.

Färg, ljusstyrka och våra ögon

Våra ögon är mer känsliga för ljusstyrka än för färg. Du kan se detta själv genom att titta på den här bilden.

Hur fungerar en videocodec? Del 1: Grunderna

Om du inte ser det på den vänstra halvan av bilden är färgerna på rutorna A и B är faktiskt samma, då är det normalt. Vår hjärna tvingar oss att ägna mer uppmärksamhet åt ljus och skugga snarare än färg. På höger sida mellan de angivna rutorna finns en bygel i samma färg - så vi (dvs vår hjärna) avgör lätt att de faktiskt har samma färg.

Låt oss titta (på ett förenklat sätt) på hur våra ögon fungerar. Ögat är ett komplext organ som består av många delar. Vi är dock mest intresserade av kottar och spön. Ögat innehåller cirka 120 miljoner stavar och 6 miljoner kottar.

Låt oss betrakta uppfattningen av färg och ljusstyrka som separata funktioner för vissa delar av ögat (i själva verket är allt något mer komplicerat, men vi kommer att förenkla det). Stavceller är främst ansvariga för ljusstyrka, medan konceller är ansvariga för färg. Koner delas in i tre typer, beroende på vilket pigment de innehåller: S-koner (blå), M-koner (grön) och L-koner (röd).

Eftersom vi har många fler stavar (ljushet) än kottar (färg), kan vi dra slutsatsen att vi är mer kapabla att skilja övergångar mellan mörkt och ljust än färger.

Hur fungerar en videocodec? Del 1: Grunderna

Kontrastkänslighetsfunktioner

Forskare inom experimentell psykologi och många andra områden har utvecklat många teorier om mänskligt syn. Och en av dem heter kontrastkänslighetsfunktioner. De är relaterade till rumslig och tidsmässig belysning. Kort sagt handlar det om hur många förändringar som krävs innan en observatör märker dem. Observera pluralen av ordet "funktion". Detta beror på att vi kan mäta kontrastkänslighetsfunktioner inte bara för svartvita bilder utan även för färgbilder. Resultaten av dessa experiment visar att i de flesta fall är våra ögon mer känsliga för ljusstyrka än för färg.

Eftersom vi vet att vi är mer känsliga för bildens ljusstyrka kan vi försöka använda detta faktum.

Färgmodell

Vi kom på lite hur man arbetar med färgbilder med hjälp av RGB-schemat. Det finns andra modeller också. Det finns en modell som skiljer luminans från chroma och den kallas YCbCr. Förresten, det finns andra modeller som gör en liknande uppdelning, men vi kommer bara att överväga den här.

I denna färgmodell Y är en representation av ljusstyrka och använder även två färgkanaler: Cb (rikt blå) och Cr (rik röd). YCbCr kan härledas från RGB, och omvänd konvertering är också möjlig. Med den här modellen kan vi skapa fullfärgsbilder som vi ser nedan:

Hur fungerar en videocodec? Del 1: Grunderna

Konvertera mellan YCbCr och RGB

Någon kommer att invända: hur är det möjligt att få alla färger om grönt inte används?

För att svara på denna fråga, låt oss konvertera RGB till YCbCr. Låt oss använda koefficienterna som används i standarden BT.601, som rekommenderades av enheten ITU-R. Denna division sätter standarden för digital video. Till exempel: vad är 4K? Vilken bildhastighet, upplösning, färgmodell ska vara?

Låt oss först beräkna ljusstyrkan. Låt oss använda konstanterna som föreslås av ITU och ersätta RGB-värdena.

Y = 0.299R + 0.587G + 0.114B

När vi har ljusstyrkan kommer vi att separera de blå och röda färgerna:

Cb = 0.564(B - Y)

Cr = 0.713(R - Y)

Och vi kan också konvertera tillbaka och till och med bli grön med YCbCr:

R = Y + 1.402Cr

B = Y + 1.772Cb

G = Y - 0.344Cb - 0.714Cr

Normalt använder skärmar (skärmar, TV-apparater, skärmar, etc.) endast RGB-modellen. Men denna modell kan organiseras på olika sätt:

Hur fungerar en videocodec? Del 1: Grunderna

Färg delsampling

Med en bild representerad som en kombination av luminans och krominans kan vi utnyttja det mänskliga visuella systemets större känslighet för luminans än för krominans genom att selektivt ta bort information. Chroma subsampling är en metod för att koda bilder med mindre upplösning för chroma än för luminans.

Hur fungerar en videocodec? Del 1: Grunderna

Hur mycket är det tillåtet att minska färgupplösningen?! Det visar sig att det redan finns några diagram som beskriver hur man hanterar upplösning och sammanslagning (Resulterande färg = Y + Cb + Cr).

Dessa system är kända som nedsamplingssystem och uttrycks som ett 3-faldigt förhållande - a:x:y, som bestämmer antalet sampel av luminans- och färgskillnadssignaler.

a — horisontell provtagningsstandard (vanligtvis lika med 4)
x — Antal färgprover i den första raden av pixlar (horisontell upplösning i förhållande till a)
y — Antalet förändringar i färgsampel mellan den första och andra raden av pixlar.

Undantaget är 4:1:0, vilket ger ett färgprov i varje 4 x 4 luminansupplösningsblock.

Vanliga scheman som används i moderna codecs:

  • 4:4:4 (ingen nedsampling)
  • 4:2:2
  • 4:1:1
  • 4:2:0
  • 4:1:0
  • 3:1:1

YCbCr 4:2:0 - fusionsexempel

Här är en sammanfogad bild med YCbCr 4:2:0. Observera att vi bara spenderar 12 bitar per pixel.

Hur fungerar en videocodec? Del 1: Grunderna

Så här ser samma bild ut, kodad med huvudtyperna av färgsubsampling. Den första raden är den sista YCbCr, den nedre raden visar färgupplösningen. Mycket anständigt resultat, med tanke på den lilla kvalitetsförlusten.

Hur fungerar en videocodec? Del 1: Grunderna

Kommer du ihåg när vi räknade 278 GB lagringsutrymme för att lagra en timslång videofil med 720p-upplösning och 30 bilder per sekund? Om vi ​​använder YCbCr 4:2:0, kommer denna storlek att minskas med hälften - 139 GB. Än så länge är det långt ifrån ett acceptabelt resultat.

Du kan skaffa YCbCr-histogrammet själv med FFmpeg. I denna bild dominerar blått över rött, vilket är tydligt i själva histogrammet.

Hur fungerar en videocodec? Del 1: Grunderna

Färg, ljusstyrka, färgomfång - videorecension

Vi rekommenderar att du tittar på denna fantastiska video. Den förklarar vad ljusstyrka är, och i allmänhet är alla prickar prickade ё om ljusstyrka och färg.

Ramtyper

Låt oss gå vidare. Låt oss försöka eliminera tidsredundansen. Men låt oss först definiera lite grundläggande terminologi. Låt oss säga att vi har en film med 30 bilder per sekund, här är de fyra första bilderna:

Hur fungerar en videocodec? Del 1: Grunderna Hur fungerar en videocodec? Del 1: Grunderna Hur fungerar en videocodec? Del 1: Grunderna Hur fungerar en videocodec? Del 1: Grunderna

Vi kan se många upprepningar i ramarna: till exempel en blå bakgrund som inte ändras från ram till ram. För att lösa detta problem kan vi abstrakt klassificera dem i tre typer av ramar.

I-frame (Intro Frame)

I-frame (referensram, nyckelram, innerram) är fristående. Oavsett vad du vill visualisera är en I-frame i grunden ett statiskt fotografi. Den första ramen är vanligtvis en I-frame, men vi kommer regelbundet att observera I-frames även bland de inte första ramarna.

Hur fungerar en videocodec? Del 1: Grunderna

P-ram (Pförutsagd ram)

P-frame (prediktiv bildruta) drar fördel av det faktum att nästan alltid den aktuella bilden kan återges med hjälp av föregående bildruta. Till exempel, i den andra ramen är den enda förändringen att bollen rör sig framåt. Vi kan få bildruta 2 genom att helt enkelt modifiera ram 1 något, bara genom att använda skillnaden mellan dessa ramar. För att konstruera ram 2 hänvisar vi till föregående ram 1.

Hur fungerar en videocodec? Del 1: GrundernaHur fungerar en videocodec? Del 1: Grunderna

B-ram (Bi-prediktiv ram)

Hur är det med länkar inte bara till tidigare, utan även till framtida ramar för att ge ännu bättre komprimering?! Detta är i grunden en B-ram (dubbelriktad ram).

Hur fungerar en videocodec? Del 1: GrundernaHur fungerar en videocodec? Del 1: GrundernaHur fungerar en videocodec? Del 1: Grunderna

Mellanuttag

Dessa ramtyper används för att ge bästa möjliga kompression. Vi ska titta på hur detta händer i nästa avsnitt. För nu, låt oss notera att det "dyraste" när det gäller minnesförbrukning är I-frame, P-frame är märkbart billigare, men det mest lönsamma alternativet för video är B-frame.

Hur fungerar en videocodec? Del 1: Grunderna

Temporell redundans (inter-frame prediction)

Låt oss titta på vilka alternativ vi har för att minimera upprepning över tid. Vi kan lösa denna typ av redundans med hjälp av korsprediktionsmetoder.

Vi kommer att försöka spendera så få bitar som möjligt för att koda en sekvens av ramar 0 och 1.

Hur fungerar en videocodec? Del 1: Grunderna

Vi kan producera subtraktion, subtraherar vi helt enkelt ram 1 från bildruta 0. Vi får bildruta 1, använd bara skillnaden mellan den och föregående bildruta, i själva verket kodar vi bara den resulterande återstoden.

Hur fungerar en videocodec? Del 1: Grunderna

Men tänk om jag berättade att det finns en ännu bättre metod som använder ännu färre bitar?! Låt oss först dela upp ram 0 i ett tydligt rutnät som består av block. Och sedan ska vi försöka matcha blocken från ram 0 med ram 1. Med andra ord kommer vi att uppskatta rörelsen mellan ramarna.

Från Wikipedia - blockera rörelsekompensation

Blockrörelsekompensation delar upp den aktuella ramen i icke-överlappande block och rörelsekompensationsvektorn rapporterar ursprunget för blocken (en vanlig missuppfattning är att föregående ramen är uppdelad i icke-överlappande block, och rörelsekompensationsvektorer talar om vart dessa block går. Men i själva verket är det tvärtom - det är inte den föregående ramen som analyseras, utan nästa; det är inte klart vart blocken rör sig, men var de kom ifrån). Typiskt överlappar källblocken i källramen. Vissa videokomprimeringsalgoritmer sammanställer den aktuella bildrutan från delar av inte ens en, utan flera tidigare överförda bildrutor.

Hur fungerar en videocodec? Del 1: Grunderna

Under utvärderingsprocessen ser vi att bollen har flyttat från (x= 0, y=25) av (x= 6, y=26), värden x и y bestämma rörelsevektorn. Ett annat steg vi kan göra för att bevara bitar är att endast koda skillnaden mellan rörelsevektorer mellan den sista blockpositionen och den förutsagda, så den slutliga rörelsevektorn blir (x=6-0=6, y=26-25=1 ).

I en verklig situation skulle denna boll delas in i n blockerar, men detta förändrar inte sakens väsen.

Objekt i ramen rör sig i tre dimensioner, så när bollen rör sig kan den bli visuellt mindre (eller större om den rör sig mot betraktaren). Det är normalt att det inte blir en perfekt matchning mellan blocken. Här är en kombinerad bild av vår uppskattning och den verkliga bilden.

Hur fungerar en videocodec? Del 1: Grunderna

Men vi ser att när vi använder rörelseuppskattning finns det märkbart mindre data för kodning än när vi använder en enklare metod för att beräkna delta mellan ramar.

Hur fungerar en videocodec? Del 1: Grunderna

Hur verklig rörelsekompensation skulle se ut

Denna teknik tillämpas på alla block samtidigt. Ofta kommer vår villkorliga rörliga boll att delas upp i flera block samtidigt.

Hur fungerar en videocodec? Del 1: Grunderna

Du kan själv få en känsla för dessa begrepp jupyter.

För att se rörelsevektorer kan du skapa en extern prediktionsvideo med hjälp av ffmpeg.

Hur fungerar en videocodec? Del 1: Grunderna

Du kan också använda Intel Video Pro Analyzer (det är betalt, men det finns en gratis provperiod som är begränsad till endast de första tio bildrutorna).

Hur fungerar en videocodec? Del 1: Grunderna

Rumslig redundans (intern prognos)

Om vi ​​analyserar varje bildruta i en video hittar vi många sammanlänkade områden.

Hur fungerar en videocodec? Del 1: Grunderna

Låt oss gå igenom detta exempel. Denna scen består huvudsakligen av blå och vita färger.

Hur fungerar en videocodec? Del 1: Grunderna

Detta är en I-frame. Vi kan inte ta tidigare ramar för förutsägelse, men vi kan komprimera det. Låt oss koda valet av det röda blocket. Om vi ​​tittar på dess grannar märker vi att det finns en del färgtrender kring den.

Hur fungerar en videocodec? Del 1: Grunderna

Vi antar att färger sprids vertikalt i ramen. Vilket betyder att färgen på de okända pixlarna kommer att innehålla värdena för sina grannar.

Hur fungerar en videocodec? Del 1: Grunderna

En sådan prognos kan visa sig vara felaktig. Det är av denna anledning som du måste tillämpa den här metoden (intern prognos) och sedan subtrahera de verkliga värdena. Detta kommer att ge oss ett restblock, vilket kommer att resultera i en mycket mer komprimerad matris jämfört med originalet.

Hur fungerar en videocodec? Del 1: Grunderna

Om du vill öva med interna förutsägelser kan du skapa en video av makroblock och deras förutsägelser med hjälp av ffmpeg. För att förstå innebörden av varje blockfärg måste du läsa ffmpeg-dokumentationen.

Hur fungerar en videocodec? Del 1: Grunderna

Eller så kan du använda Intel Video Pro Analyzer (som jag nämnde ovan, den kostnadsfria testversionen är begränsad till de första 10 bildrutorna, men detta kommer att räcka för dig till en början).

Hur fungerar en videocodec? Del 1: Grunderna

Andra delen: Hur videocodec fungerar

Källa: will.com

Lägg en kommentar