Kuidas videokoodek töötab? 1. osa: põhitõed

Teine osa: Kuidas videokoodek töötab

Igasugune raster pilt saab esitada kujul kahemõõtmeline maatriks. Mis puutub värvidesse, siis saab ideed arendada, vaadates pilti kui kolmemõõtmeline maatriks, milles kasutatakse iga värvi kohta andmete salvestamiseks lisamõõtmeid.

Kui käsitleda lõplikku värvi kombinatsioonina nn. põhivärvid (punane, roheline ja sinine), defineerime oma kolmemõõtmelises maatriksis kolm tasapinda: esimene punase jaoks, teine ​​​​roheline ja viimane sinise jaoks.
Kuidas videokoodek töötab? 1. osa: põhitõed
Nimetame selle maatriksi iga punkti piksliks (pildielemendiks). Iga piksel sisaldab teavet iga värvi intensiivsuse kohta (tavaliselt arvväärtusena). Näiteks, punane piksel tähendab, et see sisaldab 0 rohelist, 0 sinist ja maksimaalselt punast. Roosa piksel saab moodustada kolme värvi kombinatsiooni abil. Kasutades numbrivahemikku 0 kuni 255, on roosa piksel määratletud kui Punane = 255, Roheline = 192 и Sinine = 203.

Kuidas videokoodek töötab? 1. osa: põhitõed

See artikkel ilmus EDISONi toel.

Me areneme rakendused videovalve, video voogesituse jaoks, ja samuti oleme kihlatud videosalvestus operatsiooniruumis.

Alternatiivsed viisid värvilise pildi kodeerimiseks

Pildi moodustavate värvide esitamiseks on palju muid mudeleid. Näiteks võite kasutada indekseeritud paletti, mis nõuab iga piksli esitamiseks ainult ühte baiti, mitte kolme, mida RGB-mudeli kasutamisel nõutakse. Sellises mudelis on võimalik iga värvi kujutamiseks kasutada 2D-maatriksi asemel 3D-maatriksit. See säästab mälu, kuid annab väiksema värvigamma.

Kuidas videokoodek töötab? 1. osa: põhitõed

RGB

Näiteks vaadake seda pilti allpool. Esimene nägu on täielikult maalitud. Teised on punased, rohelised ja sinised tasapinnad (vastavate värvide intensiivsused on näidatud halltoonides).

Kuidas videokoodek töötab? 1. osa: põhitõed

Näeme, et originaalis on punased toonid samades kohtades, kus on täheldatud teise näo heledamaid kohti. Kui sinise panust on peamiselt näha vaid Mario silmades (viimane nägu) ja tema riietuse elementides. Pange tähele, kus kõik kolm värvitasandit annavad kõige vähem panuse (piltide tumedaimad osad) – Mario vuntsid.

Iga värvi intensiivsuse salvestamiseks on vaja teatud arvu bitte - seda kogust nimetatakse biti sügavus. Oletame, et värvitasandi kohta kulutatakse 8 bitti (väärtuse 0 kuni 255 alusel). Siis on meil värvisügavus 24 bitti (8 bitti * 3 R/G/B tasapinda).

Pildi teine ​​omadus on luba, mis on pikslite arv ühes mõõtmes. Sageli tähistatakse kui laius × kõrgus, nagu alloleval 4x4 näidispildil.
Kuidas videokoodek töötab? 1. osa: põhitõed

Teine omadus, millega me piltide/videotega töötades tegeleme, on kuvasuhe, mis kirjeldab normaalset proportsionaalset suhet pildi või piksli laiuse ja kõrguse vahel.

Kui nad ütlevad, et teatud filmi või pildi suurus on 16 x 9, siis nad tavaliselt mõtlevad ekraani kuvasuhe (KUID - alates Ekraani kuvasuhe). Kuid mõnikord võib üksikute pikslite kuju olla erinev - antud juhul räägime sellest pikslite suhe (PAR - alates Pikslite kuvasuhe).

