Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Birinchi qism: Video va tasvirlar bilan ishlash asoslari

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Nima? Video kodek raqamli videoni siqib chiqaradigan va/yoki ochuvchi dasturiy ta'minot/apparat qismidir.

Sabab? O'tkazish qobiliyati jihatidan ham, ma'lum cheklovlarga qaramay
va ma'lumotlarni saqlash maydoni nuqtai nazaridan, bozor tobora yuqori sifatli video talab qiladi. Oxirgi xabarda biz 30x24 o'lchamdagi soniyasiga 480 kadr, piksel boshiga 240 bit uchun kerakli minimalni qanday hisoblaganimizni eslaysizmi? Biz siqilishsiz 82,944 Mbit/s oldik. Siqish hozirda HD/FullHD/4K formatini televizor ekranlari va Internetga uzatishning yagona usuli hisoblanadi. Bunga qanday erishiladi? Endi asosiy usullarni qisqacha ko'rib chiqamiz.

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Tarjima EDISON Software ko'magida amalga oshirildi.

Biz unashtirilganmiz video kuzatuv tizimlarini integratsiyalash, shuningdek biz mikrotomografni ishlab chiqmoqdamiz.

Kodek va konteyner

Yangi boshlanuvchilarning keng tarqalgan xatosi raqamli video kodek va raqamli video konteynerini chalkashtirib yuborishdir. Konteyner ma'lum bir formatdir. Video (va ehtimol audio) metamaʼlumotlarini oʻz ichiga olgan paket. Siqilgan videoni konteyner yuki deb hisoblash mumkin.

Odatda, video faylning kengaytmasi uning konteyner turini ko'rsatadi. Masalan, video.mp4 fayli konteyner bo'lishi mumkin MPEG-4 qismi 14, va video.mkv nomli fayl katta ehtimol bilan matryoshka. Kodek va konteyner formatiga to'liq ishonch hosil qilish uchun siz foydalanishingiz mumkin ffmpeg yoki MediaInfo.

Biroz tarix

Biz borishimizdan oldin Qanday qilib?, ba'zi eski kodeklarni biroz yaxshiroq tushunish uchun tarixga bir oz sho'ng'in qilaylik.

Video kodek H.261 1990 yilda paydo bo'lgan (texnik jihatdan - 1988 yilda) va 64 Kbit / s ma'lumotlarni uzatish tezligida ishlash uchun yaratilgan. U allaqachon ranglarning quyi namunalari, makrobloklar va boshqalar kabi g'oyalardan foydalangan. Video kodek standarti 1995 yilda nashr etilgan H.2632001 yilgacha rivojlangan.

Birinchi versiya 2003 yilda yakunlandi H.264 / AVC. O'sha yili TrueMotion o'zining bepul yo'qolgan video kodekini chiqardi VP3. Google kompaniyani 2008 yilda sotib olib, chiqargan VP8 xuddi shu yili. 2012 yil dekabr oyida Google chiqarildi VP9, va u brauzer bozorining taxminan ¾ qismida qo'llab-quvvatlanadi (shu jumladan mobil qurilmalar).

AV1 tomonidan ishlab chiqilgan yangi bepul va ochiq manbali video kodek Ochiq ommaviy axborot vositalari uchun ittifoq (AOMedia), eng mashhur kompaniyalarni o'z ichiga oladi, masalan: Google, Mozilla, Microsoft, Amazon, Netflix, AMD, ARM, NVidia, Intel va Cisco. Kodekning birinchi versiyasi 0.1.0 7 yil 2016 aprelda nashr etilgan.

AV1 ning tug'ilishi

2015 yil boshida Google ustida ishlayotgan edi VP10Xiph (Mozilla kompaniyasiga tegishli) ustida ishlayotgan edi Daala, va Cisco o'zining bepul video kodekini yaratdi Thor.

so'ng MPEG LA uchun birinchi e'lon qilingan yillik limitlar HEVC (H.265) va to'lov H.8-ga qaraganda 264 baravar yuqori, lekin tez orada ular yana qoidalarni o'zgartirdilar:

yillik cheklov yo'q,
kontent to'lovi (daromadning 0,5%) va
birlik to'lovi H.10 dan taxminan 264 baravar yuqori.

