Miten videokoodekki toimii? Osa 1: Perusteet

Toinen osa: Kuinka videokoodekki toimii

Mikä tahansa rasteri Esikatselu voidaan esittää muodossa kaksiulotteinen matriisi. Mitä tulee väreihin, ideaa voi kehittää katsomalla kuvaa kolmiulotteinen matriisi, jossa lisämittoja käytetään kunkin värin tietojen tallentamiseen.

Jos tarkastellaan lopullista väriä yhdistelmänä ns. päävärit (punainen, vihreä ja sininen), määrittelemme kolmiulotteisessa matriisissa kolme tasoa: ensimmäinen punaiselle, toinen vihreälle ja viimeinen siniselle.
Miten videokoodekki toimii? Osa 1: Perusteet
Kutsumme jokaista tämän matriisin pistettä pikseliksi (kuvaelementiksi). Jokainen pikseli sisältää tietoa kunkin värin intensiteetistä (yleensä numeerisena arvona). Esimerkiksi, punainen pikseli tarkoittaa, että se sisältää 0 vihreää, 0 sinistä ja enintään punaista. Vaaleanpunainen pikseli voidaan muodostaa kolmen värin yhdistelmällä. Käyttämällä numeerista aluetta 0–255, vaaleanpunainen pikseli määritellään seuraavasti Punainen = 255, Vihreä = 192 и Sininen = 203.

Miten videokoodekki toimii? Osa 1: Perusteet

Tämä artikkeli on julkaistu EDISONin tuella.

Kehitämme sovellukset videovalvontaan, videon suoratoistoon, ja olemme myös kihloissa videotallennus leikkaussalissa.

Vaihtoehtoisia tapoja koodata värikuva

On monia muita malleja kuvan muodostavien värien esittämiseen. Voit esimerkiksi käyttää indeksoitua palettia, joka vaatii vain yhden tavun edustamaan kutakin pikseliä RGB-mallia käytettäessä vaadittavien kolmen sijasta. Tällaisessa mallissa on mahdollista käyttää 2D-matriisia 3D-matriisin sijaan kunkin värin esittämiseen. Tämä säästää muistia, mutta antaa pienemmän värivalikoiman.

Miten videokoodekki toimii? Osa 1: Perusteet

RGB

Katso esimerkiksi tätä alla olevaa kuvaa. Ensimmäiset kasvot on kokonaan maalattu. Muut ovat punainen, vihreä ja sininen tasot (vastaavien värien intensiteetit näytetään harmaasävyinä).

Miten videokoodekki toimii? Osa 1: Perusteet

Näemme, että alkuperäisen punaisen sävyt ovat samoissa paikoissa, joissa toisten kasvojen kirkkaimmat osat havaitaan. Vaikka sinisen panos näkyy pääasiassa vain Marion silmissä (viimeisissä kasvoissa) ja hänen vaatteissaan. Huomaa, missä kaikki kolme väritasoa vaikuttavat vähiten (kuvien tummimmat osat) - Marion viikset.

Jokaisen värin intensiteetin tallentamiseksi tarvitaan tietty määrä bittejä - tätä määrää kutsutaan bitin syvyys. Oletetaan, että väritasoa kohden kuluu 8 bittiä (perustuu arvoon 0-255). Sitten meillä on värisyvyys 24 bittiä (8 bittiä * 3 R/G/B-tasoa).

Toinen kuvan ominaisuus on lupa, joka on yhden ulottuvuuden pikselien lukumäärä. Usein merkitty leveys × korkeus, kuten alla olevassa 4 x 4 esimerkkikuvassa.
Miten videokoodekki toimii? Osa 1: Perusteet

Toinen ominaisuus, jota käsittelemme kuvien/videoiden kanssa työskennellessämme, on kuvasuhde, joka kuvaa normaalia suhteellista suhdetta kuvan tai pikselin leveyden ja korkeuden välillä.

Kun he sanovat, että tietyn elokuvan tai kuvan koko on 16 x 9, he yleensä tarkoittavat näytön kuvasuhde (DAR - alkaen Näytön kuvasuhde). Joskus yksittäisillä pikseleillä voi kuitenkin olla erilaisia ​​muotoja - tässä tapauksessa puhumme pikselisuhde (PAR - alkaen Pikselin kuvasuhde).

