Hvordan fungerer en videokodek? Del 1: Grunnleggende

Andre del: Hvordan videokodeken fungerer

Hvilket som helst raster image kan representeres i skjemaet todimensjonal matrise. Når det kommer til farger, kan ideen utvikles ved å se på et bilde som tredimensjonal matrise, der tilleggsdimensjoner brukes til å lagre data for hver av fargene.

Hvis vi vurderer den endelige fargen som en kombinasjon av den såkalte. primærfarger (rød, grønn og blå), i vår tredimensjonale matrise definerer vi tre plan: det første for rødt, det andre for grønt og det siste for blått.
Hvordan fungerer en videokodek? Del 1: Grunnleggende
Vi vil kalle hvert punkt i denne matrisen en piksel (bildeelement). Hver piksel inneholder informasjon om intensiteten (vanligvis som en numerisk verdi) for hver farge. For eksempel, rød piksel betyr at den inneholder 0 grønn, 0 blå og maksimal rød. Rosa piksel kan dannes ved hjelp av en kombinasjon av tre farger. Ved å bruke et numerisk område fra 0 til 255, er en rosa piksel definert som Rød = 255, Grønn = 192 и Blå = 203.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Artikkelen ble publisert med støtte fra EDISON.

Vi utvikler oss applikasjoner for videoovervåking, videostreaming, og også vi er forlovet videoopptak på operasjonsrommet.

Alternative måter å kode et fargebilde på

Det finnes mange andre modeller for å representere fargene som utgjør et bilde. Du kan for eksempel bruke en indeksert palett, som krever bare én byte for å representere hver piksel, i stedet for de tre som kreves når du bruker RGB-modellen. I en slik modell er det mulig å bruke en 2D-matrise i stedet for en 3D-matrise for å representere hver farge. Dette sparer minne, men gir et mindre fargespekter.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

RGB

Ta for eksempel en titt på dette bildet nedenfor. Det første ansiktet er ferdig malt. De andre er de røde, grønne og blå planene (intensiteten til de tilsvarende fargene vises i gråtoner).

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Vi ser at nyansene av rødt i originalen vil være på de samme stedene der de lyseste delene av det andre ansiktet er observert. Mens blues bidrag hovedsakelig kan sees bare i Marios øyne (siste ansikt) og elementer av klærne hans. Legg merke til hvor alle tre fargeplanene bidrar minst (de mørkeste delene av bildene) - Marios bart.

For å lagre intensiteten til hver farge, kreves et visst antall biter - denne mengden kalles bit dybde. La oss si at det brukes 8 bits (basert på en verdi fra 0 til 255) per fargeplan. Da har vi en fargedybde på 24 bits (8 bits * 3 R/G/B-plan).

En annen egenskap ved et bilde er tillatelse, som er antall piksler i én dimensjon. Ofte betegnet som bredde × høyde, som i 4 x 4 eksempelbildet nedenfor.
Hvordan fungerer en videokodek? Del 1: Grunnleggende

En annen egenskap vi forholder oss til når vi jobber med bilder/videoer er størrelsesforholdet, som beskriver det normale proporsjonale forholdet mellom bredden og høyden til et bilde eller en piksel.

Når de sier at en bestemt film eller et bilde er 16 x 9 i størrelse, mener de vanligvis skjermsideforhold (MEN - fra Vis sideforhold). Noen ganger kan det imidlertid være forskjellige former for individuelle piksler - i dette tilfellet snakker vi om pikselforhold (PAR - fra Pixel Aspect Ratio).

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Merknad til vertinnen: DVD соответствует DAR 4 til 3

Selv om den faktiske DVD-oppløsningen er 704x480, opprettholder den fortsatt et sideforhold på 4:3 fordi PAR er 10:11 (704x10 / 480x11).

Og til slutt kan vi bestemme video som en sekvens av n rammer for perioden tid, som kan betraktes som en ekstra dimensjon. EN n så er bildefrekvensen eller antall bilder per sekund (FPS - fra Bilder per sekund).

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Antall bits per sekund som kreves for å vise en video er dens overføringshastighet - bithastighet.

