Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Die tweede deel: Hoe die video-kodek werk

Enige raster beeld kan in die vorm voorgestel word tweedimensionele matriks. Wanneer dit by kleure kom, kan die idee ontwikkel word deur na 'n beeld te kyk as driedimensionele matriks, waarin bykomende afmetings gebruik word om data vir elk van die kleure te stoor.

As ons die finale kleur as 'n kombinasie van die sogenaamde. primêre kleure (rooi, groen en blou), in ons driedimensionele matriks definieer ons drie vlakke: die eerste vir rooi, die tweede vir groen en die laaste vir blou.
Hoe werk 'n video-kodek? Deel 1: Basiese beginsels
Ons sal elke punt in hierdie matriks 'n pixel (beeldelement) noem. Elke pixel bevat inligting oor die intensiteit (gewoonlik as 'n numeriese waarde) van elke kleur. Byvoorbeeld, rooi pixel beteken dat dit 0 groen, 0 blou en maksimum rooi bevat. Pienk pixel kan gevorm word deur 'n kombinasie van drie kleure te gebruik. Deur 'n numeriese reeks van 0 tot 255 te gebruik, word 'n pienk pixel gedefinieer as Rooi = 255, Groen = 192 и Blou = 203.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Hierdie artikel is gepubliseer met die ondersteuning van EDISON.

Ons ontwikkel toepassings vir videobewaking, videostroom, en ook ons ​​is verloof video-opname in die chirurgiese kamer.

Alternatiewe maniere om 'n kleurprent te enkodeer

Daar is baie ander modelle vir die voorstelling van die kleure waaruit 'n beeld bestaan. Byvoorbeeld, jy kan 'n geïndekseer palet gebruik, wat slegs een greep vereis om elke pixel voor te stel, in plaas van die drie wat nodig is wanneer die RGB-model gebruik word. In so 'n model is dit moontlik om 'n 2D-matriks in plaas van 'n 3D-matriks te gebruik om elke kleur voor te stel. Dit bespaar geheue, maar gee 'n kleiner kleurspektrum.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

RGB

Kyk byvoorbeeld na hierdie prentjie hieronder. Die eerste gesig is heeltemal geverf. Die ander is die rooi, groen en blou vlakke (die intensiteite van die ooreenstemmende kleure word in grysskaal getoon).

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Ons sien dat die skakerings van rooi in die oorspronklike op dieselfde plekke sal wees waar die helderste dele van die tweede gesig waargeneem word. Terwyl blou se bydrae hoofsaaklik net in Mario se oë (laaste gesig) en elemente van sy kleredrag gesien kan word. Let op waar al drie kleurvlakke die minste bydra (die donkerste dele van die beelde) - Mario se snor.

Om die intensiteit van elke kleur te stoor, word 'n sekere aantal bisse benodig - hierdie hoeveelheid word genoem bietjie diepte. Kom ons sê 8 bisse word spandeer (gebaseer op 'n waarde van 0 tot 255) per kleurvlak. Dan het ons 'n kleurdiepte van 24 bisse (8 bisse * 3 R/G/B-vlakke).

Nog 'n eienskap van 'n beeld is resolusie, wat die aantal pixels in een dimensie is. Dikwels aangedui as breedte × hoogte, soos in die 4 by 4 voorbeeldprent hieronder.
Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Nog 'n eiendom waarmee ons te doen het wanneer ons met beelde/video's werk, is beeldverhouding, wat die normale proporsionele verhouding tussen die breedte en hoogte van 'n beeld of pixel beskryf.

Wanneer hulle sê dat 'n sekere film of prent 16 by 9 groot is, bedoel hulle gewoonlik vertoon aspekverhouding (DAR - van Vertoon Aspekverhouding). Soms kan daar egter verskillende vorms van individuele pixels wees - in hierdie geval praat ons van pixel verhouding (PAR - van Pixel Aspekverhouding).

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Nota aan die gasvrou: DVD соответствует DAR 4 tot 3

Alhoewel die werklike DVD-resolusie 704x480 is, handhaaf dit steeds 'n 4:3-aspekverhouding omdat die PAR 10:11 (704x10 / 480x11) is.

En uiteindelik kan ons bepaal video soos 'n volgorde van n rame vir die tydperk tyd, wat as 'n bykomende dimensie beskou kan word. A n dan is die raamtempo of die aantal rame per sekonde (FPS - van Rame per sekonde).

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Die aantal bisse per sekonde wat nodig is om 'n video te vertoon, is sy transmissie spoed - bitsnelheid.

