Hvordan fungerer et video-codec? Del 1: Grundlæggende

Anden del: Sådan fungerer video-codec

Ethvert raster billede kan repræsenteres i formen todimensionel matrix. Når det kommer til farver, kan ideen udvikles ved at se på et billede som tredimensionel matrix, hvor yderligere dimensioner bruges til at gemme data for hver af farverne.

Hvis vi betragter den endelige farve som en kombination af den såkaldte. primære farver (rød, grøn og blå), i vores tredimensionelle matrix definerer vi tre planer: den første for rød, den anden for grøn og den sidste for blå.
Hvordan fungerer et video-codec? Del 1: Grundlæggende
Vi vil kalde hvert punkt i denne matrix for en pixel (billedelement). Hver pixel indeholder information om intensiteten (normalt som en numerisk værdi) af hver farve. For eksempel, rød pixel betyder, at den indeholder 0 grøn, 0 blå og maksimal rød. Pink pixel kan dannes ved hjælp af en kombination af tre farver. Ved at bruge et numerisk område fra 0 til 255 defineres en pink pixel som Rød = 255, Grøn = 192 и Blå = 203.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Denne artikel blev offentliggjort med støtte fra EDISON.

Vi udvikler os applikationer til videoovervågning, videostreaming, og vi er også forlovede videooptagelse i operationsstuen.

Alternative måder at kode et farvebillede på

Der er mange andre modeller til at repræsentere de farver, der udgør et billede. For eksempel kan du bruge en indekseret palette, som kun kræver én byte for at repræsentere hver pixel, i stedet for de tre, der kræves, når du bruger RGB-modellen. I en sådan model er det muligt at bruge en 2D-matrix i stedet for en 3D-matrix til at repræsentere hver farve. Dette sparer hukommelse, men giver et mindre farveskala.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

RGB

Tag for eksempel et kig på dette billede nedenfor. Det første ansigt er fuldstændig malet. De andre er de røde, grønne og blå planer (intensiteterne af de tilsvarende farver er vist i gråtoner).

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Vi ser, at nuancerne af rød i originalen vil være på de samme steder, hvor de lyseste dele af det andet ansigt observeres. Mens blues bidrag hovedsageligt kun kan ses i Marios øjne (sidste ansigt) og elementer af hans tøj. Læg mærke til, hvor alle tre farveplaner bidrager mindst (de mørkeste dele af billederne) - Marios overskæg.

For at gemme intensiteten af ​​hver farve kræves et vist antal bits - denne mængde kaldes bit dybde. Lad os sige, at der bruges 8 bits (baseret på en værdi fra 0 til 255) pr. farveplan. Så har vi en farvedybde på 24 bit (8 bit * 3 R/G/B planer).

En anden egenskab ved et billede er tilladelse, som er antallet af pixels i én dimension. Ofte betegnet som bredde × højde, som i 4 gange 4 eksempelbilledet nedenfor.
Hvordan fungerer et video-codec? Del 1: Grundlæggende

En anden egenskab vi beskæftiger os med, når vi arbejder med billeder/videoer er billedformat, der beskriver det normale proportionale forhold mellem bredden og højden af ​​et billede eller en pixel.

Når de siger, at en bestemt film eller et bestemt billede er 16 gange 9 i størrelse, mener de normalt skærmstørrelsesforhold (MEN - fra Vis billedformat). Men nogle gange kan der være forskellige former for individuelle pixels - i dette tilfælde taler vi om pixelforhold (PAR - fra Pixel Aspect Ratio).

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Bemærkning til værtinden: DVD svarer til DAR 4 til 3

Selvom den faktiske DVD-opløsning er 704x480, bevarer den stadig et 4:3 billedformat, fordi PAR er 10:11 (704x10 / 480x11).

Og endelig kan vi bestemme видео som en sekvens af n rammer for perioden tid, hvilket kan betragtes som en ekstra dimension. EN n så er billedhastigheden eller antallet af billeder pr. sekund (FPS - fra Billeder i sekundet).

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Antallet af bits per sekund, der kræves for at vise en video, er dens transmissionshastighedbitrate.