bitrate = bredde * høyde * bitdybde * bilder per sekund

For eksempel vil en 30 fps, 24 bps, 480x240 video kreve 82,944,000 82,944 30 bps eller 480 240 Mbps (24xXNUMXxXNUMXxXNUMX) - men det er hvis ingen komprimeringsmetode brukes.

Hvis overføringshastigheten nesten konstant, da heter det konstant overføringshastighet (CBR - fra konstant bithastighet). Men det kan også variere, i dette tilfellet heter det variabel overføringshastighet (VBR - fra variabel bithastighet).

Denne grafen viser begrenset VBR, hvor ikke for mange biter går til spille ved en helt mørk ramme.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Ingeniører utviklet opprinnelig en metode for å doble den oppfattede bildefrekvensen til en videoskjerm uten å bruke ekstra båndbredde. Denne metoden er kjent som interlaced video; I utgangspunktet sender den halve skjermen i første "frame" og den andre halvparten i neste "frame".

For tiden er scener for det meste gjengitt ved hjelp av progressive skanneteknologier. Det er en metode for å vise, lagre eller overføre bevegelige bilder der alle linjene i hver ramme tegnes sekvensielt.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Vi vil! Nå er vi klar over hvordan et bilde er representert digitalt, hvordan fargene er ordnet, hvor mange bits per sekund vi bruker på å vise video, om bithastigheten er konstant (CBR) eller variabel (VBR). Vi vet om en gitt oppløsning ved å bruke en gitt bildefrekvens, vi er kjent med mange andre begreper, for eksempel interlaced video, PAR og noen andre.

Fjerner redundans

Det er kjent at video uten komprimering ikke kan brukes normalt. En timelang video med 720p-oppløsning og 30 bilder per sekund vil ta opp 278 GB. Vi kommer frem til denne verdien ved å multiplisere 1280 x 720 x 24 x 30 x 3600 (bredde, høyde, bits per piksel, FPS og tid i sekunder).

Bruk tapsfrie komprimeringsalgoritmer, som DEFLATE (brukt i PKZIP, Gzip og PNG), vil ikke redusere den nødvendige båndbredden nok. Vi må se etter andre måter å komprimere video på.

For å gjøre dette kan du bruke funksjonene i visjonen vår. Vi er flinkere til å skille lysstyrke enn farge. En video er en serie med sekvensielle bilder som gjentas over tid. Det er små forskjeller mellom tilstøtende bilder av samme scene. I tillegg inneholder hver ramme mange områder som bruker samme (eller lignende) farge.

Farge, lysstyrke og øynene våre

Øynene våre er mer følsomme for lysstyrke enn for farger. Du kan se dette selv ved å se på dette bildet.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Hvis du ikke ser det på venstre halvdel av bildet, fargene på rutene A и B er faktisk de samme, så er det normalt. Hjernen vår tvinger oss til å være mer oppmerksomme på lys og skygge enn farge. På høyre side mellom de angitte rutene er det en genser i samme farge - så vi (dvs. hjernen vår) bestemmer enkelt at de faktisk har samme farge.

La oss se (på en forenklet måte) på hvordan øynene våre fungerer. Øyet er et komplekst organ som består av mange deler. Vi er imidlertid mest interessert i kjegler og stenger. Øyet inneholder rundt 120 millioner stenger og 6 millioner kjegler.

La oss vurdere oppfatningen av farge og lysstyrke som separate funksjoner for visse deler av øyet (faktisk er alt noe mer komplisert, men vi vil forenkle det). Staveceller er hovedsakelig ansvarlige for lysstyrke, mens kjegleceller er ansvarlige for farge. Kjegler er delt inn i tre typer, avhengig av pigmentet de inneholder: S-kjegler (blå), M-kjegler (grønne) og L-kjegler (røde).

Siden vi har mange flere staver (lysstyrke) enn kjegler (farge), kan vi konkludere med at vi er mer i stand til å skille overganger mellom mørkt og lyse enn farger.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Kontrastfølsomhetsfunksjoner