Miten videokoodekki toimii? Osa 1: Perusteet

Miten videokoodekki toimii? Osa 1: Perusteet

Huomautus emännälle: DVD соответствует DAR 4-3

Vaikka todellinen DVD-resoluutio on 704x480, se säilyttää silti 4:3-kuvasuhteen, koska PAR on 10:11 (704x10 / 480x11).

Ja lopuksi voimme päättää video kuin sarja n kehyksiä ajanjaksolle aikaa, jota voidaan pitää lisäulottuvuutena. A n sitten on kuvataajuus tai kehysten määrä sekunnissa (FPS - alkaen Kuvaa sekunnissa).

Miten videokoodekki toimii? Osa 1: Perusteet

Videon näyttämiseen vaadittava bittien määrä sekunnissa on sen lähetysnopeus - bittinopeus.

bittinopeus = leveys * korkeus * bitin syvyys * ruutua sekunnissa

Esimerkiksi 30 fps, 24 bps, 480 x 240 video vaatisi 82,944,000 ​​82,944 30 bps tai 480 240 Mbps (24 x XNUMX x XNUMX x XNUMX) - mutta näin tapahtuu, jos pakkausmenetelmää ei käytetä.

Jos siirtonopeus lähes vakiona, niin sitä kutsutaan vakio siirtonopeus (CBR - alkaen vakio bittinopeus). Mutta se voi myös vaihdella, tässä tapauksessa sitä kutsutaan muuttuva tiedonsiirtonopeus (VBR - alkaen muuttuva bittinopeus).

Tämä kaavio näyttää rajoitetun VBR:n, jossa ei liikaa bittejä mene hukkaan, jos kehys on täysin tumma.

Miten videokoodekki toimii? Osa 1: Perusteet

Insinöörit kehittivät alun perin menetelmän videonäytön havaitun kuvanopeuden kaksinkertaistamiseksi ilman lisäkaistanleveyttä. Tämä menetelmä tunnetaan nimellä lomitettu video; Periaatteessa se lähettää puolet näytöstä ensimmäisessä "kehyksessä" ja toisen puolen seuraavassa "kehyksessä".

Tällä hetkellä kohtaukset renderöidään enimmäkseen käyttämällä progressiiviset skannaustekniikat. Se on menetelmä liikkuvien kuvien näyttämiseen, tallentamiseen tai lähettämiseen, jossa jokaisen kehyksen kaikki viivat piirretään peräkkäin.

Miten videokoodekki toimii? Osa 1: Perusteet

Hyvin! Nyt olemme tietoisia siitä, miten kuva esitetään digitaalisesti, miten sen värit on järjestetty, kuinka monta bittiä sekunnissa käytämme videon näyttämiseen, jos bittinopeus on vakio (CBR) vai muuttuva (VBR). Tiedämme tietyn resoluution tietyllä kuvanopeudella, tunnemme monet muut termit, kuten lomitettu video, PAR ja jotkut muut.

Redundanssin poistaminen

Tiedetään, että videota ilman pakkausta ei voida käyttää normaalisti. Tunnin mittainen video 720p-resoluutiolla ja 30 kuvaa sekunnissa vie 278 Gt. Tämä arvo saadaan kertomalla 1280 x 720 x 24 x 30 x 3600 (leveys, korkeus, bittiä pikseliä kohden, FPS ja aika sekunneissa).

Käyttää häviöttömät pakkausalgoritmit, kuten DEFLATE (käytetään PKZIP:ssä, Gzipissä ja PNG:ssä), ei vähennä vaadittua kaistanleveyttä tarpeeksi. Meidän on etsittävä muita tapoja pakata video.

Voit tehdä tämän käyttämällä visiomme ominaisuuksia. Erottelemme paremmin kirkkauden kuin värin. Video on sarja peräkkäisiä kuvia, jotka toistuvat ajan myötä. Saman kohtauksen vierekkäisten kuvien välillä on pieniä eroja. Lisäksi jokainen kehys sisältää useita alueita, jotka käyttävät samaa (tai samanlaista) väriä.

Väri, kirkkaus ja silmämme

Silmämme ovat herkempiä kirkkaudelle kuin väreille. Voit nähdä tämän itse katsomalla tätä kuvaa.

Miten videokoodekki toimii? Osa 1: Perusteet