bitrate = bredde * højde * bitdybde * billeder pr. sekund

For eksempel ville en 30 fps, 24 bps, 480x240 video kræve 82,944,000 bps eller 82,944 Mbps (30x480x240x24) - men det er hvis der ikke bruges en komprimeringsmetode.

Hvis overførselshastigheden næsten konstant, så hedder det konstant transmissionshastighed (CBR - fra konstant bithastighed). Men det kan også variere, i dette tilfælde kaldes det variabel baudrate (VBR - fra variabel bithastighed).

Denne graf viser begrænset VBR, hvor der ikke spildes for mange bits i tilfælde af en helt mørk ramme.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Ingeniører udviklede oprindeligt en metode til at fordoble den opfattede billedhastighed af en videoskærm uden at bruge yderligere båndbredde. Denne metode er kendt som interlaced video; Som udgangspunkt sender den halvdelen af ​​skærmen i den første "frame" og den anden halvdel i den næste "frame".

I øjeblikket er scener for det meste gengivet vha progressive scanningsteknologier. Det er en metode til visning, lagring eller transmission af levende billeder, hvor alle linjer i hver ramme tegnes sekventielt.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Godt! Nu er vi klar over, hvordan et billede er repræsenteret digitalt, hvordan dets farver er arrangeret, hvor mange bits pr. sekund vi bruger på at vise video, hvis bithastigheden er konstant (CBR) eller variabel (VBR). Vi kender til en given opløsning ved hjælp af en given billedhastighed, vi kender til mange andre udtryk, såsom interlaced video, PAR og nogle andre.

Fjernelse af redundans

Det er kendt, at video uden komprimering ikke kan bruges normalt. En timelang video med 720p opløsning og 30 billeder i sekundet ville fylde 278 GB. Vi kommer frem til denne værdi ved at gange 1280 x 720 x 24 x 30 x 3600 (bredde, højde, bits pr. pixel, FPS og tid i sekunder).

Brug tabsfri komprimeringsalgoritmer, ligesom DEFLATE (brugt i PKZIP, Gzip og PNG), vil ikke reducere den nødvendige båndbredde nok. Vi er nødt til at lede efter andre måder at komprimere video på.

For at gøre dette kan du bruge funktionerne i vores vision. Vi er bedre til at skelne mellem lysstyrke end farve. En video er en serie af sekventielle billeder, der gentages over tid. Der er små forskelle mellem tilstødende billeder af den samme scene. Derudover indeholder hver ramme mange områder, der bruger den samme (eller lignende) farve.

Farve, lysstyrke og vores øjne

Vores øjne er mere følsomme over for lysstyrke end over for farve. Du kan selv se dette ved at se på dette billede.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Hvis du ikke kan se det på venstre halvdel af billedet, farverne på firkanterne A и B er faktisk de samme, så er det normalt. Vores hjerne tvinger os til at være mere opmærksomme på lys og skygge frem for farve. På højre side mellem de angivne firkanter er der en jumper af samme farve - så vi (dvs. vores hjerne) bestemmer nemt, at de faktisk har samme farve.

Lad os se (på en forenklet måde) på, hvordan vores øjne fungerer. Øjet er et komplekst organ, der består af mange dele. Vi er dog mest interesserede i kogler og stænger. Øjet indeholder omkring 120 millioner stænger og 6 millioner kegler.

Lad os betragte opfattelsen af ​​farve og lysstyrke som separate funktioner for visse dele af øjet (faktisk er alt noget mere kompliceret, men vi vil forenkle det). Stangceller er hovedsageligt ansvarlige for lysstyrke, mens kegleceller er ansvarlige for farve. Kegler er opdelt i tre typer, afhængigt af hvilket pigment de indeholder: S-kegler (blå), M-kegler (grøn) og L-kegler (rød).

Da vi har mange flere stænger (lysstyrke) end kegler (farve), kan vi konkludere, at vi er mere i stand til at skelne overgange mellem mørke og lyse end farver.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Kontrastfølsomhedsfunktioner