Ochiq ommaviy axborot vositalari uchun ittifoq turli sohalardagi kompaniyalar tomonidan yaratilgan: uskunalar ishlab chiqaruvchilar (Intel, AMD, ARM, Nvidia, Cisco), kontent provayderlari (Google, Netflix, Amazon), brauzer yaratuvchilari (Google, Mozilla) va boshqalar.

Kompaniyalarning umumiy maqsadi bor edi - royaltisiz video kodek. Keyin paydo bo'ladi AV1 ancha sodda patent litsenziyasi bilan. Timoti B. Terriberri joriy AV1 kontseptsiyasi va uning litsenziyalash modelining kelib chiqishiga aylangan ajoyib taqdimot qildi.

AV1 kodekini brauzer orqali tahlil qilishingiz mumkinligini bilib hayron qolasiz (qiziqayotganlar aomanalyzer.org).

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Universal kodek

Keling, universal video kodek asosidagi asosiy mexanizmlarni ko'rib chiqaylik. Ushbu tushunchalarning aksariyati foydali va zamonaviy kodeklarda qo'llaniladi, masalan VP9, AV1 и HEVC. Men sizni ogohlantiraman, tushuntirilgan ko'p narsalar soddalashtiriladi. Ba'zan texnologiyalarni namoyish qilish uchun haqiqiy dunyo misollari (H.264 kabi) ishlatiladi.

1-qadam - tasvirni bo'lish

Birinchi qadam, ramkani bir nechta bo'limlarga, kichik bo'limlarga va undan tashqariga bo'lishdir.

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Sabab? Buning sabablari ko'p. Tasvirni ajratganimizda, kichik harakatlanuvchi qismlar uchun kichik qismlardan foydalanib, harakat vektorini aniqroq taxmin qilishimiz mumkin. Statik fon uchun siz o'zingizni kattaroq bo'limlar bilan cheklashingiz mumkin.

