Hoe wurket in fideokodek? Diel 1: Basis

Twadde diel: Hoe't de fideokodek wurket

Elke raster ôfbylding kin wurde fertsjintwurdige yn 'e foarm twadiminsjonale matrix. As it giet om kleuren, kin it idee ûntwikkele wurde troch te sjen op in ôfbylding as trijediminsjonale matrix, wêryn ekstra dimensjes brûkt wurde om gegevens foar elk fan 'e kleuren op te slaan.

As wy beskôgje de definitive kleur as in kombinaasje fan de saneamde. primêre kleuren (read, grien en blau), yn ús trijediminsjonale matrix definiearje wy trije fleantugen: de earste foar read, de twadde foar grien en de lêste foar blau.
Hoe wurket in fideokodek? Diel 1: Basis
Wy sille neame elk punt yn dizze matrix in piksel (ôfbylding elemint). Elke piksel befettet ynformaasje oer de yntinsiteit (meastentiids as in numerike wearde) fan elke kleur. Bygelyks, reade piksel betsjut dat it befettet 0 grien, 0 blau en maksimum read. Roze piksel kin wurde foarme mei in kombinaasje fan trije kleuren. Mei in numerike berik fan 0 oant 255 wurdt in rôze piksel definiearre as Red = 255, Grien = 192 и Blau = 203.

Hoe wurket in fideokodek? Diel 1: Basis

Dit artikel waard publisearre mei de stipe fan EDISON.

Wy ûntwikkelje applikaasjes foar fideotafersjoch, fideostreaming, en ek wy binne ferloofd fideo-opname yn 'e sjirurgyske keamer.

Alternative manieren om in kleurôfbylding te kodearjen

D'r binne in protte oare modellen foar it fertsjintwurdigjen fan de kleuren dy't in ôfbylding meitsje. Jo kinne bygelyks in yndeksearre palet brûke, dy't mar ien byte fereasket om elke piksel te fertsjintwurdigjen, ynstee fan 'e trije nedich by it brûken fan it RGB-model. Yn sa'n model is it mooglik om in 2D-matrix te brûken ynstee fan in 3D-matrix om elke kleur te fertsjintwurdigjen. Dit besparret ûnthâld, mar jout in lytsere kleur gamut.

Hoe wurket in fideokodek? Diel 1: Basis

RGB

Sjoch bygelyks nei dizze foto hjirûnder. It earste gesicht is folslein skildere. De oaren binne de reade, griene en blauwe fleantugen (de yntensiteiten fan 'e oerienkommende kleuren wurde werjûn yn griisskalen).

Hoe wurket in fideokodek? Diel 1: Basis

Wy sjogge dat de skaden fan read yn it orizjineel sille wêze op deselde plakken dêr't de helderste dielen fan it twadde gesicht wurde waarnommen. Wylst de bydrage fan blau benammen allinich te sjen is yn 'e eagen fan Mario (lêste gesicht) en eleminten fan syn klean. Merk op wêr't alle trije kleurfleanen it minste bydrage (de tsjusterste dielen fan 'e ôfbyldings) - Mario's snor.

Om de yntinsiteit fan elke kleur op te slaan, is in bepaald oantal bits nedich - dizze kwantiteit wurdt neamd bytsje djipte. Litte wy sizze dat 8 bits wurde bestege (basearre op in wearde fan 0 oant 255) per kleurflak. Dan hawwe wy in kleur djipte fan 24 bits (8 bits * 3 R / G / B fleanmasines).

In oare eigenskip fan in byld is resolúsje, dat is it oantal piksels yn ien diminsje. Faak oantsjutten as breedte × hichte, lykas yn 'e 4 by 4 foarbyldôfbylding hjirûnder.
Hoe wurket in fideokodek? Diel 1: Basis

In oar eigendom wêrmei wy omgeane by it wurkjen mei ôfbyldings / fideo's is aspect ratio, it beskriuwen fan de normale proporsjonele relaasje tusken de breedte en hichte fan in ôfbylding of piksel.