Jos et näe sitä kuvan vasemmalla puolella, neliöiden värit A и B ovat itse asiassa samat, se on normaalia. Aivomme pakottavat meidät kiinnittämään enemmän huomiota valoon ja varjoon värien sijaan. Oikealla puolella nimettyjen ruutujen välissä on samanvärinen jumpperi - joten me (eli aivomme) päätämme helposti, että ne ovat itse asiassa samanvärisiä.

Katsotaanpa (yksinkertaistetulla tavalla) kuinka silmämme toimivat. Silmä on monimutkainen elin, joka koostuu useista osista. Meitä kiinnostavat kuitenkin eniten kartiot ja tangot. Silmä sisältää noin 120 miljoonaa sauvaa ja 6 miljoonaa kartiota.

Tarkastellaanpa värin ja kirkkauden käsitystä silmän tiettyjen osien erillisinä toimintoina (itse asiassa kaikki on hieman monimutkaisempaa, mutta yksinkertaistamme sitä). Tankosolut vastaavat pääasiassa kirkkaudesta, kun taas kartiosolut vastaavat väristä. Kartiot jaetaan kolmeen tyyppiin niiden sisältämän pigmentin mukaan: S-kartiot (sininen), M-kartio (vihreä) ja L-kartio (punainen).

Koska meillä on paljon enemmän sauvoja (kirkkautta) kuin kartioita (värejä), voimme päätellä, että pystymme paremmin erottamaan tumman ja vaalean siirtymät kuin värit.

Miten videokoodekki toimii? Osa 1: Perusteet

Kontrastiherkkyysominaisuudet

Kokeellisen psykologian ja monien muiden alojen tutkijat ovat kehittäneet monia teorioita ihmisen näkökyvystä. Ja yksi niistä on nimeltään kontrastiherkkyystoiminnot. Ne liittyvät tilalliseen ja ajalliseen valaistukseen. Lyhyesti sanottuna kyse on siitä, kuinka monta muutosta tarvitaan ennen kuin tarkkailija huomaa ne. Huomaa sanan "funktio" monikko. Tämä johtuu siitä, että voimme mitata kontrastiherkkyystoimintoja paitsi mustavalkoisille kuville myös värillisille kuville. Näiden kokeiden tulokset osoittavat, että useimmissa tapauksissa silmämme ovat herkempiä kirkkaudelle kuin väreille.

Koska tiedämme, että olemme herkempiä kuvan kirkkaudelle, voimme yrittää käyttää tätä tosiasiaa.

Väri malli

Selvitimme hieman kuinka työskennellä värikuvien kanssa RGB-mallin avulla. Muitakin malleja löytyy. On malli, joka erottaa luminanssin kromasta, ja se tunnetaan nimellä YCbCr. Muuten, on muitakin malleja, jotka tekevät samanlaisen jaon, mutta harkitsemme vain tätä.

Tässä värimallissa Y on esitys kirkkaudesta ja käyttää myös kahta värikanavaa: Cb (rikas sininen) ja Cr (rikas punainen). YCbCr voidaan johtaa RGB:stä, ja myös käänteinen muunnos on mahdollista. Tätä mallia käyttämällä voimme luoda täysivärikuvia, kuten alla nähdään:

Miten videokoodekki toimii? Osa 1: Perusteet

Muunna YCbCr:n ja RGB:n välillä

Joku vastustaa: kuinka on mahdollista saada kaikki värit, jos vihreää ei käytetä?

Vastataksesi tähän kysymykseen muunnetaan RGB YCbCr:ksi. Käytetään standardissa käytettyjä kertoimia BT.601, jota yksikkö suositteli ITU-R. Tämä jako asettaa standardit digitaaliselle videolle. Esimerkiksi: mikä on 4K? Mikä pitäisi olla kuvataajuus, resoluutio, värimalli?

Lasketaan ensin kirkkaus. Käytetään ITU:n ehdottamia vakioita ja korvataan RGB-arvot.

Y = 0.299R + 0.587G + 0.114B

Kun kirkkaus on saatu, erotamme siniset ja punaiset värit:

Cb = 0.564 XNUMX(B - Y)

Cr = 0.713 XNUMX(R - Y)

Ja voimme myös muuntaa takaisin ja jopa saada vihreäksi YCbCr:n avulla:

R = Y + 1.402Cr

B = Y + 1.772Cb

G = Y - 0.344Cb - 0.714Cr

Tyypillisesti näytöt (monitorit, televisiot, näytöt jne.) käyttävät vain RGB-mallia. Mutta tämä malli voidaan järjestää eri tavoin:

Miten videokoodekki toimii? Osa 1: Perusteet

Värien alinäytteenotto

Kun kuva esitetään luminanssin ja krominanssin yhdistelmänä, voimme hyödyntää ihmisen näköjärjestelmän suurempaa herkkyyttä luminanssille kuin krominanssille poistamalla valikoivasti tietoa. Värin alinäytteenotto on menetelmä kuvien koodaamiseksi käyttämällä vähemmän erottelukykyä värikkuudelle kuin luminanssille.

Miten videokoodekki toimii? Osa 1: Perusteet

Kuinka paljon väriresoluutiota saa pienentää?! Osoittautuu, että on jo olemassa kaavioita, jotka kuvaavat resoluution ja yhdistämisen käsittelyä (Tuloksena oleva väri = Y + Cb + Cr).

Nämä suunnitelmat tunnetaan nimellä näytteenottojärjestelmät ja ilmaistaan ​​kolminkertaisena suhteena - a:x:y, joka määrittää luminanssi- ja värierosignaalien näytteiden lukumäärän.

a — vaakasuuntainen näytteenottostandardi (yleensä 4)
x — värinäytteiden määrä ensimmäisellä pikselirivillä (vaakaresoluutio suhteessa a)
y — värinäytteiden muutosten määrä ensimmäisen ja toisen pikselirivin välillä.

Poikkeus on 4:1:0, joka tarjoaa yhden värinäytteen jokaisessa 4 x 4 luminanssiresoluutiolohkossa.

Nykyaikaisissa koodekeissa käytetyt yleiset mallit:

  • 4:4:4 (ei alasnäytteenottoa)
  • 4:2:2
  • 4:1:1
  • 4:2:0
  • 4:1:0
  • 3:1:1

YCbCr 4:2:0 - fuusioesimerkki

Tässä on yhdistetty kuva käyttäen YCbCr 4:2:0. Huomaa, että käytämme vain 12 bittiä pikseliä kohden.

Miten videokoodekki toimii? Osa 1: Perusteet

Tältä sama kuva näyttää, koodattuina tärkeimmät värin alinäytteenottotyypit. Ensimmäinen rivi on viimeinen YCbCr, alimmalla rivillä näkyy värierottelukyky. Erittäin kunnolliset tulokset ottaen huomioon vähäisen laadun heikkenemisen.

Miten videokoodekki toimii? Osa 1: Perusteet

Muistatko, kun laskimme 278 Gt tallennustilaa tunnin mittaisen videotiedoston tallentamiseen 720p-resoluutiolla ja 30 ruutua sekunnissa? Jos käytämme YCbCr 4:2:0, tämä koko pienenee puoleen - 139 Gt. Toistaiseksi se on vielä kaukana hyväksyttävästä tuloksesta.

Voit saada YCbCr-histogrammin itse käyttämällä FFmpegiä. Tässä kuvassa sininen hallitsee punaista, mikä näkyy selvästi itse histogrammissa.

Miten videokoodekki toimii? Osa 1: Perusteet

Väri, kirkkaus, väriskaala - videokatsaus

Suosittelemme katsomaan tämän upean videon. Se selittää, mikä kirkkaus on, ja yleensä kaikki pisteet on pisteytetty ё kirkkaudesta ja väristä.

Kehystyypit

Siirrytään eteenpäin. Yritetään poistaa aikaylijäämä. Mutta ensin määritellään perusterminologia. Oletetaan, että meillä on elokuva, jonka nopeus on 30 kuvaa sekunnissa, tässä sen ensimmäiset 4 kuvaa:

Miten videokoodekki toimii? Osa 1: Perusteet Miten videokoodekki toimii? Osa 1: Perusteet Miten videokoodekki toimii? Osa 1: Perusteet Miten videokoodekki toimii? Osa 1: Perusteet

Voimme nähdä kehyksissä paljon toistoa: esimerkiksi sininen tausta, joka ei vaihdu kehyksestä toiseen. Tämän ongelman ratkaisemiseksi voimme abstraktisti luokitella ne kolmen tyyppisiin kehyksiin.