Kodeklar odatda ushbu bo'limlarni bo'limlarga (yoki bo'laklarga), makrobloklarga (yoki kodlash daraxti bloklariga) va bir nechta kichik bo'limlarga ajratadi. Ushbu bo'limlarning maksimal hajmi o'zgarib turadi, HEVC uni 64x64 ga o'rnatadi, AVC esa 16x16 dan foydalanadi va pastki qismlarni 4x4 o'lchamiga bo'lish mumkin.

Oxirgi maqoladagi ramka turlarini eslaysizmi?! Xuddi shu narsani bloklarga qo'llash mumkin, shuning uchun bizda I-fragment, B-blok, P-makroblok va boshqalar bo'lishi mumkin.

Amaliyot qilishni xohlaydiganlar uchun tasvir qanday bo'limlar va bo'limlarga bo'linganligini tomosha qiling. Buning uchun oldingi maqolada aytib o'tilganlardan foydalanishingiz mumkin. Intel Video Pro Analyzer (pullik, lekin dastlabki 10 kvadrat bilan cheklangan bepul sinov versiyasi bilan). Bu erda tahlil qilingan bo'limlar VP9:

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

2-bosqich - bashorat qilish

Bo'limlarga ega bo'lgach, biz ular uchun astrolojik prognozlar qilishimiz mumkin. Uchun INTER prognozlari o'tkazilishi kerak harakat vektorlari qolganlari esa INTRA prognozi uchun uzatiladi prognoz yo'nalishi va qolganlari.

3-bosqich - transformatsiya

Bizda qoldiq blok (prognoz qilingan qism → haqiqiy bo'lim) bo'lgandan so'ng, uni shunday o'zgartirishimiz mumkinki, biz umumiy sifatni saqlab qolgan holda qaysi piksellarni tashlab yuborish mumkinligini bilib olamiz. Aniq xatti-harakatni ta'minlaydigan ba'zi o'zgarishlar mavjud.

Boshqa usullar mavjud bo'lsa-da, ularni batafsil ko'rib chiqaylik. diskret kosinus konvertatsiyasi (DCT - dan diskret kosinus konvertatsiyasi). DCT ning asosiy funktsiyalari:

  • Piksel bloklarini chastota koeffitsientlarining teng o'lchamli bloklariga aylantiradi.
  • Fazoviy ortiqchalikni bartaraf etish uchun quvvatni zichlashtiradi.
  • Qaytarilishni ta'minlaydi.

2 yil 2017 fevral Sintra R.J. (Cintra, R.J.) va Bayer F.M. (Bayer F.M.) faqat 14 ta qo'shimchani talab qiladigan tasvirni siqish uchun DCTga o'xshash transformatsiya haqida maqola chop etdi.

Har bir nuqtaning afzalliklarini tushunmasangiz, tashvishlanmang. Endi ularning haqiqiy qiymatini ko'rish uchun aniq misollardan foydalanamiz.

Keling, ushbu 8x8 piksel blokini olaylik:

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Ushbu blok quyidagi 8 dan 8 pikselli tasvirga aylantiriladi:

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Ushbu piksellar blokiga DCT ni qo'llang va 8x8 koeffitsientlar blokini oling:

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Va agar biz ushbu koeffitsientlar blokini ko'rsatsak, biz quyidagi rasmni olamiz:

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Ko'rib turganingizdek, u asl tasvirga o'xshamaydi. Siz birinchi koeffitsientning barcha boshqalardan juda farq qilishini ko'rishingiz mumkin. Bu birinchi koeffitsient DC koeffitsienti sifatida tanilgan, u kirish massividagi barcha namunalarni ifodalaydi, o'rtacha kabi.

Ushbu koeffitsientlar bloki qiziqarli xususiyatga ega: u yuqori chastotali komponentlarni past chastotalilardan ajratib turadi.

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Tasvirda quvvatning katta qismi past chastotalarda to'plangan, shuning uchun agar siz tasvirni uning chastotali komponentlariga aylantirsangiz va yuqori chastotali koeffitsientlardan voz kechsangiz, juda ko'p tasvir sifatini yo'qotmasdan tasvirni tasvirlash uchun zarur bo'lgan ma'lumotlar miqdorini kamaytirishingiz mumkin.

Chastota signalning qanchalik tez o'zgarishini anglatadi.

Keling, test ishida olingan bilimlarni DCT yordamida dastlabki tasvirni uning chastotasiga (koeffitsientlar blokiga) aylantirib, keyin esa eng muhim koeffitsientlarning bir qismini tashlab qo'yishga harakat qilaylik.

Avval biz uni chastota domeniga aylantiramiz.

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Keyinchalik, koeffitsientlarning bir qismini (67%), asosan pastki o'ng qismini tashlaymiz.

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Nihoyat, biz ushbu tashlab ketilgan koeffitsientlar blokidan tasvirni qayta tiklaymiz (esda tutingki, u teskari bo'lishi kerak) va uni asl nusxasi bilan taqqoslang.

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Biz uning asl tasvirga o'xshashligini ko'ramiz, lekin asl nusxadan juda ko'p farqlar mavjud. Biz 67,1875% ni tashladik va hali ham asl nusxaga o'xshash narsalarni oldik. Yaxshiroq tasvirni olish uchun koeffitsientlarni o'ylab ko'rish mumkin edi, ammo bu keyingi mavzu.

Har bir koeffitsient barcha piksellar yordamida yaratiladi

Muhim: har bir koeffitsient to'g'ridan-to'g'ri bitta pikselga o'tkazilmaydi, lekin barcha piksellarning og'irlashtirilgan yig'indisidir. Ushbu ajoyib grafik birinchi va ikkinchi koeffitsientlar har bir indeksga xos bo'lgan og'irliklar yordamida qanday hisoblanganligini ko'rsatadi.

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Shuningdek, siz DCT ni unga asoslangan oddiy tasvir shakllanishiga qarab tasavvur qilishga harakat qilishingiz mumkin. Misol uchun, bu erda har bir koeffitsient og'irligi yordamida yaratilgan A belgisi:

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

4-bosqich - kvantlash

Oldingi bosqichda ba'zi koeffitsientlarni chiqarib tashlaganimizdan so'ng, oxirgi bosqichda (transformatsiya) biz kvantlashning maxsus shaklini bajaramiz. Ushbu bosqichda ma'lumotni yo'qotish qabul qilinadi. Yoki oddiyroq qilib aytganda, siqilishga erishish uchun koeffitsientlarni kvantlashtiramiz.

Koeffitsientlar blokini qanday kvantlash mumkin? Eng oddiy usullardan biri bu bir xil kvantlashdir, biz blokni olganda, uni bitta qiymatga (10 ga) bo'linadi va natijani yaxlitlaymiz.

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Ushbu koeffitsientlar blokini o'zgartira olamizmi? Ha, biz bo'lgan qiymatga ko'paytiramiz.

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Ushbu yondashuv eng yaxshi emas, chunki u har bir koeffitsientning ahamiyatini hisobga olmaydi. Bitta qiymat o'rniga kvantizatorlar matritsasidan foydalanish mumkin va bu matritsa pastki o'ngning ko'p qismini va yuqori chapning ozligini kvantlash orqali DCT xususiyatidan foydalanishi mumkin.

5-bosqich - entropiyani kodlash

Ma'lumotlarni (tasvir bloklari, fragmentlar, ramkalar) kvantlashtirganimizdan so'ng, biz uni yo'qotishsiz siqishimiz mumkin. Ma'lumotlarni siqishning ko'plab algoritmik usullari mavjud. Biz ulardan ba'zilarini qisqacha ko'rib chiqamiz, chuqurroq tushunish uchun "Siqishni tushunish: Zamonaviy dasturchilar uchun ma'lumotlarni siqish" kitobini o'qishingiz mumkin ("Siqishni tushunish: Zamonaviy ishlab chiquvchilar uchun ma'lumotlarni siqish').

VLC yordamida video kodlash

Aytaylik, bizda belgilar oqimi bor: a, e, r и t. Har bir belgi oqimda qanchalik tez-tez paydo bo'lishi ehtimoli (0 dan 1 gacha) ushbu jadvalda keltirilgan.

a e r t
Ehtimollik 0,3 0,3 0,2 0,2

Biz noyob ikkilik kodlarni (yaxshisi kichik) eng ehtimoliylarga, kattaroq kodlarni esa kamroq bo'lganlarga belgilashimiz mumkin.

a e r t
Ehtimollik 0,3 0,3 0,2 0,2
Ikkilik kod 0 10 110 1110

Har bir belgi uchun 8 bit sarflaymiz deb hisoblab, oqimni siqib chiqaramiz. Siqishsiz, har bir belgi uchun 24 bit kerak bo'ladi. Har bir belgini uning kodi bilan almashtirsangiz, siz tejab qolasiz!

Birinchi qadam belgini kodlashdir e, bu 10 ga teng, ikkinchi belgi esa a, qo'shilgan (matematik usulda emas): [10][0] va nihoyat uchinchi belgi t, bu bizning oxirgi siqilgan bit oqimini [10][0][1110] yoki ga tenglashtiradi 1001110, bu faqat 7 bitni talab qiladi (asl nusxadan 3,4 marta kamroq joy).

E'tibor bering, har bir kod prefiksli noyob kod bo'lishi kerak. Huffman algoritmi bu raqamlarni topishga yordam beradi. Garchi bu usul kamchiliklarsiz bo'lmasa-da, siqishni uchun ushbu algoritmik usulni taklif qiladigan video kodeklar mavjud.

Koder ham, dekoder ham ikkilik kodlari bilan belgilar jadvaliga kirish huquqiga ega bo'lishi kerak. Shuning uchun, jadvalni kiritish sifatida yuborish ham kerak.

Arifmetik kodlash

Aytaylik, bizda belgilar oqimi bor: a, e, r, s и t, va ularning ehtimoli ushbu jadvalda keltirilgan.

a e r s t
Ehtimollik 0,3 0,3 0,15 0,05 0,2

Ushbu jadvaldan foydalanib, biz eng katta raqam bo'yicha tartiblangan barcha mumkin bo'lgan belgilarni o'z ichiga olgan diapazonlarni yaratamiz.

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Endi uchta belgidan iborat oqimni kodlaylik: yemoq.

Avval birinchi belgini tanlang e, bu 0,3 dan 0,6 gacha bo'lgan pastki diapazonda (shu jumladan emas). Biz ushbu pastki diapazonni olamiz va uni yana avvalgidek bir xil nisbatda ajratamiz, lekin bu yangi diapazon uchun.

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Keling, oqimimizni kodlashni davom ettiraylik yemoq. Endi ikkinchi belgini oling a, bu 0,3 dan 0,39 gacha bo'lgan yangi kichik diapazonda, so'ngra bizning oxirgi belgimizni oling t va yana bir xil jarayonni takrorlab, biz 0,354 dan 0,372 gacha bo'lgan yakuniy pastki diapazonni olamiz.

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Biz faqat oxirgi kichik diapazonda 0,354 dan 0,372 gacha bo'lgan raqamni tanlashimiz kerak. Keling, 0,36 ni tanlaymiz (lekin siz ushbu kichik diapazonda istalgan boshqa raqamni tanlashingiz mumkin). Faqat shu raqam bilan biz asl oqimimizni tiklay olamiz. Biz oqimimizni kodlash uchun diapazonlar ichida chiziq chizayotgandekmiz.

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Teskari operatsiya (ya'ni, dekodlash) xuddi shunday oddiy: 0,36 raqamimiz va dastlabki diapazonimiz bilan biz xuddi shu jarayonni bajarishimiz mumkin. Ammo endi, bu raqamdan foydalanib, biz ushbu raqam yordamida kodlangan oqimni aniqlaymiz.

Birinchi diapazonda bizning raqamimiz tilimga to'g'ri kelishini sezamiz, shuning uchun bu bizning birinchi belgimiz. Endi biz ushbu kichik diapazonni avvalgidek jarayonga rioya qilib, yana ajratamiz. Bu erda siz 0,36 belgiga mos kelishini ko'rishingiz mumkin a, va jarayonni takrorlagandan so'ng biz oxirgi belgiga keldik t (bizning asl kodlangan oqimimizni shakllantirish yemoq).

Koderda ham, dekoderda ham belgilar ehtimoli jadvali bo'lishi kerak, shuning uchun uni kirish ma'lumotlariga ham yuborish kerak.

Juda oqlangan, shunday emasmi? Kim bu yechimni o'ylab topsa, la'nati aqlli edi. Ba'zi video kodeklar ushbu texnikadan foydalanadi (yoki hech bo'lmaganda uni variant sifatida taklif qiladi).

G'oya kvantlangan bit oqimini yo'qotishsiz siqishdir. Albatta, ushbu maqolada tonna tafsilotlar, sabablar, kelishuvlar va boshqalar etishmayapti. Ammo agar siz dasturchi bo'lsangiz, ko'proq bilishingiz kerak. Yangi kodeklar turli entropiya kodlash algoritmlaridan foydalanishga harakat qiladi, masalan ANS.

6-qadam - bit oqimi formati

Bularning barchasini bajargandan so'ng, bajarilgan qadamlar kontekstida siqilgan ramkalarni ochish qoladi. Kodlovchi tomonidan qabul qilingan qarorlar to'g'risida dekoderga aniq ma'lumot berilishi kerak. Dekoder barcha kerakli ma'lumotlar bilan ta'minlanishi kerak: bit chuqurligi, rang maydoni, ruxsat, bashorat qilish ma'lumotlari (harakat vektorlari, yo'nalishli INTER bashorati), profil, daraja, kadr tezligi, kadr turi, ramka raqami va boshqalar.

Biz bit oqimini tezda ko'rib chiqamiz H.264. Bizning birinchi qadamimiz minimal H.264 bit oqimini yaratishdir (FFmpeg sukut bo'yicha barcha kodlash opsiyalarini qo'shadi, masalan SEI NAL - bu nima ekanligini biroz keyin bilib olamiz). Biz buni o'z omborimiz va FFmpeg yordamida amalga oshirishimiz mumkin.

./s/ffmpeg -i /files/i/minimal.png -pix_fmt yuv420p /files/v/minimal_yuv420.h264

Ushbu buyruq xom bit oqimini yaratadi H.264 bitta ramka bilan, 64×64 o'lchamli, rang maydoni bilan YUV420. Bunday holda, quyidagi rasm ramka sifatida ishlatiladi.

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

H.264 bit oqimi

Standart AVC (H.264) ma'lumotlarning makrofreymlarda (tarmoq ma'nosida) yuborilishini aniqlaydi, deyiladi nal (bu tarmoq abstraktsiya darajasi). NAL ning asosiy maqsadi "veb-do'st" video taqdimotini taqdim etishdir. Ushbu standart televizorlarda (oqimga asoslangan), Internetda (paketli) ishlashi kerak.

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