Forskere inden for eksperimentel psykologi og mange andre områder har udviklet mange teorier om menneskets syn. Og en af ​​dem hedder kontrastfølsomhedsfunktioner. De er relateret til rumlig og tidsmæssig belysning. Kort sagt handler det om, hvor mange ændringer der skal til, før en observatør bemærker dem. Bemærk flertallet af ordet "funktion". Dette skyldes det faktum, at vi kan måle kontrastfølsomhedsfunktioner ikke kun for sort/hvide billeder, men også for farvebilleder. Resultaterne af disse eksperimenter viser, at vores øjne i de fleste tilfælde er mere følsomme over for lysstyrke end over for farve.

Da vi ved, at vi er mere følsomme over for billedlysstyrke, kan vi prøve at bruge dette faktum.

Farve model

Vi fandt lidt ud af, hvordan man arbejder med farvebilleder ved hjælp af RGB-skemaet. Der er også andre modeller. Der er en model, der adskiller luminans fra chroma, og den er kendt som YCbCr. Forresten er der andre modeller, der laver en lignende opdeling, men vi vil kun overveje denne.

I denne farvemodel Y er en repræsentation af lysstyrke og bruger også to farvekanaler: Cb (rig blå) og Cr (rig rød). YCbCr kan afledes fra RGB, og den omvendte konvertering er også mulig. Ved at bruge denne model kan vi skabe fuldfarvebilleder, som vi ser nedenfor:

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Konverter mellem YCbCr og RGB

Nogen vil protestere: hvordan er det muligt at få alle farverne, hvis grøn ikke bruges?

For at besvare dette spørgsmål, lad os konvertere RGB til YCbCr. Lad os bruge koefficienterne i standarden BT.601, som blev anbefalet af enheden ITU-R. Denne division sætter standarderne for digital video. For eksempel: hvad er 4K? Hvad skal billedhastigheden, opløsningen, farvemodellen være?

Lad os først beregne lysstyrken. Lad os bruge konstanterne foreslået af ITU og erstatte RGB-værdierne.

Y = 0.299R + 0.587G + 0.114B

Når vi har lysstyrken, adskiller vi de blå og røde farver:

Cb = 0.564(BY)

Cr = 0.713(RY)

Og vi kan også konvertere tilbage og endda blive grøn ved hjælp af YCbCr:

R = Y + 1.402Cr

B = Y + 1.772Cb

G = Y - 0.344Cb - 0.714Cr

Typisk bruger skærme (skærme, tv, skærme osv.) kun RGB-modellen. Men denne model kan organiseres på forskellige måder:

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Farveundersampling

Med et billede repræsenteret som en kombination af luminans og krominans kan vi udnytte det menneskelige visuelle systems større følsomhed over for luminans end for krominans ved selektivt at fjerne information. Chroma subsampling er en metode til at indkode billeder med mindre opløsning for chroma end for luminans.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Hvor meget er det tilladt at reducere farveopløsningen?! Det viser sig, at der allerede er nogle diagrammer, der beskriver, hvordan man håndterer opløsning og fletning (Resulterende farve = Y + Cb + Cr).

Disse ordninger er kendt som downsampling systemer og er udtrykt som et 3-dobbelt forhold - a:x:y, som bestemmer antallet af prøver af luminans- og farveforskelsignaler.

a — horisontal prøveudtagningsstandard (normalt lig med 4)
x — antal chroma-eksempler i den første række af pixels (vandret opløsning i forhold til a)
y — antallet af ændringer i chroma samples mellem den første og anden række af pixel.

Undtagelsen er 4:1:0, hvilket giver en chroma-prøve i hver 4 x 4 luminansopløsningsblok.

Almindelige skemaer, der bruges i moderne codecs:

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

YCbCr 4:2:0 - fusionseksempel