Kuidas videokoodek töötab? 1. osa: põhitõed

Kuidas videokoodek töötab? 1. osa: põhitõed

Märkus perenaisele: DVD vastab DAR 4 kuni 3

Kuigi tegelik DVD eraldusvõime on 704x480, säilitab see siiski 4:3 kuvasuhte, kuna PAR on 10:11 (704x10 / 480x11).

Ja lõpuks saame kindlaks teha video nagu jada n perioodi raamid aeg, mida võib pidada lisamõõtmeks. A n siis on kaadrisagedus või kaadrite arv sekundis (FPS - alates Kaadrit sekundis).

Kuidas videokoodek töötab? 1. osa: põhitõed

Video kuvamiseks vajalik bittide arv sekundis on selle edastuskiirus - bitikiirus.

bitikiirus = laius * kõrgus * biti sügavus * kaadrit sekundis

Näiteks 30 kaadrit/s, 24 b/s, 480 x 240 video jaoks oleks vaja 82,944,000 82,944 30 b/s või 480 240 Mb/s (24 x XNUMX x XNUMX x XNUMX), kuid seda siis, kui pakkimismeetodit ei kasutata.

Kui edastuskiirus peaaegu konstantne, siis nimetatakse seda püsiv edastuskiirus (CBR - alates konstantne bitikiirus). Kuid see võib ka varieeruda, antud juhul nimetatakse seda muutuv edastuskiirus (VBR - alates muutuv bitikiirus).

See graafik näitab piiratud VBR-i, kus täiesti tumeda kaadri puhul ei lähe liiga palju bitte raisku.

Kuidas videokoodek töötab? 1. osa: põhitõed

Insenerid töötasid algselt välja meetodi videokuva tajutava kaadrisageduse kahekordistamiseks ilma täiendavat ribalaiust kasutamata. See meetod on tuntud kui põimitud video; Põhimõtteliselt saadab see pool ekraani esimeses "kaadris" ja teise poole järgmises "kaadris".

Praegu renderdatakse stseene enamasti kasutades progressiivse skaneerimise tehnoloogiad. See on liikuvate kujutiste kuvamise, salvestamise või edastamise meetod, kus iga kaadri kõik jooned tõmmatakse järjestikku.

Kuidas videokoodek töötab? 1. osa: põhitõed

Noh! Nüüd oleme teadlikud, kuidas pilti esitatakse digitaalselt, kuidas on paigutatud selle värvid, mitu bitti sekundis kulutame video näitamiseks, kui bitikiirus on konstantne (CBR) või muutuv (VBR). Me teame antud eraldusvõimet antud kaadrisagedust kasutades, oleme tuttavad paljude teiste terminitega, nagu interlaced video, PAR ja mõned teised.

Üleliigsuse eemaldamine

On teada, et ilma tihendamiseta videot ei saa normaalselt kasutada. Tunnine video eraldusvõimega 720p ja 30 kaadrit sekundis võtaks 278 GB. Selle väärtuseni saame korrutades 1280 x 720 x 24 x 30 x 3600 (laius, kõrgus, bitid piksli kohta, FPS ja aeg sekundites).

Kasutama kadudeta pakkimisalgoritmid, nagu DEFLATE (kasutatakse PKZIP-is, Gzipis ja PNG-s), ei vähenda vajalikku ribalaiust piisavalt. Peame otsima muid viise video tihendamiseks.

Selleks saate kasutada meie visiooni funktsioone. Me oskame paremini eristada heledust kui värvi. Video on järjestikuste piltide seeria, mis aja jooksul korduvad. Sama stseeni külgnevate kaadrite vahel on väikesed erinevused. Lisaks sisaldab iga kaader palju alasid, mis kasutavad sama (või sarnast) värvi.

Värv, heledus ja meie silmad

Meie silmad on heleduse kui värvi suhtes tundlikumad. Seda näete seda pilti vaadates ise.

Kuidas videokoodek töötab? 1. osa: põhitõed