NAL elementlarining chegaralarini aniqlash uchun sinxronizatsiya belgisi mavjud. Har bir sinxronlash belgisi qiymatni o'z ichiga oladi 0x00 0x00 0x01, ga teng bo'lgan birinchisidan tashqari 0x00 0x00 0x00 0x01. Agar biz ishga tushirsak hexdump yaratilgan H.264 bit oqimi uchun fayl boshida kamida uchta NAL naqshini aniqlaymiz.

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Aytganimizdek, dekoder nafaqat tasvir ma'lumotlarini, balki videoning tafsilotlarini, ramkani, ranglarini, ishlatilgan parametrlarni va boshqa ko'p narsalarni bilishi kerak. Har bir NAL ning birinchi bayti uning toifasi va turini belgilaydi.

NAL turi identifikatori tavsifi
0 Noma'lum tur
1 IDRsiz kodlangan rasm fragmenti
2 Kodlangan bo'lak ma'lumotlari bo'limi A
3 Kodlangan bo'lak ma'lumotlari bo'limi B
4 Kodlangan bo'lak ma'lumotlari bo'limi C
5 IDR tasvirining kodlangan IDR fragmenti
6 SEI kengaytmasi haqida ko'proq ma'lumot
7 SPS Sequence Parameter Set
8 PPS tasvir parametrlari to'plami
9 Kirish ajratuvchi
10 Ketma-ketlik oxiri
11 Ip oxiri
... ...