As se sizze dat in bepaalde film of foto 16 by 9 yn grutte is, betsjutte se gewoanlik werjaan aspekt ratio (BUT - fan Display Aspect Ratio). Soms kinne d'r lykwols ferskate foarmen fan yndividuele piksels wêze - yn dit gefal hawwe wy it oer pixel ferhâlding (PAR - fan Pixel Aspect Ratio).

Hoe wurket in fideokodek? Diel 1: Basis

Hoe wurket in fideokodek? Diel 1: Basis

Opmerking foar de gastfrou: DVD соответствует DAR 4 oant 3

Hoewol de eigentlike DVD-resolúsje 704x480 is, hâldt it noch in 4:3-aspektferhâlding, om't de PAR 10:11 is (704x10 / 480x11).

En as lêste kinne wy ​​​​bepale видео as in folchoarder fan n frames foar de perioade tiid, dat kin beskôge wurde as in ekstra diminsje. IN n dan is de frame rate of it oantal frames per sekonde (FPS - fan Bylden per sekonde).

Hoe wurket in fideokodek? Diel 1: Basis

It oantal bits per sekonde nedich om in fideo wer te jaan is har oerdracht snelheid - bitrate.

bitrate = breedte * hichte * bit djipte * frames per sekonde

Bygelyks, in 30 fps, 24 bps, 480x240 fideo soe 82,944,000 bps of 82,944 Mbps (30x480x240x24) nedich wêze - mar dat is as gjin kompresjemetoade wurdt brûkt.

As de oerdracht snelheid hast konstant, dan hjit it konstante oerdracht snelheid (CBR - fan konstante bitrate). Mar it kin ek fariearje, yn dit gefal hjit it fariabele baud rate (VBR - fan fariabele bitrate).

Dizze grafyk toant beheind VBR, dêr't net te folle bits wurde fergriemd yn it gefal fan in folslein tsjuster frame.

Hoe wurket in fideokodek? Diel 1: Basis

Yngenieurs ûntwikkele yn earste ynstânsje in metoade om de waarnommen frame rate fan in fideo werjefte te ferdûbeljen sûnder ekstra bânbreedte te brûken. Dizze metoade is bekend as interlaced video; Yn prinsipe stjoert it de helte fan it skerm yn it earste "frame" en de oare helte yn it folgjende "frame".

Op it stuit wurde sênes meast werjûn mei help progressive skennen technologyen. It is in metoade foar it werjaan, opslaan of ferstjoeren fan bewegende bylden wêryn alle rigels fan elk frame opfolgjend tekene wurde.

Hoe wurket in fideokodek? Diel 1: Basis

Goed! No binne wy ​​bewust fan hoe't in ôfbylding digitaal fertsjintwurdige wurdt, hoe't de kleuren binne arranzjearre, hoefolle bits per sekonde wy besteegje om fideo te sjen, as de bitrate konstant is (CBR) of fariabele (VBR). Wy witte oer in opjûne resolúsje mei in opjûne frame rate, wy binne bekend mei in protte oare termen, lykas ynterlaced video, PAR en guon oaren.

It fuortheljen fan oerstalligens

It is bekend dat fideo sûnder kompresje net normaal kin wurde brûkt. In oere-lange fideo mei 720p-resolúsje en 30 frames per sekonde soe 278 GB opnimme. Wy komme ta dizze wearde troch fermannichfâldigjen 1280 x 720 x 24 x 30 x 3600 (breedte, hichte, bits per piksel, FPS en tiid yn sekonden).

Gebrûk lossless kompresje algoritmen, lykas DEFLATE (brûkt yn PKZIP, Gzip en PNG), sil de fereaske bânbreedte net genôch ferminderje. Wy moatte sykje nei oare manieren om fideo te komprimearjen.

Om dit te dwaan kinne jo de funksjes fan ús fisy brûke. Wy binne better yn it ûnderskieden fan helderheid as kleur. In fideo is in searje opienfolgjende ôfbyldings dy't oer de tiid werhelje. Der binne lytse ferskillen tusken neistlizzende frames fan deselde sêne. Derneist befettet elk frame in protte gebieten mei deselde (as ferlykbere) kleur.

Kleur, helderheid en ús eagen