Kui te seda pildi vasakus pooles ei näe, siis ruutude värvid A и B on tegelikult samad, siis on see normaalne. Meie aju sunnib meid pöörama rohkem tähelepanu valgusele ja varjule, mitte värvile. Paremal pool määratud ruutude vahel on sama värvi hüppaja – nii me (st meie aju) teeme kergesti kindlaks, et tegelikult on need sama värvi.

Vaatame (lihtsustatult), kuidas meie silmad töötavad. Silm on keeruline organ, mis koosneb paljudest osadest. Kõige rohkem huvitavad meid aga käbid ja vardad. Silm sisaldab umbes 120 miljonit varrast ja 6 miljonit koonust.

Vaatleme värvi ja heleduse tajumist teatud silma osade eraldi funktsioonidena (tegelikult on kõik mõnevõrra keerulisem, kuid me lihtsustame seda). Varrasrakud vastutavad peamiselt heleduse eest, koonusrakud aga värvi eest. Koonused jagunevad kolme tüüpi, olenevalt neis sisalduvast pigmendist: S-koonused (sinine), M-koonused (roheline) ja L-koonused (punased).

Kuna meil on palju rohkem vardaid (heledust) kui koonuseid (värvi), võime järeldada, et oleme võimelised eristama üleminekuid tumeda ja heleda vahel kui värve.

Kuidas videokoodek töötab? 1. osa: põhitõed

Kontrastsuse tundlikkuse omadused

Eksperimentaalpsühholoogia ja paljude teiste valdkondade teadlased on välja töötanud palju inimnägemise teooriaid. Ja ühte neist nimetatakse kontrastitundlikkuse funktsioonid. Need on seotud ruumilise ja ajalise valgustusega. Lühidalt öeldes on küsimus selles, kui palju muudatusi on vaja teha, enne kui vaatleja neid märkab. Pange tähele sõna "funktsioon" mitmust. Selle põhjuseks on asjaolu, et saame mõõta kontrastitundlikkuse funktsioone mitte ainult mustvalgete, vaid ka värviliste piltide puhul. Nende katsete tulemused näitavad, et enamikul juhtudel on meie silmad tundlikumad heleduse kui värvi suhtes.

Kuna me teame, et oleme pildi heleduse suhtes tundlikumad, võime proovida seda fakti kasutada.

Värvimudel

Mõtlesime natuke välja, kuidas RGB-skeemi abil värvipiltidega töötada. On ka teisi mudeleid. On olemas mudel, mis eraldab heleduse kroomist ja seda tuntakse kui YCbCr. Muide, on ka teisi mudeleid, mis teevad sarnase jaotuse, kuid me käsitleme ainult seda.

Selles värvimudelis Y on heleduse esitus ja kasutab ka kahte värvikanalit: Cb (rikas sinine) ja Cr (rikas punane). YCbCr saab tuletada RGB-st ja võimalik on ka pöördkonversioon. Seda mudelit kasutades saame luua täisvärvilisi pilte, nagu näeme allpool:

Kuidas videokoodek töötab? 1. osa: põhitõed

Teisendage YCbCr ja RGB vahel

Keegi vaidleb vastu: kuidas on võimalik saada kõik värvid, kui rohelist ei kasutata?

Sellele küsimusele vastamiseks teisendame RGB-d YCbCr-ks. Kasutame standardis kasutusele võetud koefitsiente BT.601, mida üksus soovitas ITU-R. See jaotus määrab digitaalvideo standardid. Näiteks: mis on 4K? Milline peaks olema kaadrisagedus, eraldusvõime, värvimudel?

Kõigepealt arvutame heleduse. Kasutame ITU pakutud konstante ja asendame RGB väärtused.

Y = 0.299R + 0.587G + 0.114B

Pärast heleduse saavutamist eraldame sinise ja punase värvi:

Cb = 0.564(B - Y)

Cr = 0.713(R - Y)

Ja YCbCr abil saame ka tagasi teisendada ja isegi roheliseks saada:

R = Y + 1.402Cr

B = Y + 1.772Cb

G = Y - 0.344Cb - 0.714Cr

Tavaliselt kasutavad kuvarid (monitorid, telerid, ekraanid jne) ainult RGB mudelit. Kuid seda mudelit saab korraldada erineval viisil:

Kuidas videokoodek töötab? 1. osa: põhitõed

Värvi alamproovide võtmine

Kujutise puhul, mis on kujutatud heleduse ja värvilisuse kombinatsioonina, saame teabe valikulise eemaldamise teel ära kasutada inimese visuaalse süsteemi suuremat tundlikkust heleduse kui värvilisuse suhtes. Kroomi alamdiskreetimine on piltide kodeerimise meetod, kasutades värvide puhul väiksemat eraldusvõimet kui heleduse jaoks.

Kuidas videokoodek töötab? 1. osa: põhitõed

Kui palju on lubatud värvide eraldusvõimet vähendada?! Selgub, et juba on olemas mõned diagrammid, mis kirjeldavad, kuidas käsitleda eraldusvõimet ja liitmist (Resulting Color = Y + Cb + Cr).

Neid skeeme tuntakse kui alladiskreetimissüsteemid ja neid väljendatakse 3-kordse suhtena - a:x:y, mis määrab heleduse ja värvide erinevuse signaalide näidiste arvu.

a — horisontaalne proovivõtustandard (tavaliselt 4)
x — värvinäidiste arv esimeses pikslireas (horisontaalne eraldusvõime võrreldes a)
y — värvinäidiste muutuste arv esimese ja teise pikslirea vahel.

Erandiks on 4:1:0, pakkudes igas 4x4 heleduse eraldusvõimega plokis ühe värvinäidise.

Kaasaegsetes koodekites kasutatavad tavalised skeemid:

  • 4:4:4 (allavõtit ei toimu)
  • 4:2:2
  • 4:1:1
  • 4:2:0
  • 4:1:0
  • 3:1:1

YCbCr 4:2:0 – liitmise näide

Siin on ühendatud pilt, kasutades YCbCr 4:2:0. Pange tähele, et kulutame ainult 12 bitti piksli kohta.

Kuidas videokoodek töötab? 1. osa: põhitõed

Selline näeb välja sama pilt, mis on kodeeritud põhiliste värvide alamdisamplimise tüüpidega. Esimene rida on viimane YCbCr, alumine rida näitab kroma eraldusvõimet. Väga korralikud tulemused, arvestades kerget kvaliteedilangust.

Kuidas videokoodek töötab? 1. osa: põhitõed

Mäletate, kui loendasime 278 GB salvestusruumi tunnipikkuse videofaili salvestamiseks eraldusvõimega 720p ja 30 kaadrit sekundis? Kui kasutame YCbCr 4:2:0, siis see suurus väheneb poole võrra - 139 GB. Siiani on see vastuvõetavast tulemusest veel kaugel.

YCbCr histogrammi saate ise hankida FFmpegi abil. Sellel pildil domineerib sinine punase üle, mis on histogrammil endal selgelt näha.

Kuidas videokoodek töötab? 1. osa: põhitõed

Värv, heledus, värvigamma – videoülevaade

Soovitame vaadata seda suurepärast videot. See selgitab, mis on heledus, ja üldiselt on kõik punktid punktidega ё heleduse ja värvi kohta.

Raami tüübid

Liigume edasi. Proovime ajalise liiasuse kõrvaldada. Kuid kõigepealt määratleme mõned põhiterminoloogia. Oletame, et meil on film kiirusega 30 kaadrit sekundis, siin on selle esimesed 4 kaadrit:

Kuidas videokoodek töötab? 1. osa: põhitõed Kuidas videokoodek töötab? 1. osa: põhitõed Kuidas videokoodek töötab? 1. osa: põhitõed Kuidas videokoodek töötab? 1. osa: põhitõed