Odatda bit oqimining birinchi NAL qiymati SPS. Ushbu turdagi NAL profil, daraja, ruxsat va boshqalar kabi umumiy kodlash o'zgaruvchilari haqida ma'lumot berish uchun javobgardir.

Agar biz birinchi sinxronlash belgisini o'tkazib yuborsak, qaysi NAL turi birinchi ekanligini bilish uchun birinchi baytni dekodlashimiz mumkin.

Masalan, sinxronlash tokenidan keyingi birinchi bayt 01100111, bu erda birinchi bit (0) f maydonida joylashganorbidden_zero_bit. Keyingi 2 bit (11) bizga maydonni aytib beradi nal_ref_idc, bu NAL mos yozuvlar maydoni yoki yo'qligini ko'rsatadi. Va qolgan 5 bit (00111) bizga maydonni aytib beradi nal_birlik_turi, bu holda bu SPS blokidir (7) NAL.

Ikkinchi bayt (ikkilik=01100100, hex=0x64, Dec=100) SPS da NAL maydon hisoblanadi profile_idc, bu kodlovchi ishlatgan profilni ko'rsatadi. Bunday holda, cheklangan yuqori profil ishlatilgan (ya'ni, ikki tomonlama B-segmentini qo'llab-quvvatlamaydigan yuqori profil).

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Bitstream spetsifikatsiyasiga qarasangiz H.264 SPS NAL uchun biz parametr nomi, toifasi va tavsifi uchun ko'plab qiymatlarni topamiz. Masalan, maydonlarni ko'rib chiqaylik pic_width_in_mbs_minus_1 и Xaritadagi_tasvir_balandligi_minus_1.