bitsnelheid = breedte * hoogte * bietjie diepte * rame per sekonde

Byvoorbeeld, 'n 30 fps, 24 bps, 480x240 video sal 82,944,000 bps of 82,944 Mbps (30x480x240x24) vereis - maar dit is as geen kompressiemetode gebruik word nie.

As die oordrag spoed byna konstant, dan word dit genoem konstante transmissiespoed (CBR - van konstante bistempo). Maar dit kan ook verskil, in hierdie geval word dit genoem veranderlike baud rate (VBR - van veranderlike bitsnelheid).

Hierdie grafiek toon beperkte VBR, waar nie te veel stukkies vermors word in die geval van 'n heeltemal donker raam nie.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Ingenieurs het aanvanklik 'n metode ontwikkel om die waargenome raamtempo van 'n videoskerm te verdubbel sonder om bykomende bandwydte te gebruik. Hierdie metode staan ​​bekend as interlaced video; Basies stuur dit die helfte van die skerm in die eerste "raam" en die ander helfte in die volgende "raam".

Tans word tonele meestal weergegee met behulp van progressiewe skanderingstegnologieë. Dit is 'n metode om bewegende beelde te vertoon, te stoor of oor te dra waarin al die lyne van elke raam opeenvolgend geteken word.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Wel! Nou is ons bewus van hoe 'n beeld digitaal voorgestel word, hoe sy kleure gerangskik is, hoeveel bisse per sekonde ons spandeer om video te wys, as die bistempo konstant (CBR) of veranderlik (VBR) is. Ons weet van 'n gegewe resolusie wat 'n gegewe raamtempo gebruik, ons is vertroud met baie ander terme, soos interlaced video, PAR en 'n paar ander.

Verwydering van oortolligheid

Dit is bekend dat video sonder kompressie nie normaalweg gebruik kan word nie. ’n Uurlange video teen 720p-resolusie en 30 rame per sekonde sal 278 GB in beslag neem. Ons kom by hierdie waarde uit deur 1280 x 720 x 24 x 30 x 3600 (breedte, hoogte, bisse per pixel, FPS en tyd in sekondes) te vermenigvuldig.

Gebruik verlieslose kompressie-algoritmes, soos DEFLATE (gebruik in PKZIP, Gzip en PNG), sal nie die vereiste bandwydte genoeg verminder nie. Ons moet ander maniere soek om video saam te komprimeer.

Om dit te doen, kan u die kenmerke van ons visie gebruik. Ons is beter om helderheid as kleur te onderskei. 'n Video is 'n reeks opeenvolgende beelde wat oor tyd herhaal. Daar is klein verskille tussen aangrensende rame van dieselfde toneel. Daarbenewens bevat elke raam baie areas wat dieselfde (of soortgelyke) kleur gebruik.

Kleur, helderheid en ons oë

Ons oë is meer sensitief vir helderheid as vir kleur. Jy kan dit self sien deur na hierdie prentjie te kyk.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

As jy nie die kleure van die blokkies aan die linkerkant van die prent sien nie A и B is eintlik dieselfde, dan is dit normaal. Ons brein dwing ons om meer aandag te gee aan lig en skadu eerder as kleur. Aan die regterkant tussen die aangewese blokkies is daar 'n springer van dieselfde kleur - so ons (d.i. ons brein) bepaal maklik dat hulle in werklikheid dieselfde kleur is.