Her er et flettet billede ved hjælp af YCbCr 4:2:0. Bemærk, at vi kun bruger 12 bits pr. pixel.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Sådan ser det samme billede ud, kodet med hovedtyperne af farvesubsampling. Den første række er den sidste YCbCr, den nederste række viser chroma opløsningen. Meget anstændige resultater i betragtning af det lille kvalitetstab.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Kan du huske, da vi talte 278 GB lagerplads til at gemme en timelang videofil med 720p opløsning og 30 billeder i sekundet? Hvis vi bruger YCbCr 4:2:0, så reduceres denne størrelse med det halve - 139 GB. Indtil videre er det stadig langt fra et acceptabelt resultat.

Du kan selv få YCbCr-histogrammet ved hjælp af FFmpeg. På dette billede dominerer blåt over rødt, hvilket tydeligt ses i selve histogrammet.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Farve, lysstyrke, farveskala - videoanmeldelse

Vi anbefaler at se denne fantastiske video. Den forklarer, hvad lysstyrke er, og generelt er alle prikkerne prikket ё om lysstyrke og farve.

Rammetyper

Lad os gå videre. Lad os prøve at eliminere tidsredundansen. Men lad os først definere noget grundlæggende terminologi. Lad os sige, at vi har en film med 30 billeder i sekundet, her er de første 4 billeder:

Hvordan fungerer et video-codec? Del 1: Grundlæggende Hvordan fungerer et video-codec? Del 1: Grundlæggende Hvordan fungerer et video-codec? Del 1: Grundlæggende Hvordan fungerer et video-codec? Del 1: Grundlæggende

Vi kan se mange gentagelser i rammerne: for eksempel en blå baggrund, der ikke ændrer sig fra ramme til ramme. For at løse dette problem kan vi abstrakt klassificere dem i tre typer rammer.

I-frame (Intro Frame)

I-frame (referenceramme, nøgleramme, indre ramme) er selvstændig. Uanset hvad du vil visualisere, er en I-frame i bund og grund et statisk fotografi. Den første frame er normalt en I-frame, men vi vil jævnligt observere I-frames selv blandt ikke de første frames.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

P-ramme (Pforudsagt ramme)

P-frame (predictive frame) udnytter det faktum, at det aktuelle billede næsten altid kan gengives ved hjælp af det forrige billede. For eksempel, i den anden ramme er den eneste ændring, at bolden bevæger sig fremad. Vi kan få frame 2 ved blot at ændre ramme 1 lidt, kun ved at bruge forskellen mellem disse frames. For at konstruere ramme 2, henviser vi til den foregående ramme 1.

Hvordan fungerer et video-codec? Del 1: GrundlæggendeHvordan fungerer et video-codec? Del 1: Grundlæggende

B-ramme (Bi-prædiktiv ramme)

Hvad med links ikke kun til tidligere, men også til fremtidige frames for at give endnu bedre komprimering?! Dette er grundlæggende en B-ramme (tovejsramme).

Hvordan fungerer et video-codec? Del 1: GrundlæggendeHvordan fungerer et video-codec? Del 1: GrundlæggendeHvordan fungerer et video-codec? Del 1: Grundlæggende

Midlertidig tilbagetrækning

Disse rammetyper bruges til at give den bedst mulige kompression. Vi vil se på, hvordan dette sker i næste afsnit. Indtil videre, lad os bemærke, at den mest "dyre" med hensyn til forbrugt hukommelse er I-frame, P-frame er mærkbart billigere, men den mest rentable mulighed for video er B-frame.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Tidsmæssig redundans (inter-frame forudsigelse)

Lad os se på, hvilke muligheder vi har for at minimere gentagelser over tid. Vi kan løse denne type redundans ved hjælp af krydsforudsigelsesmetoder.

Vi vil forsøge at bruge så få bits som muligt på at kode en sekvens af frames 0 og 1.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Vi kan producere subtraktion, trækker vi blot frame 1 fra frame 0. Vi får frame 1, brug kun forskellen mellem den og den forrige frame, faktisk koder vi kun den resulterende rest.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Men hvad nu hvis jeg fortalte dig, at der er en endnu bedre metode, der bruger endnu færre bits?! Lad os først bryde ramme 0 op i et klart gitter bestående af blokke. Og så vil vi forsøge at matche blokkene fra ramme 0 med ramme 1. Med andre ord vil vi estimere bevægelsen mellem rammer.