Parametr nomi kategoriya tavsifi
pic_width_in_mbs_minus_1 0 ue(v)
Xaritadagi_tasvir_balandligi_minus_1 0 ue(v)

Agar biz ushbu maydonlarning qiymatlari bilan ba'zi matematik operatsiyalarni bajarsak, biz aniqlikni olamiz. Biri yordamida 1920 x 1080 ni ifodalash mumkin pic_width_in_mbs_minus_1 qiymati 119 ((119 + 1) * macroblock_size = 120 * 16 = 1920). Shunga qaramay, joyni tejash uchun 1920 kodlash o'rniga biz buni 119 bilan qildik.

Agar biz yaratilgan videomizni ikkilik shaklda tekshirishni davom ettirsak (masalan: xxd -b -c 11 v/minimal_yuv420.h264), keyin siz oxirgi NAL ga o'tishingiz mumkin, bu ramkaning o'zi.

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Bu erda biz uning birinchi 6 bayt qiymatlarini ko'ramiz: 01100101 10001000 10000100 00000000 00100001 11111111. Birinchi bayt NAL turini ko'rsatishi ma'lum bo'lgani uchun, bu holda (00101) IDR fragmenti (5) boʻlib, keyin uni qoʻshimcha oʻrganishingiz mumkin:

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Spetsifikatsiya ma'lumotlaridan foydalanib, fragment turini dekodlash mumkin bo'ladi (tilim_turi) va ramka raqami (ramka_raqami) boshqa muhim sohalar qatorida.