I-kehys (Intro Frame)

I-kehys (viitekehys, avainkehys, sisäkehys) on itsenäinen. Riippumatta siitä, mitä haluat visualisoida, I-kehys on pohjimmiltaan staattinen valokuva. Ensimmäinen kehys on yleensä I-kehys, mutta tarkkailemme säännöllisesti I-kehyksiä myös muiden kuin ensimmäisten kehysten joukossa.

Miten videokoodekki toimii? Osa 1: Perusteet

P-kehys (Peditoitu kehys)

P-frame (predictive frame) hyödyntää sitä tosiasiaa, että lähes aina nykyinen kuva voidaan toistaa käyttämällä edellistä kuvaa. Esimerkiksi toisessa kehyksessä ainoa muutos on pallon liikkuminen eteenpäin. Voimme saada kehyksen 2 yksinkertaisesti muokkaamalla hieman kehystä 1, käyttämällä vain näiden kehysten välistä eroa. Kehyksen 2 rakentamiseksi viitataan edelliseen kehykseen 1.

Miten videokoodekki toimii? Osa 1: PerusteetMiten videokoodekki toimii? Osa 1: Perusteet

B-kehys (Bi-predictive Frame)

Entä linkit menneisiin, mutta myös tuleviin kehyksiin, jotta ne tarjoavat entistä paremman pakkauksen?! Tämä on pohjimmiltaan B-kehys (kaksisuuntainen kehys).

Miten videokoodekki toimii? Osa 1: PerusteetMiten videokoodekki toimii? Osa 1: PerusteetMiten videokoodekki toimii? Osa 1: Perusteet

Väliaikainen vetäytyminen

Näitä kehystyyppejä käytetään parhaan mahdollisen pakkauksen aikaansaamiseksi. Katsomme, kuinka tämä tapahtuu seuraavassa osiossa. Toistaiseksi huomioikaa, että kulutetun muistin "kallein" on I-kehys, P-kehys on huomattavasti halvempi, mutta videolle kannattavin vaihtoehto on B-kehys.

Miten videokoodekki toimii? Osa 1: Perusteet

Ajallinen redundanssi (kehysten välinen ennuste)

Katsotaanpa, mitä vaihtoehtoja meillä on minimoida toistot ajan myötä. Voimme ratkaista tämän tyyppisen redundanssin ristiinennustusmenetelmillä.

Yritämme käyttää mahdollisimman vähän bittejä kehysten 0 ja 1 sekvenssin koodaamiseen.

Miten videokoodekki toimii? Osa 1: Perusteet

Voimme tuottaa vähennyslasku, vähennämme kehyksen 1 kehyksestä 0. Saamme kehyksen 1, käytämme vain sen ja edellisen kehyksen välistä erotusta, itse asiassa koodaamme vain tuloksena olevan jäännöksen.

Miten videokoodekki toimii? Osa 1: Perusteet

Mutta entä jos kertoisin sinulle, että on olemassa vielä parempi menetelmä, joka käyttää vielä vähemmän bittejä?! Ensin murretaan kehys 0 selkeäksi lohkoista koostuvaksi ruudukoksi. Ja sitten yritämme sovittaa kehyksen 0 lohkot kehykseen 1. Toisin sanoen arvioimme kehysten välisen liikkeen.

Wikipediasta - lohkoliikkeen kompensointi

Lohkon liikekompensaatio jakaa nykyisen kehyksen ei-päällekkäisiin lohkoihin ja liikekompensaatiovektori ilmoittaa lohkojen alkuperän (yleinen väärinkäsitys on, että edellinen kehys on jaettu ei-päällekkäisiin lohkoihin, ja liikkeen kompensointivektorit kertovat minne nämä lohkot menevät. Mutta itse asiassa se on päinvastoin - ei analysoida edellistä kehystä, vaan seuraavaa; ei ole selvää, missä lohkot liikkuvat, mutta mistä ne tulivat). Tyypillisesti lähdelohkot menevät päällekkäin lähdekehyksessä. Jotkut videon pakkausalgoritmit kokoavat nykyisen kehyksen ei edes yhden, vaan usean aiemmin lähetetyn kehyksen osista.

Miten videokoodekki toimii? Osa 1: Perusteet