Forskere innen eksperimentell psykologi og mange andre felt har utviklet mange teorier om menneskesyn. Og en av dem heter kontrastfølsomhetsfunksjoner. De er relatert til romlig og tidsmessig belysning. Kort fortalt handler det om hvor mange endringer som kreves før en observatør legger merke til dem. Legg merke til flertall av ordet "funksjon". Dette skyldes det faktum at vi kan måle kontrastfølsomhetsfunksjoner ikke bare for svart-hvitt-bilder, men også for fargebilder. Resultatene av disse eksperimentene viser at i de fleste tilfeller er øynene våre mer følsomme for lysstyrke enn for farger.

Siden vi vet at vi er mer følsomme for bildelysstyrke, kan vi prøve å bruke dette faktum.

Fargemodell

Vi fant ut litt hvordan vi kan jobbe med fargebilder ved å bruke RGB-skjemaet. Det finnes også andre modeller. Det er en modell som skiller luminans fra chroma og den er kjent som YCbCr. Forresten, det er andre modeller som gjør en lignende inndeling, men vi vil bare vurdere denne.

I denne fargemodellen Y er en representasjon av lysstyrke, og bruker også to fargekanaler: Cb (rik blå) og Cr (rik rød). YCbCr kan avledes fra RGB, og omvendt konvertering er også mulig. Ved å bruke denne modellen kan vi lage fullfargebilder som vi ser nedenfor:

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Konverter mellom YCbCr og RGB

Noen vil protestere: hvordan er det mulig å få alle fargene hvis grønt ikke brukes?

For å svare på dette spørsmålet, la oss konvertere RGB til YCbCr. La oss bruke koeffisientene som er tatt i bruk i standarden BT.601, som ble anbefalt av enheten ITU-R. Denne divisjonen setter standardene for digital video. For eksempel: hva er 4K? Hva bør være bildefrekvens, oppløsning, fargemodell?

La oss først beregne lysstyrken. La oss bruke konstantene foreslått av ITU og erstatte RGB-verdiene.

Y = 0.299R + 0.587G + 0.114B

Etter at vi har lysstyrken, vil vi skille de blå og røde fargene:

Cb = 0.564(B - Y)

Cr = 0.713(R - Y)

Og vi kan også konvertere tilbake og til og med bli grønn ved å bruke YCbCr:

R = Y + 1.402Cr

B = Y + 1.772Cb

G = Y - 0.344Cb - 0.714Cr

Vanligvis bruker skjermer (skjermer, TV-er, skjermer osv.) bare RGB-modellen. Men denne modellen kan organiseres på forskjellige måter:

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Fargesubsampling

Med et bilde representert som en kombinasjon av luminans og krominans, kan vi utnytte det menneskelige visuelle systemets større følsomhet for luminans enn for krominans ved å selektivt fjerne informasjon. Chroma subsampling er en metode for å kode bilder med mindre oppløsning for chroma enn for luminans.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Hvor mye er det lov å redusere fargeoppløsningen?! Det viser seg at det allerede er noen diagrammer som beskriver hvordan man håndterer oppløsning og sammenslåing (Resulterende farge = Y + Cb + Cr).

Disse ordningene er kjent som nedsamplingssystemer og er uttrykt som et 3-dobbelt forhold - a:x:y, som bestemmer antall prøver av luminans- og fargeforskjellssignaler.

a — horisontal prøvetakingsstandard (vanligvis lik 4)
x — antall chroma-prøver i den første raden med piksler (horisontal oppløsning i forhold til a)
y — antall endringer i fargeprøver mellom første og andre rad med piksler.

Unntaket er 4:1:0, og gir én kromaprøve i hver 4-x-4 luminansoppløsningsblokk.

Vanlige skjemaer brukt i moderne kodeker:

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

YCbCr 4:2:0 - fusjonseksempel