Kaadrites näeme palju kordusi: näiteks sinine taust, mis kaadrist kaadrisse ei muutu. Selle probleemi lahendamiseks võime need abstraktselt liigitada kolme tüüpi raamidesse.

I-raam (Intro raam)

I-raam (võrdlusraam, võtmeraam, siseraam) on iseseisev. Olenemata sellest, mida soovite visualiseerida, on I-kaader sisuliselt staatiline foto. Esimene kaader on tavaliselt I-kaader, kuid me jälgime regulaarselt I-kaadreid isegi mitte esimeste kaadrite hulgas.

Kuidas videokoodek töötab? 1. osa: põhitõed

P-raam (Predigeeritud raam)

P-kaader (ennustav kaader) kasutab ära asjaolu, et peaaegu alati saab praegust pilti taasesitada eelmise kaadri abil. Näiteks teises freimis on ainsaks muudatuseks palli edasiliikumine. Kaadri 2 saame lihtsalt kaadrit 1 veidi muutes, kasutades ainult nende kaadrite erinevust. Kaadri 2 koostamiseks viitame eelmisele kaadrile 1.

Kuidas videokoodek töötab? 1. osa: põhitõedKuidas videokoodek töötab? 1. osa: põhitõed

B-raam (Bi-ennustav raam)

Aga lingid mitte ainult mineviku, vaid ka tulevaste kaadrite juurde, et pakkuda veelgi paremat tihendamist?! See on põhimõtteliselt B-raam (kahesuunaline kaader).

Kuidas videokoodek töötab? 1. osa: põhitõedKuidas videokoodek töötab? 1. osa: põhitõedKuidas videokoodek töötab? 1. osa: põhitõed

Vahepealne taganemine

Neid raamitüüpe kasutatakse parima võimaliku tihenduse tagamiseks. Kuidas see juhtub, vaatame järgmises jaotises. Praeguseks olgu öeldud, et kulutatud mälu poolest on kõige “kallim” I-kaader, P-kaader on märgatavalt odavam, kuid video jaoks on kõige tulusam B-kaader.

Kuidas videokoodek töötab? 1. osa: põhitõed

Ajaline liiasus (kaadritevaheline ennustus)

Vaatame, millised võimalused on meil aja jooksul korduste minimeerimiseks. Seda tüüpi koondamise saame lahendada ristennustusmeetodite abil.

Püüame kulutada võimalikult vähe bitte, et kodeerida kaadrite 0 ja 1 jada.

Kuidas videokoodek töötab? 1. osa: põhitõed

Saame toota lahutamine, me lihtsalt lahutame kaadri 1 kaadrist 0. Saame kaadri 1, kasutame ainult selle ja eelmise kaadri vahet, tegelikult kodeerime ainult saadud jäägi.

Kuidas videokoodek töötab? 1. osa: põhitõed

Aga mis siis, kui ma ütleksin teile, et on veel parem meetod, mis kasutab veelgi vähem bitte?! Kõigepealt murrame raami 0 selgeks plokkidest koosnevaks ruudustikuks. Ja siis proovime kaadrist 0 pärit plokke sobitada kaadriga 1. Teisisõnu hindame liikumist kaadrite vahel.

Vikipeediast - ploki liikumise kompenseerimine

Ploki liikumise kompensatsioon jagab praeguse kaadri mittekattuvateks plokkideks ja liikumise kompensatsiooni vektor annab teada plokkide päritolu (tavaline eksiarvamus on see, et eelmine kaader on jagatud mittekattuvateks plokkideks ja liikumiskompensatsiooni vektorid näitavad, kuhu need plokid lähevad. Kuid tegelikult on see vastupidi - analüüsitakse mitte eelmist kaadrit, vaid järgmist; pole selge, kus plokid liiguvad, vaid kust nad tulid). Tavaliselt kattuvad lähteplokid lähtekaadris. Mõned videotihendusalgoritmid koondavad praeguse kaadri isegi mitte ühe, vaid mitme varem edastatud kaadri osadest.