Us eagen binne gefoeliger foar helderheid dan foar kleur. Jo kinne dit sels sjen troch nei dizze foto te sjen.

Hoe wurket in fideokodek? Diel 1: Basis

As jo ​​net sjogge dat op de linker helte fan de ôfbylding de kleuren fan de pleinen A и B binne eins itselde, dan is dat normaal. Us harsens twingt ús om mear omtinken te jaan oan ljocht en skaad ynstee fan kleur. Oan de rjochterkant tusken de oanwiisde fjilden is der in jumper fan deselde kleur - dus wy (dus ús harsens) maklik bepale dat, yn feite, se binne deselde kleur.

Litte wy (op in ferienfâldige manier) sjen hoe't ús eagen wurkje. It each is in kompleks oargel besteande út in protte dielen. Wy binne lykwols meast ynteressearre yn kegels en roeden. It each befettet sa'n 120 miljoen stokken en 6 miljoen kegels.

Litte wy de waarnimming fan kleur en helderheid beskôgje as aparte funksjes fan bepaalde dielen fan it each (yn feite is alles wat yngewikkelder, mar wy sille it ferienfâldigje). Rod sellen binne benammen ferantwurdlik foar helderheid, wylst cone sellen binne ferantwurdlik foar kleur. Kegels binne ferdield yn trije soarten, ôfhinklik fan it pigment dat se befetsje: S-kegels (blau), M-kegels (grien), en L-kegels (read).

Om't wy folle mear roeden (helderheid) hawwe as kegels (kleur), kinne wy ​​konkludearje dat wy mear yn steat binne om transysjes tusken tsjuster en ljocht te ûnderskieden as kleuren.

Hoe wurket in fideokodek? Diel 1: Basis

Kontrast gefoelichheid Features

Undersikers yn eksperimintele psychology en in protte oare fjilden hawwe in protte teoryen fan minsklike fisy ûntwikkele. En ien fan harren wurdt neamd kontrast gefoelichheid funksjes. Se binne besibbe oan romtlike en tydlike ferljochting. Koartsein, it giet oer hoefolle feroarings nedich binne foardat in waarnimmer se opmerkt. Let op it meartal fan it wurd "funksje". Dit is te tankjen oan it feit dat wy funksjes fan kontrastsensitiviteit kinne mjitte net allinich foar swart-wytôfbyldings, mar ek foar kleur. De resultaten fan dizze eksperiminten litte sjen dat yn 'e measte gefallen ús eagen gefoeliger binne foar helderheid as foar kleur.

Om't wy witte dat wy gefoeliger binne foar byldhelderheid, kinne wy ​​besykje dit feit te brûken.

Kleur model

Wy hawwe in bytsje útfûn hoe't jo kinne wurkje mei kleurôfbyldings mei it RGB-skema. D'r binne ek oare modellen. D'r is in model dat luminânsje skiedt fan chroma en it is bekend as YCbCr. Trouwens, d'r binne oare modellen dy't in ferlykbere divyzje meitsje, mar wy sille allinich dizze beskôgje.

Yn dizze kleur model Y is in foarstelling fan helderheid, en brûkt ek twa kleurkanalen: Cb (ryk blau) en Cr (ryk read). YCbCr kin wurde ôflaat fan RGB, en de omkearde konverzje is ek mooglik. Mei dit model kinne wy ​​​​folsleine kleurôfbyldings meitsje lykas wy hjirûnder sjogge:

Hoe wurket in fideokodek? Diel 1: Basis

Konvertearje tusken YCbCr en RGB

Immen sil beswier meitsje: hoe is it mooglik om alle kleuren te krijen as grien net brûkt wurdt?

Om dizze fraach te beantwurdzjen, litte wy RGB konvertearje nei YCbCr. Litte wy de koeffizienten brûke dy't yn 'e standert oannommen binne BT.601, dat waard oanrikkemandearre troch de ienheid ITU-R. Dizze divyzje set de noarmen foar digitale fideo. Bygelyks: wat is 4K? Wat moat de framerate, resolúsje, kleurmodel wêze?

Litte wy earst de helderheid berekkenje. Litte wy de konstanten brûke foarsteld troch de ITU en ferfange de RGB-wearden.