Her er et sammenslått bilde med YCbCr 4:2:0. Merk at vi bare bruker 12 biter per piksel.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Slik ser det samme bildet ut, kodet med hovedtypene for fargesubsampling. Den første raden er den siste YCbCr, den nederste raden viser chroma-oppløsningen. Veldig anstendige resultater, tatt i betraktning det lille tapet i kvalitet.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Husker du da vi regnet med 278 GB lagringsplass for å lagre en timelang videofil med 720p-oppløsning og 30 bilder per sekund? Hvis vi bruker YCbCr 4:2:0, vil denne størrelsen reduseres med det halve - 139 GB. Så langt er det fortsatt langt fra et akseptabelt resultat.

Du kan få YCbCr-histogrammet selv ved å bruke FFmpeg. På dette bildet dominerer blått over rødt, som er godt synlig i selve histogrammet.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Farge, lysstyrke, fargespekter - videoanmeldelse

Vi anbefaler å se denne fantastiske videoen. Den forklarer hva lysstyrke er, og generelt er alle prikkene prikkete ё om lysstyrke og farge.

Rammetyper

La oss gå videre. La oss prøve å eliminere tidsredundansen. Men først, la oss definere noen grunnleggende terminologi. La oss si at vi har en film med 30 bilder per sekund, her er de fire første bildene:

Hvordan fungerer en videokodek? Del 1: Grunnleggende Hvordan fungerer en videokodek? Del 1: Grunnleggende Hvordan fungerer en videokodek? Del 1: Grunnleggende Hvordan fungerer en videokodek? Del 1: Grunnleggende

Vi kan se mye repetisjon i rammene: for eksempel en blå bakgrunn som ikke endres fra ramme til ramme. For å løse dette problemet kan vi abstrakt klassifisere dem i tre typer rammer.

I-frame (Intro Frame)

I-ramme (referanseramme, nøkkelramme, indre ramme) er selvstendig. Uansett hva du ønsker å visualisere, er en I-frame i hovedsak et statisk fotografi. Den første rammen er vanligvis en I-frame, men vi vil jevnlig observere I-frames selv blant ikke de første rammene.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

P-ramme (Pangitt ramme)

P-frame (prediktiv ramme) utnytter det faktum at nesten alltid det gjeldende bildet kan reproduseres ved bruk av forrige ramme. For eksempel, i den andre rammen er den eneste endringen at ballen beveger seg fremover. Vi kan få ramme 2 ved ganske enkelt å modifisere ramme 1 litt, kun ved å bruke forskjellen mellom disse rammene. For å konstruere ramme 2, viser vi til den foregående ramme 1.

Hvordan fungerer en videokodek? Del 1: GrunnleggendeHvordan fungerer en videokodek? Del 1: Grunnleggende

B-ramme (Bi-prediktiv ramme)

Hva med koblinger ikke bare til tidligere, men også til fremtidige rammer for å gi enda bedre komprimering?! Dette er i utgangspunktet en B-ramme (toveis ramme).

Hvordan fungerer en videokodek? Del 1: GrunnleggendeHvordan fungerer en videokodek? Del 1: GrunnleggendeHvordan fungerer en videokodek? Del 1: Grunnleggende

Midlertidig tilbaketrekning

Disse rammetypene brukes for å gi best mulig kompresjon. Vi skal se på hvordan dette skjer i neste avsnitt. For nå, la oss merke seg at det mest "dyre" når det gjelder minneforbruk er I-rammen, P-rammen er merkbart billigere, men det mest lønnsomme alternativet for video er B-rammen.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Temporal redundans (inter-frame prediksjon)

La oss se på hvilke alternativer vi har for å minimere repetisjon over tid. Vi kan løse denne typen redundans ved å bruke kryssprediksjonsmetoder.

Vi vil prøve å bruke så få biter som mulig for å kode en sekvens av rammer 0 og 1.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Vi kan produsere subtraksjon, trekker vi ganske enkelt ramme 1 fra ramme 0. Vi får ramme 1, bruker bare forskjellen mellom den og forrige ramme, faktisk koder vi bare den resulterende resten.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Men hva om jeg fortalte deg at det finnes en enda bedre metode som bruker enda færre biter?! Først, la oss bryte ramme 0 inn i et klart rutenett bestående av blokker. Og så prøver vi å matche blokkene fra ramme 0 med ramme 1. Med andre ord vil vi estimere bevegelsen mellom rammer.