Ba'zi maydonlarning qiymatlarini olish uchun (ue(v), me(v), se(v) yoki te(v)), ga asoslangan maxsus dekoder yordamida fragmentni dekodlashimiz kerak eksponensial Golomb kodi. Ushbu usul o'zgaruvchan qiymatlarni kodlash uchun juda samarali, ayniqsa ko'p standart qiymatlar mavjud bo'lsa.

Qadriyatlar tilim_turi и ramka_raqami Ushbu videoning 7 tasi (I-fragment) va 0 (birinchi kadr).

Bit oqimini protokol deb hisoblash mumkin. Bitstream haqida ko'proq bilmoqchi bo'lsangiz, spetsifikatsiyaga murojaat qilishingiz kerak ITU H.264. Mana, tasvir ma'lumotlari qayerda ekanligini ko'rsatadigan so'l diagramma (YUV siqilgan shaklda).

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Boshqa bit oqimlarni tekshirish mumkin, masalan VP9, H.265 (HEVC) yoki hatto bizning yangi eng yaxshi bit oqimimiz AV1. Ularning barchasi o'xshashmi? Yo'q, lekin kamida bittasini tushunganingizdan so'ng, qolganlarini tushunish ancha oson bo'ladi.

Mashq qilishni xohlaysizmi? H.264 bit oqimini o'rganing

Bitta kadrli video yaratishingiz va bit oqimini tekshirish uchun MediaInfo-dan foydalanishingiz mumkin H.264. Aslida, bit oqimini tahlil qiladigan manba kodini ko'rishga hech narsa to'sqinlik qilmaydi H.264 (AVC).

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Amaliyot uchun siz Intel Video Pro Analyzer-dan foydalanishingiz mumkin (men allaqachon dastur pullik deb aytdimmi, lekin 10 kvadrat chegarasi bo'lgan bepul sinov versiyasi bormi?).

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

haqida umumiy ma'lumot

E'tibor bering, ko'plab zamonaviy kodeklar biz o'rgangan bir xil modeldan foydalanadi. Keling, video kodekning blok diagrammasini ko'rib chiqaylik Thor. U biz bosib o'tgan barcha bosqichlarni o'z ichiga oladi. Ushbu postning maqsadi hech bo'lmaganda sizga ushbu sohadagi innovatsiyalar va hujjatlarni yaxshiroq tushunishdir.

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Ilgari, 139p sifatli va 720 kadr tezlikda bir soat davom etadigan videofaylni saqlash uchun 30 Gb disk maydoni talab qilinishi hisoblangan. Agar siz ushbu maqolada muhokama qilingan usullardan foydalansangiz (ramkalararo va ichki prognozlar, transformatsiya, kvantlash, entropiyani kodlash va h.k.), unda siz (bir piksel uchun 0,031 bit sarflaganimizdan kelib chiqqan holda) juda ko'p videoga erishishingiz mumkin. qoniqarli sifat, 367,82 GB xotira emas, atigi 139 MB joy egallaydi.

H.265 qanday qilib H.264 dan yaxshiroq siqish nisbatiga erishadi?

Endi biz kodeklar qanday ishlashi haqida ko'proq ma'lumotga ega bo'lganimiz sababli, yangi kodeklar qanday qilib kamroq bit bilan yuqori piksellar sonini taqdim etishini tushunish osonroq bo'ladi.

Agar solishtirsak AVC и HEVC, shuni yodda tutish kerakki, bu deyarli har doim katta protsessor yuki va siqish nisbati o'rtasidagi tanlovdir.

HEVC dan ko'proq bo'lim (va kichik bo'lim) imkoniyatlari mavjud AVC, ko'proq ichki bashorat yo'nalishlari, takomillashtirilgan entropiya kodlash va boshqalar. Bu yaxshilanishlarning barchasi amalga oshirildi H.265 dan 50% ko'proq siqishga qodir H.264.

Video kodek qanday ishlaydi? 2-qism. Nima, nima uchun, qanday

Birinchi qism: Video va tasvirlar bilan ishlash asoslari

Manba: www.habr.com

a Izoh qo'shish