Arviointiprosessin aikana näemme, että pallo on siirtynyt (x= 0, y=25) kirjoittaja (x= 6, y=26), arvot x и y määrittää liikevektorin. Toinen askel, jonka voimme tehdä bittien säilyttämiseksi, on koodata vain liikevektoreiden ero viimeisimmän lohkopaikan ja ennustetun välillä, joten lopullinen liikevektori on (x=6-0=6, y=26-25=1 ).

Todellisessa tilanteessa tämä pallo olisi jaettu n estää, mutta tämä ei muuta asian ydintä.

Kehyksessä olevat objektit liikkuvat kolmessa ulottuvuudessa, joten kun pallo liikkuu, se voi pienentyä visuaalisesti (tai suuremmaksi, jos se liikkuu kohti katsojaa). On normaalia, että lohkojen välillä ei ole täydellistä vastaavuutta. Tässä on yhdistetty näkemys arviostamme ja todellisesta kuvasta.

Miten videokoodekki toimii? Osa 1: Perusteet

Mutta näemme, että kun käytämme liikeestimointia, koodausta varten on huomattavasti vähemmän dataa kuin käytettäessä yksinkertaisempaa menetelmää kehysten välisen deltan laskemiseen.

Miten videokoodekki toimii? Osa 1: Perusteet

Miltä todellinen liikekompensaatio näyttäisi

Tätä tekniikkaa sovelletaan kaikkiin lohkoihin kerralla. Usein ehdollinen liikkuva pallomme jaetaan useisiin lohkoihin kerralla.

Miten videokoodekki toimii? Osa 1: Perusteet

Voit tutustua näihin käsitteisiin itse käyttämällä jupyter.

Jos haluat nähdä liikevektoreita, voit luoda ulkoisen ennustevideon käyttämällä ffmpeg.

Miten videokoodekki toimii? Osa 1: Perusteet

Voit myös käyttää Intel Video Pro Analyzer (se on maksullinen, mutta siellä on ilmainen kokeilu, joka on rajoitettu vain ensimmäisiin kymmeneen ruutuun).

Miten videokoodekki toimii? Osa 1: Perusteet

Spatiaalinen redundanssi (sisäinen ennuste)

Jos analysoimme jokaista videon kuvaa, löydämme monia toisiinsa liittyviä alueita.

Miten videokoodekki toimii? Osa 1: Perusteet

Käydään läpi tämä esimerkki. Tämä kohtaus koostuu pääasiassa sinisestä ja valkoisesta väreistä.

Miten videokoodekki toimii? Osa 1: Perusteet

Tämä on I-kehys. Emme voi ottaa aiempia kehyksiä ennustamiseen, mutta voimme pakata ne. Koodataan punaisen lohkon valinta. Jos katsomme sen naapureita, huomaamme, että sen ympärillä on joitain väritrendejä.

Miten videokoodekki toimii? Osa 1: Perusteet

Oletetaan, että värit leviävät kehyksessä pystysuunnassa. Tämä tarkoittaa, että tuntemattomien pikselien väri sisältää naapuriensa arvot.

Miten videokoodekki toimii? Osa 1: Perusteet

Tällainen ennuste voi osoittautua vääräksi. Tästä syystä sinun on käytettävä tätä menetelmää (sisäinen ennuste) ja vähennettävä sitten todelliset arvot. Tämä antaa meille jäännöslohkon, joka johtaa paljon pakattuun matriisiin verrattuna alkuperäiseen.

Miten videokoodekki toimii? Osa 1: Perusteet

Jos haluat harjoitella sisäisten ennusteiden kanssa, voit luoda videon makrolohkoista ja niiden ennusteista ffmpeg:llä. Ymmärtääksesi kunkin lohkon värin merkityksen sinun on luettava ffmpeg-dokumentaatio.

Miten videokoodekki toimii? Osa 1: Perusteet

Tai voit käyttää Intel Video Pro Analyzer -ohjelmaa (kuten edellä mainitsin, ilmainen kokeiluversio on rajoitettu ensimmäisiin 10 kehykseen, mutta tämä riittää sinulle aluksi).

Miten videokoodekki toimii? Osa 1: Perusteet

Toinen osa: Kuinka videokoodekki toimii

Lähde: will.com

Lisää kommentti