Y = 0.299R + 0.587G + 0.114B

Nei't wy de helderheid hawwe, sille wy de blauwe en reade kleuren skiede:

Cb = 0.564(B - Y)

Cr = 0.713(R - Y)

En wy kinne ek werom konvertearje en sels grien krije mei YCbCr:

R = Y + 1.402Cr

B = Y + 1.772Cb

G = Y - 0.344Cb - 0.714Cr

Typysk brûke byldskermen (monitors, tv's, skermen, ensfh.) allinich it RGB-model. Mar dit model kin op ferskate manieren organisearre wurde:

Hoe wurket in fideokodek? Diel 1: Basis

Kleur subsampling

Mei in ôfbylding fertsjintwurdige as in kombinaasje fan luminânsje en chrominânsje, kinne wy ​​​​de gruttere gefoelichheid fan it minsklik fisuele systeem foar luminânsje brûke dan foar chrominânsje troch selektyf ynformaasje te ferwiderjen. Chroma subsampling is in metoade foar it kodearjen fan ôfbyldings mei minder resolúsje foar chroma dan foar luminânsje.

Hoe wurket in fideokodek? Diel 1: Basis

Hoefolle is it tastien om de kleurresolúsje te ferminderjen?! It docht bliken dat d'r al wat diagrammen binne dy't beskriuwe hoe't jo resolúsje en gearfoegje moatte behannelje (Resulterende kleur = Y + Cb + Cr).

Dizze skema's binne bekend as downsampling systemen en wurde útdrukt as in 3-fâldige ferhâlding - a:x:y, dy't it oantal samples fan luminânsje- en kleurferskilsignalen bepaalt.

a - horizontale sampling standert (meastal lyk oan 4)
x - oantal chroma-samples yn 'e earste rige piksels (horizontale resolúsje relatyf oan a)
y - it oantal feroarings yn chroma-samples tusken de earste en twadde rige fan piksels.

De útsûndering is 4:1:0, it leverjen fan ien chroma-monster yn elk 4-by-4 luminânsje-resolúsjeblok.

Algemiene skema's brûkt yn moderne codecs:

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

YCbCr 4:2:0 - fúzjefoarbyld

Hjir is in gearfoege ôfbylding mei YCbCr 4: 2: 0. Tink derom dat wy allinich 12 bits per piksel útjaan.

Hoe wurket in fideokodek? Diel 1: Basis

Dit is hoe't deselde ôfbylding liket, kodearre mei de haadtypen fan kleursubsampling. De earste rige is de lêste YCbCr, de ûnderste rige toant de chroma-resolúsje. Hiel fatsoenlike resultaten, sjoen it lichte ferlies yn kwaliteit.

Hoe wurket in fideokodek? Diel 1: Basis

Unthâld doe't wy telden 278 GB opslachromte te bewarjen in oere-lange fideo triem op 720p resolúsje en 30 frames per sekonde? As wy YCbCr 4:2:0 brûke, dan sil dizze grutte mei de helte wurde fermindere - 139 GB. Oant no ta is it noch fier fan in akseptabel resultaat.

Jo kinne it YCbCr-histogram sels krije mei FFmpeg. Yn dit byld dominearret blau oer read, wat dúdlik te sjen is yn it histogram sels.

Hoe wurket in fideokodek? Diel 1: Basis

Kleur, helderheid, kleurskala - fideoresinsje

Wy riede oan om dizze geweldige fideo te besjen. It ferklearret wat helderheid is, en yn 't algemien binne alle stippen stippele ё oer helderheid en kleur.

Frame Soarten

Lit ús fierder gean. Litte wy besykje de oerstallige tiid te eliminearjen. Mar earst litte wy wat basisterminology definiearje. Litte wy sizze dat wy in film hawwe mei 30 frames per sekonde, hjir binne de earste 4 frames:

Hoe wurket in fideokodek? Diel 1: Basis Hoe wurket in fideokodek? Diel 1: Basis Hoe wurket in fideokodek? Diel 1: Basis Hoe wurket in fideokodek? Diel 1: Basis

Wy kinne in protte werhelling sjen yn de frames: bygelyks in blauwe eftergrûn dy't net feroaret fan frame nei frame. Om dit probleem op te lossen, kinne wy ​​se abstrakt klassifisearje yn trije soarten frames.

I-frame (Intro frame)

I-frame (ferwizingsframe, kaaiframe, binnenframe) is selsstannich. Nettsjinsteande wat jo wolle visualisearje, in I-frame is yn wêzen in statyske foto. It earste frame is normaal in I-frame, mar wy sille regelmjittich I-frames observearje, sels ûnder net de earste frames.

Hoe wurket in fideokodek? Diel 1: Basis

P-frame (Pfoarskreaun frame)

P-frame (foarsizzend frame) profitearret fan it feit dat hast altyd de aktuele ôfbylding kin wurde reprodusearre mei it foarige frame. Bygelyks, yn it twadde frame is de ienige feroaring de bal dy't foarút giet. Wy kinne frame 2 krije troch gewoan wat frame 1 te feroarjen, allinich it ferskil tusken dizze frames te brûken. Om frame 2 te konstruearjen ferwize wy nei it foargeande frame 1.

Hoe wurket in fideokodek? Diel 1: BasisHoe wurket in fideokodek? Diel 1: Basis

B-frame (Bi-foarsizzend frame)

Hoe sit it mei keppelings net allinich nei ferline, mar ek nei takomstige frames om noch bettere kompresje te leverjen?! Dit is yn prinsipe in B-frame (bidireksjoneel frame).

Hoe wurket in fideokodek? Diel 1: BasisHoe wurket in fideokodek? Diel 1: BasisHoe wurket in fideokodek? Diel 1: Basis

Intermediate weromlûken

Dizze framesoarten wurde brûkt om de bêste mooglike kompresje te leverjen. Wy sille sjen nei hoe't dit bart yn 'e folgjende paragraaf. Litte wy no opmerke dat de meast "djoere" yn termen fan konsumearre ûnthâld it I-frame is, it P-frame is merkber goedkeaper, mar de meast profitable opsje foar fideo is it B-frame.

Hoe wurket in fideokodek? Diel 1: Basis

Tydlike redundânsje (foarsizzing tusken frame)

Litte wy sjen hokker opsjes wy hawwe om werhelling oer de tiid te minimalisearjen. Wy kinne dit soarte fan oerstalligens oplosse mei cross-foarsizzingmetoaden.

Wy sille besykje sa min mooglik bits te besteegjen om in folchoarder fan frames 0 en 1 te kodearjen.

Hoe wurket in fideokodek? Diel 1: Basis

Wy kinne produsearje subtraksje, wy lûke gewoan frame 1 ôf fan frame 0. Wy krije frame 1, brûke allinich it ferskil tusken it en it foarige frame, yn feite kodearje wy allinich de resultearjende rest.

Hoe wurket in fideokodek? Diel 1: Basis

Mar wat as ik jo fertelde dat d'r in noch bettere metoade is dy't noch minder bits brûkt?! Litte wy earst frame 0 brekke yn in dúdlik raster besteande út blokken. En dan sille wy besykje de blokken fan frame 0 te passen mei frame 1. Mei oare wurden, wy sille de beweging tusken frames skatte.

Fan Wikipedia - blokkearje bewegingskompensaasje

Blokbewegingskompensaasje dielt it hjoeddeistige frame yn net-oerlappende blokken en de bewegingskompensaasjevektor rapportearret de oarsprong fan 'e blokken (in mienskiplike misfetting is dat foarige it frame is ferdield yn net-oerlappende blokken, en bewegingskompensaasjevektoren fertelle wêr't dy blokken geane. Mar yn feite is it oarsom - it is net it foarige frame dat wurdt analysearre, mar it folgjende; it is net dúdlik wêr't de blokken bewege, mar wêr't se wei kamen). Typysk oerlaapje de boarneblokken yn it boarneframe. Guon fideokompresjealgoritmen sammelje it hjoeddeistige frame út dielen fan net iens ien, mar ferskate earder oerdroegen frames.

