Hvað? Vídeó merkjamál er hugbúnaður/vélbúnaður sem þjappar saman og/eða þjappar niður stafrænt myndband.
Fyrir hvað? Þrátt fyrir ákveðnar takmarkanir bæði hvað varðar bandbreidd og
og hvað varðar gagnageymslupláss krefst markaðurinn sífellt meiri gæði myndbands. Manstu hvernig við í síðustu færslu reiknuðum út lágmarkskröfur fyrir 30 ramma á sekúndu, 24 bita á pixla, með 480x240 upplausn? Við fengum 82,944 Mbit/s án þjöppunar. Þjöppun er sem stendur eina leiðin til að senda almennt HD/FullHD/4K á sjónvarpsskjái og internetið. Hvernig er þetta náð? Nú skulum við líta stuttlega á helstu aðferðir.
Algeng mistök sem nýliðar gera eru að rugla saman stafrænum myndkóða og stafrænu myndbandsíláti. Gámur er ákveðið snið. Umbúðir sem innihalda lýsigögn myndbands (og hugsanlega hljóð). Hægt er að hugsa um þjappað myndband sem gámafarm.
Venjulega gefur framlenging myndbandsskrár til kynna tegund íláts þess. Til dæmis er skráin video.mp4 líklega ílát MPEG-4 hluti 14, og skrá sem heitir video.mkv er líklegast matryoshka. Til að vera alveg viss um merkjamálið og gámasniðið geturðu notað FFmpeg eða MediaInfo.
Smá saga
Áður en við komum að Hvernig?, við skulum kafa aðeins í söguna til að skilja eldri merkjamál aðeins betur.
Vídeó merkjamál H.261 birtist árið 1990 (tæknilega séð - árið 1988) og var búið til til að starfa á gagnaflutningshraða 64 Kbps. Það notaði þegar hugmyndir eins og litaundirsýni, stórblokkir osfrv. Vídeó merkjamál staðall var gefinn út árið 1995 H.263, sem þróaðist til ársins 2001.
Fyrsta útgáfan var fullgerð árið 2003 H.264 / AVC. Sama ár gaf TrueMotion út ókeypis tapaða myndkóða sem heitir VP3. Google keypti fyrirtækið árið 2008 og gaf út VP8 sama ár. Í desember 2012 gaf Google út VP9, og það er stutt á um ¾ af vaframarkaðnum (þar á meðal farsímum).
AV1 er nýr ókeypis og opinn uppspretta vídeó merkjamál þróað af Alliance for Open Media (AOMedia), sem inniheldur frægustu fyrirtækin, eins og: Google, Mozilla, Microsoft, Amazon, Netflix, AMD, ARM, NVidia, Intel og Cisco. Fyrsta útgáfan af merkjamálinu, 0.1.0, var gefin út 7. apríl 2016.
Fæðing AV1
Snemma árs 2015 var Google að vinna að VP10Xiph (sem er í eigu Mozilla) var að vinna að Daala, og Cisco bjó til sinn eigin ókeypis myndkóða sem heitir Þór.
Þá MPEG LA fyrst tilkynnt árleg mörk fyrir HEVC (H.265) og 8 sinnum hærra gjald en fyrir H.264, en þeir breyttu reglunum fljótlega aftur:
engin árleg takmörk,
efnisgjald (0,5% af tekjum) og
einingagjaldið er um 10 sinnum hærra en H.264.
Alliance for Open Media var búið til af fyrirtækjum frá mismunandi sviðum: búnaðarframleiðendum (Intel, AMD, ARM, Nvidia, Cisco), efnisveiturum (Google, Netflix, Amazon), vafraframleiðendum (Google, Mozilla) og fleirum.
Fyrirtækin áttu sameiginlegt markmið - kóngagjaldfrjálst myndbandsmerkjamál. Þá birtist AV1 með mun einfaldara einkaleyfisleyfi. Timothy B. Terryberry hélt töfrandi kynningu sem varð upphafið að núverandi AV1 hugmynd og leyfislíkani þess.
Þú verður hissa að vita að þú getur greint AV1 merkjamálið í gegnum vafra (áhugasamir geta farið á aomanalyzer.org).
Alhliða merkjamál
Við skulum skoða helstu aðferðir sem liggja til grundvallar alhliða myndbandsmerkjamálinu. Flest þessara hugtaka eru gagnleg og eru notuð í nútíma merkjamál eins og VP9, AV1 и HEVC. Ég vara þig við því að margt af því sem útskýrt er verður einfaldað. Stundum verða raunveruleikadæmi (eins og með H.264) notuð til að sýna tækni.
1. skref - að skipta myndinni
Fyrsta skrefið er að skipta rammanum í nokkra hluta, undirkafla og víðar.
Til hvers? Það eru margar ástæður. Þegar við kljúfum mynd getum við spáð fyrir um hreyfivektorinn með því að nota litla hluta fyrir litla hreyfanlega hluta. Þó fyrir kyrrstæðan bakgrunn geturðu takmarkað þig við stærri hluta.
Merkjamál raða þessum hlutum venjulega í hluta (eða klumpur), stórblokkir (eða kóðatréblokkir) og marga undirkafla. Hámarksstærð þessara skiptinga er mismunandi, HEVC stillir hana á 64x64 á meðan AVC notar 16x16, og hægt er að skipta undirhlutum upp í 4x4 stærðir.
Manstu hvers konar ramma úr síðustu grein?! Það sama er hægt að nota á kubba, þannig að við getum haft I-brot, B-blokk, P-macroblock o.s.frv.
Fyrir þá sem vilja æfa, sjáið hvernig myndinni er skipt í hluta og undirkafla. Til að gera þetta geturðu notað þann sem þegar er minnst á í fyrri grein. Intel Video Pro Analyzer (sá sem er greidd, en með ókeypis prufuútgáfu sem er takmörkuð við fyrstu 10 ramma). Hlutar greindir hér VP9:
2. skref - spá
Þegar við höfum hluta, getum við gert stjörnuspár fyrir þá. Fyrir INTER spár verður að flytja hreyfivektorar og það sem eftir er, og fyrir INTRA spá er það sent spá stefnu og afgangurinn.
3. skref - umbreyting
Þegar við höfum afgangsblokk (spáður hluti → raunverulegur hluti), er hægt að umbreyta honum á þann hátt að við vitum hvaða pixlum er hægt að farga á meðan heildargæðum er viðhaldið. Það eru nokkrar umbreytingar sem veita nákvæma hegðun.
Þó að það séu aðrar aðferðir, skulum við skoða þær nánar. stakur kósínusumbreyting (DCT - frá stakur kósínusumbreyting). Helstu aðgerðir DCT:
Breytir kubba af pixlum í jafnstóra kubba með tíðnistuðlum.
Þétir afl til að koma í veg fyrir staðbundna offramboð.
Veitir afturkræfni.
2. febrúar 2017 Sintra R.J. (Cintra, RJ) og Bayer F.M. (Bayer FM) birti grein um DCT-líka umbreytingu fyrir myndþjöppun sem þarfnast aðeins 14 viðbóta.
Ekki hafa áhyggjur ef þú skilur ekki kosti hvers liðs. Nú skulum við nota ákveðin dæmi til að sjá raunverulegt gildi þeirra.
Við skulum taka þennan 8x8 blokk af punktum:
Þessi kubb er mynduð í eftirfarandi 8 x 8 pixla mynd:
Notaðu DCT á þennan pixlablokk og fáðu 8x8 stuðlablokk:
Og ef við myndum þennan stuðlablokk fáum við eftirfarandi mynd:
Eins og þú sérð lítur það ekki út eins og upprunalega myndin. Þú getur séð að fyrsti stuðullinn er mjög frábrugðinn öllum hinum. Þessi fyrsti stuðull er þekktur sem DC stuðullinn, sem táknar öll sýnin í inntaksfylkingunni, eitthvað eins og meðaltal.
Þessi stuðlablokk hefur áhugaverðan eiginleika: hann aðskilur hátíðnihluti frá lágtíðniþáttum.
Í mynd safnast megnið af kraftinum saman við lægri tíðni, þannig að ef þú breytir myndinni í tíðniþætti hennar og fleygir hærri tíðnistuðlunum geturðu minnkað gagnamagnið sem þarf til að lýsa myndinni án þess að fórna of miklum myndgæðum.
Tíðni vísar til þess hversu hratt merkið breytist.
Við skulum reyna að beita þekkingunni sem fékkst í prófunartilvikinu með því að breyta upprunalegu myndinni í tíðni hennar (stuðlablokk) með því að nota DCT og henda síðan hluta af minnstu stuðlunum.
Fyrst umbreytum við því í tíðnisviðið.
Næst fleygum við hluta (67%) af stuðlunum, aðallega neðri hægri hlutanum.
Að lokum endurgerðum við myndina úr þessum fleygða stuðlablokk (mundu að hún verður að vera öfugsnúin) og berum hana saman við frumritið.
Við sjáum að það líkist upprunalegu myndinni, en það er mikill munur frá upprunalegu. Við hentum út 67,1875% og fengum samt eitthvað sem líkist upprunalegu. Það var hægt að henda stuðlunum af yfirvegun til að fá mynd af enn betri gæðum, en það er næsta umræðuefni.
Hver stuðull er myndaður með því að nota alla pixla
Mikilvægt: hver stuðull er ekki beint varpaður á einn pixla heldur er hann vegin summa allra pixla. Þetta ótrúlega graf sýnir hvernig fyrsti og annar stuðullinn er reiknaður út með því að nota vægi sem eru einstök fyrir hverja vísitölu.
Þú getur líka reynt að sjá DCT með því að skoða einfalda myndmyndun byggða á því. Til dæmis, hér er táknið A sem er búið til með því að nota hverja stuðlaþyngd:
4. skref - magngreining
Eftir að við hendum út nokkrum stuðlum í fyrra skrefi, í síðasta skrefi (umbreytingu) framkvæmum við sérstakt form magngreiningar. Á þessu stigi er ásættanlegt að glata upplýsingum. Eða, einfaldara, við munum magngreina stuðlana til að ná fram þjöppun.
Hvernig er hægt að magngreina stuðlablokk? Ein einfaldasta aðferðin er samræmd magngreining, þegar við tökum kubb, deilum honum með einu gildi (með 10) og námundum niðurstöðuna.
Getum við snúið þessum stuðlablokk við? Já, við getum margfaldað með sama gildi og við deilum með.
Þessi nálgun er ekki sú besta vegna þess að hún tekur ekki tillit til mikilvægis hvers stuðuls. Hægt væri að nota fylki af magnmælum í stað eins gildis og þetta fylki gæti nýtt sér DCT eiginleikann með því að magngreina meirihluta neðra hægri og minnihluta efra vinstri.
Skref 5 - óreiðukóðun
Þegar við höfum magnbundið gögnin (myndablokkir, brot, rammar) getum við samt þjappað þeim taplaust saman. Það eru margar algrímskar leiðir til að þjappa gögnum. Við ætlum að skoða nokkrar þeirra í skyndi, til að fá dýpri skilning geturðu lesið bókina Understanding Compression: Data Compression for Modern Developers ("Skilningur á þjöppun: Gagnaþjöppun fyrir nútíma hönnuði").
Vídeókóðun með VLC
Segjum að við höfum straum af persónum: a, e, r и t. Líkurnar (á bilinu 0 til 1) á því hversu oft hver karakter birtist í straumi eru sýndar í þessari töflu.
a
e
r
t
Líkur
0,3
0,3
0,2
0,2
Við getum úthlutað einstökum tvíundarkóðum (helst litlum) til þeirra sem eru líklegastir og stærri kóðar til þeirra sem eru ólíklegri.
a
e
r
t
Líkur
0,3
0,3
0,2
0,2
Tvöfaldur kóða
0
10
110
1110
Við þjöppum straumnum saman, að því gefnu að við munum eyða 8 bitum fyrir hvern staf. Án þjöppunar þyrfti 24 bita á hvern staf. Ef þú skiptir út hverjum staf fyrir kóðann, færðu sparnað!
Fyrsta skrefið er að umrita stafinn e, sem er jafnt og 10, og annar stafurinn er a, sem er bætt við (ekki á stærðfræðilegan hátt): [10][0], og að lokum þriðja stafurinn t, sem gerir endanlegt þjappað bitastraum okkar jafnt og [10][0][1110] eða 1001110, sem krefst aðeins 7 bita (3,4 sinnum minna pláss en upprunalega).
Athugið að hver kóði verður að vera einstakur kóði með forskeyti. Huffman reiknirit mun hjálpa þér að finna þessar tölur. Þó að þessi aðferð sé ekki gallalaus, þá eru til myndkóðar sem bjóða enn upp á þessa reikniritaðferð til þjöppunar.
Bæði umritarinn og afkóðarinn verða að hafa aðgang að táknatöflu með tvíundarkóðum sínum. Þess vegna er líka nauðsynlegt að senda töflu sem inntak.
Reiknikóðun
Segjum að við höfum straum af persónum: a, e, r, s и t, og líkur þeirra eru sýndar í þessari töflu.
a
e
r
s
t
Líkur
0,3
0,3
0,15
0,05
0,2
Með því að nota þessa töflu munum við búa til svið sem innihalda alla mögulega stafi, raðað eftir stærsta fjölda.
Nú skulum umrita straum af þremur stöfum: borða.
Veldu fyrst fyrsta stafinn e, sem er á undirbilinu frá 0,3 til 0,6 (ekki meðtalið). Við tökum þetta undirsvið og skiptum því aftur í sömu hlutföllum og áður, en fyrir þetta nýja svið.
Höldum áfram að kóða strauminn okkar borða. Taktu nú annan karakterinn a, sem er í nýja undirsviðinu frá 0,3 til 0,39, og taktu síðan síðasta stafinn okkar t og endurtaka sama ferlið aftur, við fáum endanlegt undirsvið frá 0,354 til 0,372.
Við þurfum bara að velja tölu í síðasta undirsviðinu frá 0,354 til 0,372. Við skulum velja 0,36 (en þú getur valið hvaða aðra tölu sem er í þessu undirsviði). Aðeins með þessu númeri munum við geta endurheimt upprunalega strauminn okkar. Það er eins og við séum að draga línu innan sviðanna til að kóða strauminn okkar.
Öfug aðgerð (þ.e. umskráningu) er alveg jafn einfalt: með númerinu okkar 0,36 og upphafssviðinu okkar getum við keyrt sama ferli. En núna, með því að nota þetta númer, auðkennum við strauminn sem er kóðaður með þessu númeri.
Með fyrsta sviðinu tökum við eftir því að númerið okkar samsvarar sneiðinni, þess vegna er þetta fyrsti stafurinn okkar. Nú skiptum við þessu undirsviði aftur með því að fylgja sama ferli og áður. Hér má sjá að 0,36 samsvarar tákninu a, og eftir að hafa endurtekið ferlið komumst við að síðasta persónunni t (myndar upprunalega kóðaða strauminn okkar borða).
Bæði umritarinn og afkóðarinn verða að hafa töflu yfir líkur á táknum, svo það er nauðsynlegt að senda það í inntaksgögnum líka.
Alveg glæsilegt, er það ekki? Sá sem kom með þessa lausn var helvíti klár. Sumir myndkóðar nota þessa tækni (eða bjóða hana að minnsta kosti sem valkost).
Hugmyndin er að þjappa saman magnbundnum bitastraumi án taps. Vissulega vantar þessa grein tonn af smáatriðum, ástæðum, málamiðlun osfrv. En ef þú ert verktaki ættirðu að vita meira. Nýir merkjamál reyna að nota mismunandi entropy encoding algrím eins og ANS.
Skref 6 - bitastraumssnið
Eftir að hafa gert allt þetta er allt sem eftir er að pakka niður þjöppuðu rammanum í samhengi við skrefin sem gerðar eru. Afkóðaranum verður að vera skýrt upplýst um ákvarðanir sem kóðarinn tekur. Afkóðaranum verður að fá allar nauðsynlegar upplýsingar: bitadýpt, litarými, upplausn, spáupplýsingar (hreyfingarvektorar, stefnubundin INTER spá), snið, stig, rammatíðni, rammagerð, rammanúmer og margt fleira.
Við munum líta fljótt á bitastrauminn H.264. Fyrsta skrefið okkar er að búa til lágmarks H.264 bitastraum (FFmpeg bætir sjálfgefið við öllum kóðunarvalkostum eins og SEI NAL - við munum komast að því hvað það er aðeins lengra). Við getum gert þetta með því að nota okkar eigin geymslu og FFmpeg.
Þessi skipun mun búa til hráan bitastraum H.264 með einum ramma, 64×64 upplausn, með litarými YUV420. Í þessu tilviki er eftirfarandi mynd notuð sem rammi.
H.264 bitastraumur
Standard AVC (H.264) ákvarðar að upplýsingar verði sendar í stórrömmum (í netskilningi), sem kallast nal (þetta er netútdráttarstig). Meginmarkmið NAL er að bjóða upp á „vefvæna“ myndbandakynningu. Þessi staðall ætti að virka á sjónvörpum (tengd straumi), internetinu (pakkamiðað).
Það er samstillingarmerki til að skilgreina mörk NAL þátta. Hvert samstillingartákn inniheldur gildi 0x00 0x00 0x01, nema sá allra fyrsta, sem er jöfn 0x00 0x00 0x00 0x01. Ef við ræsum hexdump fyrir myndaða H.264 bitastrauminn auðkennum við að minnsta kosti þrjú NAL mynstur í upphafi skráarinnar.
Eins og fram hefur komið verður afkóðarinn að þekkja ekki aðeins myndgögnin heldur einnig upplýsingarnar um myndbandið, ramma, liti, breytur sem notaðar eru og margt fleira. Fyrsta bæti hvers NAL skilgreinir flokk sinn og gerð.
NAL tegundaauðkenni
Lýsing
0
Óþekkt gerð
1
Kóðað myndbrot án IDR
2
Kóðuð sneiðgagnahluti A
3
Kóðuð sneiðgagnahluti B
4
Kóðuð sneiðgagnahluti C
5
Kóðað IDR brot af IDR mynd
6
Nánari upplýsingar um SEI viðbótina
7
SPS Sequence Parameter Set
8
Sett af PPS myndbreytum
9
Aðgangsskilur
10
Lok röð
11
Þráðarlok
...
...
Venjulega er fyrsta NAL bitastraums PLC. Þessi tegund af NAL ber ábyrgð á að upplýsa um algengar kóðunbreytur eins og prófíl, stig, upplausn osfrv.
Ef við sleppum fyrsta samstillingarmerkinu getum við afkóða fyrsta bæti til að komast að því hvaða NAL tegund er fyrst.
Til dæmis er fyrsta bætið á eftir samstillingartákninu 01100111, þar sem fyrsti hluti (0) er á sviði forbidden_zero_bit. Næstu 2 bitar (11) segir okkur völlinn nal_ref_idc, sem gefur til kynna hvort þessi NAL sé viðmiðunarreitur eða ekki. Og hinir 5 bitar (00111) segir okkur völlinn nal_unit_type, í þessu tilfelli er það SPS blokkin (7) NAL.
Annað bæti (tvöfaldur=01100100, álög=0x64, desember=100) í SPS NAL er völlurinn profile_idc, sem sýnir sniðið sem kóðarinn notaði. Í þessu tilviki var takmarkaður háttur notaður (þ.e. hásnið án tvíátta B-hluta stuðning).
Ef þú skoðar bitastraumsforskriftina H.264 fyrir SPS NAL munum við finna mörg gildi fyrir færibreytuheiti, flokk og lýsingu. Til dæmis skulum við skoða reitina mynd_breidd_í_mbs_mínus_1 и mynd_hæð_í_korti_einingum_mínus_1.
Parameter nafn
flokkur
Lýsing
mynd_breidd_í_mbs_mínus_1
0
ue (v)
mynd_hæð_í_korti_einingum_mínus_1
0
ue (v)
Ef við framkvæmum nokkrar stærðfræðilegar aðgerðir með gildum þessara sviða, munum við fá upplausn. Maður getur táknað 1920 x 1080 með því að nota mynd_breidd_í_mbs_mínus_1 með gildið 119 ((119 + 1) * macroblock_size = 120 * 16 = 1920). Aftur, til að spara pláss, í stað þess að kóða 1920, gerðum við það með 119.
Ef við höldum áfram að athuga myndskeiðið okkar sem búið var til í tvöfalt formi (til dæmis: xxd -b -c 11 v/minimal_yuv420.h264), þá geturðu farið í síðasta NAL, sem er ramminn sjálfur.
Hér sjáum við fyrstu 6 bæta gildin: 01100101 10001000 10000100 00000000 00100001 11111111. Þar sem vitað er að fyrsta bæti gefur til kynna NAL gerð, í þessu tilviki (00101) er IDR brot (5), og þá geturðu skoðað það frekar:
Með því að nota forskriftarupplýsingarnar verður hægt að afkóða brotagerðina (sneið_gerð) og rammanúmer (ramma_númer) meðal annarra mikilvægra sviða.
Til að fá gildi sumra reita (ue(v), me(v), se(v) eða te(v)), þurfum við að afkóða brotið með því að nota sérstakan afkóðara sem byggir á veldisvísis Golomb kóða. Þessi aðferð er mjög skilvirk til að kóða breytugildi, sérstaklega þegar það eru mörg sjálfgefin gildi.
Merkingar sneið_gerð и ramma_númer af þessu myndbandi eru 7 (I-brot) og 0 (fyrsti rammi).
Líta má á smástraum sem siðareglur. Ef þú vilt vita meira um bitastrauminn ættirðu að vísa til forskriftarinnar ITU H.264. Hér er makrómynd sem sýnir hvar myndgögnin eru (YUV í þjöppuðu formi).
Hægt er að skoða aðra bitastrauma, svo sem VP9, H.265 (HEVC) eða jafnvel nýja besta bitastrauminn okkar AV1. Eru þeir allir svipaðir? Nei, en þegar þú skilur að minnsta kosti einn er miklu auðveldara að skilja restina.
Viltu æfa? Kannaðu H.264 bitastrauminn
Þú getur búið til einn ramma myndband og notað MediaInfo til að skoða bitastrauminn H.264. Reyndar kemur ekkert í veg fyrir að þú horfir jafnvel á frumkóðann sem greinir bitastrauminn H.264 (AVC).
Til að æfa er hægt að nota Intel Video Pro Analyzer (sagði ég nú þegar að forritið sé greitt, en það er ókeypis prufuútgáfa með hámarki 10 ramma?).
Skoða
Athugaðu að margir nútíma merkjamál nota sama líkan og við rannsökuðum. Hér skulum við kíkja á blokkarmyndina af myndbandsmerkjanum Þór. Það inniheldur öll skrefin sem við höfum farið í gegnum. Allur tilgangurinn með þessari færslu er að minnsta kosti að veita þér betri skilning á nýjungum og skjölum á þessu sviði.
Áður var reiknað út að 139 GB af plássi þyrfti til að geyma myndbandsskrá sem endaði eina klukkustund í 720p gæðum og 30 fps. Ef þú notar aðferðirnar sem fjallað er um í þessari grein (spá milli ramma og innri, umbreytingu, magngreiningu, óreiðukóðun osfrv.), þá geturðu náð (byggt á þeirri staðreynd að við eyðum 0,031 bitum á pixla) myndbandi af alveg viðunandi gæðum , sem tekur aðeins 367,82 MB, ekki 139 GB af minni.
Hvernig nær H.265 betra þjöppunarhlutfalli en H.264?
Nú þegar við vitum meira um hvernig merkjamál virka er auðveldara að skilja hvernig nýrri merkjamál geta skilað hærri upplausn með færri bitum.
Ef þú berð saman AVC и HEVC, það er þess virði að muna að þetta er næstum alltaf val á milli meiri CPU álags og þjöppunarhlutfalls.
HEVC hefur fleiri kafla (og undirkafla) valkosti en AVC, fleiri innri spáleiðbeiningar, bætt óreiðukóðun og fleira. Allar þessar endurbætur hafa verið gerðar H.265 fær um að þjappa 50% meira en H.264.