Fra Wikipedia - blokkere bevegelseskompensasjon

Blokkbevegelseskompensasjon deler den gjeldende rammen inn i ikke-overlappende blokker og bevegelseskompensasjonsvektoren rapporterer opprinnelsen til blokkene (en vanlig misoppfatning er at forrige rammen er delt inn i ikke-overlappende blokker, og bevegelseskompensasjonsvektorer forteller hvor disse blokkene går. Men faktisk er det omvendt - det er ikke den forrige rammen som analyseres, men den neste; det er ikke klart hvor blokkene beveger seg, men hvor de kom fra). Typisk overlapper kildeblokkene i kilderammen. Noen videokomprimeringsalgoritmer setter sammen den gjeldende rammen fra deler av ikke en gang én, men flere tidligere overførte rammer.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Under evalueringsprosessen ser vi at ballen har beveget seg fra (x= 0, y=25) til (x= 6, y=26), verdier x и y bestemme bevegelsesvektoren. Et annet trinn vi kan gjøre for å bevare biter er å kode bare forskjellen av bevegelsesvektorer mellom den siste blokkposisjonen og den forutsagte, så den endelige bevegelsesvektoren vil være (x=6-0=6, y=26-25=1 ).

I en reell situasjon ville denne ballen bli delt inn i n blokkerer, men dette endrer ikke sakens essens.

Objekter i rammen beveger seg i tre dimensjoner, så når ballen beveger seg, kan den bli visuelt mindre (eller større hvis den beveger seg mot betrakteren). Det er normalt at det ikke blir en perfekt match mellom blokkene. Her er en kombinert oversikt over anslaget vårt og det virkelige bildet.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Men vi ser at når vi bruker bevegelsesestimering, er det merkbart mindre data for koding enn når vi bruker en enklere metode for å beregne delta mellom rammer.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Hvordan ekte bevegelseskompensasjon vil se ut

Denne teknikken brukes på alle blokker samtidig. Ofte vil vår betingede bevegelige ball være delt inn i flere blokker samtidig.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Du kan få en følelse av disse konseptene selv ved å bruke jupyter.

For å se bevegelsesvektorer kan du lage en ekstern prediksjonsvideo ved å bruke ffmpeg.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Du kan også bruke Intel Video Pro Analyzer (det er betalt, men det er en gratis prøveversjon som er begrenset til kun de ti første rammene).

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Romlig redundans (intern prognose)

Hvis vi analyserer hvert bilde i en video, vil vi finne mange sammenhengende områder.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

La oss gå gjennom dette eksemplet. Denne scenen består hovedsakelig av blå og hvite farger.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Dette er en I-frame. Vi kan ikke ta tidligere rammer for prediksjon, men vi kan komprimere den. La oss kode utvalget av den røde blokken. Hvis vi ser på naboene, merker vi at det er noen fargetrender rundt den.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Vi antar at farger sprer seg vertikalt i rammen. Hvilket betyr at fargen på de ukjente pikslene vil inneholde verdiene til naboene.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

En slik prognose kan vise seg å være feil. Det er av denne grunn at du må bruke denne metoden (intern prognose), og deretter trekke fra de virkelige verdiene. Dette vil gi oss en restblokk, som vil resultere i en mye mer komprimert matrise sammenlignet med originalen.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Hvis du vil øve med interne spådommer, kan du lage en video av makroblokker og deres spådommer ved å bruke ffmpeg. For å forstå betydningen av hver blokkfarge, må du lese ffmpeg-dokumentasjonen.

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Eller du kan bruke Intel Video Pro Analyzer (som jeg nevnte ovenfor, den gratis prøveversjonen er begrenset til de første 10 rammene, men dette vil være nok for deg først).

Hvordan fungerer en videokodek? Del 1: Grunnleggende

Andre del: Hvordan videokodeken fungerer

Kilde: www.habr.com

Legg til en kommentar