Hoe wurket in fideokodek? Diel 1: Basis

Tidens it evaluaasjeproses sjogge wy dat de bal is ferpleatst fan (x= 0, y=25) troch (x= 6, y=26), wearden x и y bepale de beweging vector. In oare stap dy't wy kinne dwaan om bits te behâlden is allinich it ferskil fan bewegingsvektoren te kodearjen tusken de lêste blokposysje en de foarseine, sadat de definitive bewegingsvektor sil wêze (x=6-0=6, y=26-25=1 ).

Yn in echte situaasje, dizze bal soe wurde ferdield yn n blokken, mar dit feroaret de essinsje fan 'e saak net.

Objekten yn it frame bewege yn trije diminsjes, dus as de bal beweecht, kin it fisueel lytser wurde (of grutter as it nei de sjogger beweecht). It is normaal dat der gjin perfekte wedstriid tusken blokken sil wêze. Hjir is in kombinearre werjefte fan ús skatting en it echte byld.

Hoe wurket in fideokodek? Diel 1: Basis

Mar wy sjogge dat as wy bewegingsskatting brûke, d'r merkber minder gegevens binne foar kodearring dan by it brûken fan in ienfâldiger metoade foar it berekkenjen fan de delta tusken frames.

Hoe wurket in fideokodek? Diel 1: Basis