Kuidas videokoodek töötab? 1. osa: põhitõed

Hindamisprotsessi käigus näeme, et pall on liikunud (x= 0 y=25) poolt (x= 6 y=26), väärtused x и y määrata liikumisvektorit. Teine samm, mida saame bittide säilitamiseks teha, on kodeerida ainult liikumisvektorite erinevus viimase ploki asukoha ja ennustatud asukoha vahel, nii et lõplik liikumisvektor on (x=6-0=6, y=26-25=1 ).

Reaalses olukorras jaguneks see pall kaheks n blokeerib, kuid see ei muuda asja olemust.

Kaadris olevad objektid liiguvad kolmes dimensioonis, nii et kui pall liigub, võib see muutuda visuaalselt väiksemaks (või suuremaks, kui see liigub vaataja poole). On normaalne, et plokkide vahel ei teki täiuslikku sobivust. Siin on meie hinnangu ja tegeliku pildi kombineeritud vaade.

Kuidas videokoodek töötab? 1. osa: põhitõed

Kuid me näeme, et kui kasutame liikumise hinnangut, on kodeerimiseks märgatavalt vähem andmeid kui kaadritevahelise delta arvutamiseks lihtsama meetodi kasutamisel.

Kuidas videokoodek töötab? 1. osa: põhitõed

Kuidas näeks välja tõeline liikumiskompensatsioon

Seda tehnikat rakendatakse kõikidele plokkidele korraga. Sageli jagatakse meie tingimuslikult liikuv pall korraga mitmeks plokiks.

Kuidas videokoodek töötab? 1. osa: põhitõed

Saate neid mõisteid kasutades ise aimu saada jupyter.

Liikumisvektorite vaatamiseks saate luua välise ennustusvideo, kasutades ffmpeg.

Kuidas videokoodek töötab? 1. osa: põhitõed

Võite ka kasutada Intel Video Pro analüsaator (see on tasuline, kuid on tasuta prooviperiood, mis on piiratud ainult esimese kümne kaadriga).

Kuidas videokoodek töötab? 1. osa: põhitõed

Ruumiline liiasus (sisemine prognoos)

Kui analüüsime videos iga kaadrit, leiame palju omavahel seotud alasid.

Kuidas videokoodek töötab? 1. osa: põhitõed

Vaatame selle näite läbi. See stseen koosneb peamiselt sinisest ja valgest värvist.

Kuidas videokoodek töötab? 1. osa: põhitõed

See on I-raam. Me ei saa ennustamiseks kasutada eelmisi kaadreid, kuid saame selle tihendada. Kodeerime punase ploki valiku. Kui vaatame selle naabreid, märkame, et selle ümber on teatud värvitrende.

Kuidas videokoodek töötab? 1. osa: põhitõed

Eeldame, et värvid levivad kaadris vertikaalselt. Mis tähendab, et tundmatute pikslite värv sisaldab selle naabrite väärtusi.

Kuidas videokoodek töötab? 1. osa: põhitõed

Selline prognoos võib osutuda valeks. Sel põhjusel peate rakendama seda meetodit (sisemine prognoos) ja seejärel lahutama tegelikud väärtused. See annab meile jääkploki, mille tulemuseks on originaaliga võrreldes palju tihendatud maatriks.

Kuidas videokoodek töötab? 1. osa: põhitõed

Kui soovite sisemiste ennustustega harjutada, saate ffmpeg abil luua makroplokkidest ja nende ennustustest video. Iga ploki värvi tähenduse mõistmiseks peate lugema ffmpegi dokumentatsiooni.

Kuidas videokoodek töötab? 1. osa: põhitõed

Või võite kasutada Intel Video Pro Analyzerit (nagu ma eespool mainisin, on tasuta prooviversioon piiratud esimese 10 kaadriga, kuid sellest piisab teile alguses).

Kuidas videokoodek töötab? 1. osa: põhitõed

Teine osa: Kuidas videokoodek töötab

Allikas: www.habr.com

Lisa kommentaar