Fra Wikipedia - blokere bevægelseskompensation

Blokbevægelseskompensation opdeler den aktuelle ramme i ikke-overlappende blokke, og bevægelseskompensationsvektoren rapporterer oprindelsen af ​​blokkene (en almindelig misforståelse er, at tidligere rammen er opdelt i ikke-overlappende blokke, og bevægelseskompensationsvektorer fortæller, hvor disse blokke går. Men faktisk er det omvendt - det er ikke den forrige ramme, der analyseres, men den næste; det er ikke klart, hvor blokkene bevæger sig, men hvor de kom fra). Typisk overlapper kildeblokkene i kilderammen. Nogle videokomprimeringsalgoritmer samler den aktuelle frame fra dele af ikke engang én, men flere tidligere transmitterede frames.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Under evalueringsprocessen ser vi, at bolden har flyttet sig fra (x= 0, y=25) til (x= 6, y=26), værdier x и y bestemme bevægelsesvektoren. Et andet trin, vi kan gøre for at bevare bits, er kun at kode forskellen på bevægelsesvektorer mellem den sidste blokposition og den forudsagte, så den endelige bevægelsesvektor vil være (x=6-0=6, y=26-25=1 ).

I en reel situation ville denne bold blive opdelt i n blokerer, men det ændrer ikke ved sagens væsen.

Objekter i rammen bevæger sig i tre dimensioner, så når bolden bevæger sig, kan den visuelt blive mindre (eller større, hvis den bevæger sig mod beskueren). Det er normalt, at der ikke vil være et perfekt match mellem blokkene. Her er et kombineret billede af vores skøn og det virkelige billede.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Men vi ser, at når vi bruger bevægelsesestimering, er der mærkbart mindre data til kodning, end når vi bruger en enklere metode til at beregne deltaet mellem frames.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Hvordan reel bevægelseskompensation ville se ud

Denne teknik anvendes på alle blokke på én gang. Ofte vil vores betingede bevægelige bold være opdelt i flere blokke på én gang.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Du kan selv få en fornemmelse af disse begreber jupyter.

For at se bevægelsesvektorer kan du oprette en ekstern forudsigelsesvideo ved hjælp af ffmpeg.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Du kan også bruge Intel Video Pro Analyzer (det er betalt, men der er en gratis prøveperiode, der kun er begrænset til de første ti billeder).

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Rumlig redundans (intern prognose)

Hvis vi analyserer hvert enkelt billede i en video, vil vi finde mange indbyrdes forbundne områder.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Lad os gennemgå dette eksempel. Denne scene består hovedsageligt af blå og hvide farver.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Dette er en I-frame. Vi kan ikke tage tidligere frames til forudsigelse, men vi kan komprimere det. Lad os kode valget af den røde blok. Hvis vi ser på dens naboer, bemærker vi, at der er nogle farvetrends omkring den.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Vi antager, at farver spredes lodret i rammen. Hvilket betyder, at farven på de ukendte pixels vil indeholde værdierne for dens naboer.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

En sådan prognose kan vise sig at være forkert. Det er af denne grund, at du skal anvende denne metode (intern prognose) og derefter trække de reelle værdier fra. Dette vil give os en restblok, som vil resultere i en meget mere komprimeret matrix sammenlignet med originalen.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Hvis du vil øve dig med interne forudsigelser, kan du oprette en video af makroblokke og deres forudsigelser ved hjælp af ffmpeg. For at forstå betydningen af ​​hver blokfarve skal du læse ffmpeg-dokumentationen.

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Eller du kan bruge Intel Video Pro Analyzer (som jeg nævnte ovenfor, er den gratis prøveversion begrænset til de første 10 billeder, men dette vil være nok for dig i starten).

Hvordan fungerer et video-codec? Del 1: Grundlæggende

Anden del: Sådan fungerer video-codec

Kilde: www.habr.com

Tilføj en kommentar