Hoe soe echte bewegingskompensaasje der útsjen

Dizze technyk wurdt tapast op alle blokken tagelyk. Faak sil ús betingst bewegende bal wurde ferdield yn ferskate blokken tagelyk.

Hoe wurket in fideokodek? Diel 1: Basis

Jo kinne sels in gefoel krije foar dizze konsepten jupyter.

Om bewegingsvektoren te sjen, kinne jo in eksterne foarsizzingsfideo oanmeitsje mei ffmpeg.

Hoe wurket in fideokodek? Diel 1: Basis

Jo kinne ek brûke Intel Video Pro Analyzer (it is betelle, mar d'r is in fergese proef dy't allinich is beheind ta de earste tsien frames).

Hoe wurket in fideokodek? Diel 1: Basis

Romtlike redundânsje (ynterne prognose)

As wy elk frame yn in fideo analysearje, sille wy in protte ûnderling ferbûne gebieten fine.

Hoe wurket in fideokodek? Diel 1: Basis

Litte wy troch dit foarbyld gean. Dizze sêne bestiet benammen út blauwe en wite kleuren.

Hoe wurket in fideokodek? Diel 1: Basis

Dit is in I-frame. Wy kinne foarige frames net nimme foar foarsizzing, mar wy kinne it komprimearje. Litte wy de seleksje fan it reade blok kodearje. As wy nei syn buorlju sjogge, fernimme wy dat der wat kleurtrends omhinne binne.

Hoe wurket in fideokodek? Diel 1: Basis

Wy geane der fan út dat kleuren fertikaal yn it frame ferspraat binne. Wat betsjut dat de kleur fan 'e ûnbekende piksels de wearden fan har buorlju sil befetsje.

Hoe wurket in fideokodek? Diel 1: Basis

Sa'n foarsizzing kin ferkeard útfalle. It is om dizze reden dat jo dizze metoade moatte tapasse (ynterne prognose), en dan de echte wearden ôflûke. Dit sil jaan ús in oerbleaune blok, dat sil resultearje yn in folle mear komprimearre matrix yn ferliking mei it orizjineel.

Hoe wurket in fideokodek? Diel 1: Basis

As jo ​​wolle oefenje mei ynterne foarsizzingen, kinne jo in fideo meitsje fan makroblokken en har foarsizzingen mei ffmpeg. Om de betsjutting fan elke blokkleur te begripen, moatte jo de ffmpeg-dokumintaasje lêze.

Hoe wurket in fideokodek? Diel 1: Basis

Of jo kinne Intel Video Pro Analyzer brûke (lykas ik hjirboppe neamde, de fergese proefferzje is beheind ta de earste 10 frames, mar dit sil earst genôch wêze foar jo).

Hoe wurket in fideokodek? Diel 1: Basis

Twadde diel: Hoe't de fideokodek wurket

Boarne: www.habr.com

Add a comment