Kom ons kyk (op 'n vereenvoudigde manier) na hoe ons oë werk. Die oog is 'n komplekse orgaan wat uit baie dele bestaan. Ons stel egter die meeste belang in keëls en stokke. Die oog bevat ongeveer 120 miljoen stokke en 6 miljoen keëls.

Kom ons beskou die persepsie van kleur en helderheid as afsonderlike funksies van sekere dele van die oog (in werklikheid is alles ietwat meer ingewikkeld, maar ons sal dit vereenvoudig). Staafselle is hoofsaaklik verantwoordelik vir helderheid, terwyl keëlselle vir kleur verantwoordelik is. Kegels word in drie tipes verdeel, afhangende van die pigment wat hulle bevat: S-keëls (blou), M-keëls (groen) en L-keëls (rooi).

Aangesien ons baie meer stawe (helderheid) as keëls (kleur) het, kan ons aflei dat ons meer in staat is om oorgange tussen donker en lig te onderskei as kleure.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Kontrasgevoeligheidskenmerke

Navorsers in eksperimentele sielkunde en baie ander velde het baie teorieë oor menslike visie ontwikkel. En een van hulle word genoem kontras sensitiwiteit funksies. Hulle hou verband met ruimtelike en tydelike beligting. Kortom, dit gaan oor hoeveel veranderinge nodig is voordat 'n waarnemer dit opmerk. Let op die meervoud van die woord "funksie". Dit is te danke aan die feit dat ons kontrasensitiwiteitsfunksies nie net vir swart en wit beelde kan meet nie, maar ook vir kleure. Die resultate van hierdie eksperimente toon dat ons oë in die meeste gevalle meer sensitief is vir helderheid as vir kleur.

Aangesien ons weet dat ons meer sensitief is vir beeldhelderheid, kan ons probeer om hierdie feit te gebruik.

Kleur model

Ons het 'n bietjie uitgevind hoe om met kleurbeelde te werk deur die RGB-skema te gebruik. Daar is ook ander modelle. Daar is 'n model wat luminansie van chroma skei en dit staan ​​bekend as YCbCr. Terloops, daar is ander modelle wat 'n soortgelyke verdeling maak, maar ons sal net hierdie een oorweeg.

In hierdie kleurmodel Y is 'n voorstelling van helderheid, en gebruik ook twee kleurkanale: Cb (ryk blou) en Cr (ryk rooi). YCbCr kan van RGB afgelei word, en die omgekeerde omskakeling is ook moontlik. Deur hierdie model te gebruik, kan ons volkleur beelde skep soos ons hieronder sien:

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Skakel tussen YCbCr en RGB

Iemand sal beswaar maak: hoe is dit moontlik om al die kleure te kry as groen nie gebruik word nie?

Om hierdie vraag te beantwoord, laat ons RGB na YCbCr omskakel. Kom ons gebruik die koëffisiënte wat in die standaard aangeneem is BT.601, wat deur die eenheid aanbeveel is ITU-R. Hierdie afdeling stel die standaarde vir digitale video. Byvoorbeeld: wat is 4K? Wat moet die raamtempo, resolusie, kleurmodel wees?

Kom ons bereken eers die helderheid. Kom ons gebruik die konstantes wat deur die ITU voorgestel word en vervang die RGB-waardes.

Y = 0.299R + 0.587G + 0.114B

Nadat ons die helderheid het, sal ons die blou en rooi kleure skei:

Cb = 0.564(B - Y)

Cr = 0.713(R - Y)

En ons kan ook terugskakel en selfs groen word met YCbCr:

R = Y + 1.402Cr

B = Y + 1.772Cb

G = Y - 0.344Cb - 0.714Cr

Tipies gebruik skerms (monitors, TV's, skerms, ens.) slegs die RGB-model. Maar hierdie model kan op verskillende maniere georganiseer word:

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Kleur substeekproefneming

Met 'n beeld wat voorgestel word as 'n kombinasie van luminansie en chrominansie, kan ons die menslike visuele sisteem se groter sensitiwiteit vir luminansie as vir chrominansie ontgin deur inligting selektief te verwyder. Chroma-substeekproefneming is 'n metode om beelde te kodeer met minder resolusie vir chroma as vir luminansie.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Hoeveel is dit toelaatbaar om die kleurresolusie te verminder?! Dit blyk dat daar reeds 'n paar diagramme is wat beskryf hoe om resolusie en samesmelting te hanteer (Gevolglike Kleur = Y + Cb + Cr).

Hierdie skemas staan ​​bekend as afsteekproefstelsels en word uitgedruk as 'n 3-voudige verhouding - a:x:y, wat die aantal monsters van luminansie- en kleurverskilseine bepaal.

a — horisontale steekproefstandaard (gewoonlik gelyk aan 4)
x - aantal chroma-monsters in die eerste ry pixels (horisontale resolusie relatief tot a)
y — die aantal veranderinge in chroma-monsters tussen die eerste en tweede rye pixels.

Die uitsondering is 4:1:0, wat een chroma-monster in elke 4-by-4 luminansie resolusieblok verskaf.

Algemene skemas wat in moderne codecs gebruik word:

  • 4:4:4 (geen afsteekproefneming nie)
  • 4:2:2
  • 4:1:1
  • 4:2:0
  • 4:1:0
  • 3:1:1

YCbCr 4:2:0 - samesmeltingsvoorbeeld

Hier is 'n saamgevoegde beeld wat YCbCr 4:2:0 gebruik. Let daarop dat ons slegs 12 bisse per pixel spandeer.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Dit is hoe dieselfde beeld lyk, geënkodeer met die hooftipes kleursubmonstering. Die eerste ry is die finale YCbCr, die onderste ry wys die chroma resolusie. Baie ordentlike resultate, met inagneming van die geringe verlies in kwaliteit.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Onthou jy toe ons 278 GB stoorplek getel het om 'n uurlange videolêer teen 720p-resolusie en 30 rame per sekonde te stoor? As ons YCbCr 4:2:0 gebruik, sal hierdie grootte met die helfte verminder word - 139 GB. Tot dusver is dit nog ver van 'n aanvaarbare resultaat.

Jy kan self die YCbCr-histogram kry deur FFmpeg te gebruik. In hierdie beeld oorheers blou oor rooi, wat duidelik sigbaar is in die histogram self.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Kleur, helderheid, kleurspektrum - video-oorsig

Ons beveel aan om hierdie wonderlike video te kyk. Dit verduidelik wat helderheid is, en oor die algemeen is al die kolletjies gestippels ё oor helderheid en kleur.

Raamtipes

Kom ons gaan aan. Kom ons probeer om die tydoortolligheid uit te skakel. Maar eers, kom ons definieer 'n paar basiese terminologie. Kom ons sê ons het 'n fliek met 30 rame per sekonde, hier is sy eerste 4 rame:

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels Hoe werk 'n video-kodek? Deel 1: Basiese beginsels Hoe werk 'n video-kodek? Deel 1: Basiese beginsels Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Ons kan baie herhaling in die rame sien: byvoorbeeld 'n blou agtergrond wat nie van raam tot raam verander nie. Om hierdie probleem op te los, kan ons hulle abstrak in drie tipes rame klassifiseer.

I-raam (Intro-raam)

I-raam (verwysingsraam, sleutelraam, binneraam) is selfstandig. Ongeag wat jy wil visualiseer, 'n I-raam is in wese 'n statiese foto. Die eerste raam is gewoonlik 'n I-raam, maar ons sal gereeld I-rame waarneem selfs onder nie die eerste rame nie.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

P-raam (Pvoorspelde raam)

P-raam (voorspellende raam) maak gebruik van die feit dat byna altyd die huidige beeld met behulp van die vorige raam gereproduseer kan word. Byvoorbeeld, in die tweede raam is die enigste verandering die bal wat vorentoe beweeg. Ons kan raam 2 kry deur eenvoudig raam 1 effens te wysig, slegs deur die verskil tussen hierdie rame te gebruik. Om raam 2 te konstrueer, verwys ons na die voorafgaande raam 1.

Hoe werk 'n video-kodek? Deel 1: Basiese beginselsHoe werk 'n video-kodek? Deel 1: Basiese beginsels

B-raam (Bi-voorspellende raam)

Wat van skakels nie net na verlede nie, maar ook na toekomstige rame om nog beter kompressie te verskaf?! Dit is basies 'n B-raam (tweerigtingraam).

Hoe werk 'n video-kodek? Deel 1: Basiese beginselsHoe werk 'n video-kodek? Deel 1: Basiese beginselsHoe werk 'n video-kodek? Deel 1: Basiese beginsels

Tussentydse onttrekking

Hierdie raamtipes word gebruik om die beste moontlike kompressie te verskaf. Ons sal in die volgende afdeling kyk hoe dit gebeur. Kom ons let vir eers daarop dat die "duurste" in terme van geheue verbruik die I-raam is, die P-raam is merkbaar goedkoper, maar die winsgewendste opsie vir video is die B-raam.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Tydelike oortolligheid (tussenraamvoorspelling)

Kom ons kyk na watter opsies ons het om herhaling oor tyd te verminder. Ons kan hierdie tipe oortolligheid oplos deur kruisvoorspellingsmetodes te gebruik.

Ons sal probeer om so min as moontlik stukkies te spandeer om 'n reeks rame 0 en 1 te enkodeer.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Ons kan produseer aftrekking, trek ons ​​eenvoudig raam 1 van raam 0 af. Ons kry raam 1, gebruik net die verskil tussen dit en die vorige raam, in werklikheid enkodeer ons net die res van die resultaat.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Maar wat as ek jou vertel dat daar 'n selfs beter metode is wat nog minder stukkies gebruik?! Kom ons breek eers raam 0 in 'n duidelike rooster wat uit blokke bestaan. En dan sal ons probeer om die blokke van raam 0 by raam 1 te pas. Met ander woorde, ons sal die beweging tussen rame skat.

Van Wikipedia - blokkeer bewegingskompensasie

Blokbewegingskompensasie verdeel die huidige raam in nie-oorvleuelende blokke en die bewegingskompensasievektor rapporteer die oorsprong van die blokke ('n algemene wanopvatting is dat vorige die raam is verdeel in nie-oorvleuelende blokke, en bewegingskompensasievektore vertel waar daardie blokke gaan. Maar in werklikheid is dit andersom - dit is nie die vorige raam wat ontleed word nie, maar die volgende een; dit is nie duidelik waarheen die blokke beweeg nie, maar waar hulle vandaan kom). Tipies oorvleuel die bronblokke in die bronraam. Sommige video-kompressie-algoritmes stel die huidige raam saam uit dele van nie eens een nie, maar verskeie voorheen versendte rame.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Tydens die evalueringsproses sien ons dat die bal beweeg het van (x= 0, y=25) na (x= 6, y=26), waardes x и y bepaal die bewegingsvektor. Nog 'n stap wat ons kan doen om bisse te bewaar, is om slegs die verskil van bewegingsvektore tussen die laaste blokposisie en die voorspelde een te enkodeer, dus sal die finale bewegingsvektor wees (x=6-0=6, y=26-25=1 ).

In 'n werklike situasie, sou hierdie bal verdeel word in n blokke, maar dit verander nie die essensie van die saak nie.

Voorwerpe in die raam beweeg in drie dimensies, so wanneer die bal beweeg, kan dit visueel kleiner word (of groter as dit na die kyker toe beweeg). Dit is normaal dat daar nie 'n perfekte pasmaat tussen blokke sal wees nie. Hier is 'n gekombineerde aansig van ons skatting en die werklike prentjie.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Maar ons sien dat wanneer ons bewegingskatting gebruik, daar merkbaar minder data vir kodering is as wanneer 'n eenvoudiger metode gebruik word om die delta tussen rame te bereken.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Hoe werklike bewegingskompensasie sou lyk

Hierdie tegniek word gelyktydig op alle blokke toegepas. Dikwels word ons voorwaardelike bewegende bal in verskeie blokke op een slag verdeel.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Jy kan self 'n gevoel kry vir hierdie konsepte jupyter.

Om bewegingsvektore te sien, kan jy 'n eksterne voorspellingsvideo skep met behulp van FFmpeg.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Jy kan ook gebruik Intel Video Pro Analyzer (dit is betaal, maar daar is 'n gratis proeflopie wat slegs tot die eerste tien rame beperk is).

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Ruimtelike oortolligheid (interne voorspelling)

As ons elke raam in 'n video ontleed, sal ons baie onderling gekoppelde areas vind.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Kom ons gaan deur hierdie voorbeeld. Hierdie toneel bestaan ​​hoofsaaklik uit blou en wit kleure.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Dit is 'n I-raam. Ons kan nie vorige rame vir voorspelling neem nie, maar ons kan dit saamdruk. Kom ons enkodeer die keuse van die rooi blok. As ons na sy bure kyk, merk ons ​​dat daar 'n paar kleurneigings rondom dit is.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Ons neem aan dat kleure vertikaal in die raam versprei. Wat beteken dat die kleur van die onbekende pixels die waardes van sy bure sal bevat.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

So 'n voorspelling kan dalk verkeerd blyk te wees. Dit is om hierdie rede dat jy hierdie metode (interne voorspelling) moet toepas en dan die werklike waardes aftrek. Dit sal vir ons 'n oorblywende blok gee, wat sal lei tot 'n baie meer saamgeperste matriks in vergelyking met die oorspronklike.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

As jy met interne voorspellings wil oefen, kan jy 'n video van makroblokke en hul voorspellings skep deur ffmpeg te gebruik. Om die betekenis van elke blokkleur te verstaan, sal jy die ffmpeg-dokumentasie moet lees.

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Of jy kan Intel Video Pro Analyzer gebruik (soos ek hierbo genoem het, die gratis proefweergawe is beperk tot die eerste 10 rame, maar dit sal eers genoeg vir jou wees).

Hoe werk 'n video-kodek? Deel 1: Basiese beginsels

Die tweede deel: Hoe die video-kodek werk

Bron: will.com

Voeg 'n opmerking