Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Эхний хэсэг: Видео болон зурагтай ажиллах үндэс

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Юу вэ? Видео кодлогч нь дижитал видеог шахдаг ба/эсвэл задалдаг програм хангамж/техник хангамж юм.

Юунаас болж? Хэдийгээр зурвасын өргөн болон аль алинд нь тодорхой хязгаарлалтууд байдаг
мэдээлэл хадгалах зайны хувьд зах зээл улам өндөр чанартай видеог шаардаж байна. Сүүлийн нийтлэлд бид 30x24 нягтралтай секундэд 480 фрэйм, пиксел тутамд 240 бит шаардагдах хамгийн бага хэмжээг хэрхэн тооцож байсныг та санаж байна уу? Бид шахалтгүйгээр 82,944 Мбит/с хүлээн авсан. Шахалт нь одоогоор HD/FullHD/4K-ийг телевизийн дэлгэц болон интернет рүү ерөнхийд нь дамжуулах цорын ганц арга зам юм. Үүнд хэрхэн хүрсэн бэ? Одоо үндсэн аргуудыг товчхон авч үзье.

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Орчуулга нь EDISON програм хангамжийн дэмжлэгтэйгээр хийгдсэн.

Бид сүй тавьсан видео тандалтын системийг нэгтгэхТэгээд Бид микротомограф боловсруулж байна.

Codec-ийн эсрэг Контейнер

Шинэхэн хүмүүсийн гаргадаг нийтлэг алдаа бол дижитал видео кодлогч болон дижитал видео контейнерийг төөрөлдүүлэх явдал юм. Контейнер бол тодорхой формат юм. Видео (болон магадгүй аудио) мета өгөгдөл агуулсан боодол. Шахсан видеог чингэлэгийн ачаалал гэж ойлгож болно.

Дүрмээр бол видео файлын өргөтгөл нь түүний агуулахын төрлийг илэрхийлдэг. Жишээлбэл, video.mp4 файл нь контейнер байх магадлалтай MPEG-4 Хэсэг 14, мөн video.mkv нэртэй файл байх магадлалтай матрешка. Кодек болон контейнерийн форматыг бүрэн итгэлтэй байлгахын тулд та ашиглаж болно FFmpeg буюу MediaInfo.

Түүх бага

Биднийг хүрэхээс өмнө Яаж?, зарим хуучин кодлогчийг арай илүү ойлгохын тулд түүхэнд бага зэрэг орцгооё.

Видео кодлогч H.261 1990 онд (техникийн хувьд - 1988 онд) гарч ирсэн бөгөөд 64 Kbps өгөгдөл дамжуулах хурдтай ажиллахаар бүтээгдсэн. Энэ нь өнгөний дэд дээж, макроблок гэх мэт санаануудыг аль хэдийн ашигласан. Видео кодлогчийн стандарт нь 1995 онд хэвлэгдсэн H.263, 2001 он хүртэл хөгжсөн.

Эхний хувилбар нь 2003 онд дууссан H.264 / AVC. Тэр жилдээ TrueMotion үнэгүй алдагдалтай видео кодлогчоо гаргасан VP3. Google компанийг 2008 онд худалдан авч, гаргасан VP8 тэр жил. 2012 оны арванхоёрдугаар сард Google гаргасан VP9, мөн энэ нь хөтчийн зах зээлийн ¾ орчимд (мобайл төхөөрөмжүүдийг оруулаад) дэмжигддэг.

AV1 -ийн боловсруулсан шинэ үнэгүй, нээлттэй эхийн видео кодлогч юм Нээлттэй хэвлэл мэдээллийн холбоо (AOMedia), Google, Mozilla, Microsoft, Amazon, Netflix, AMD, ARM, NVidia, Intel, Cisco зэрэг хамгийн алдартай компаниудыг багтаасан болно. Кодекийн анхны хувилбар болох 0.1.0 нь 7 оны 2016-р сарын XNUMX-нд хэвлэгдсэн.

AV1 төрөлт

2015 оны эхээр Google дээр ажиллаж байсан VP10Xiph (Mozilla-ийн эзэмшдэг) дээр ажиллаж байсан Даалаа, мөн Cisco өөрийн үнэгүй видео кодлогчийг бүтээжээ Thor.

дараа нь MPEG LA жилийн хязгаарыг анх зарласан HEVC (H.265) болон хураамж нь H.8-ээс 264 дахин их байсан боловч удалгүй тэд дүрмийг дахин өөрчилсөн:

жилийн хязгаарлалт байхгүй,
агуулгын хураамж (орлогын 0,5%) ба
нэгжийн төлбөр нь H.10-ээс 264 дахин их байна.

Нээлттэй хэвлэл мэдээллийн холбоо янз бүрийн салбарын компаниуд бий болгосон: тоног төхөөрөмж үйлдвэрлэгчид (Intel, AMD, ARM, Nvidia, Cisco), контент нийлүүлэгчид (Google, Netflix, Amazon), хөтөч бүтээгчид (Google, Mozilla) болон бусад.

Компаниуд нийтлэг зорилготой байсан - роялтигүй видео кодлогч. Дараа нь гарч ирнэ AV1 илүү хялбар патентын лицензтэй. Тимоти Б.Терриберри гайхалтай илтгэл тавьсан нь одоогийн AV1 концепци болон түүний лицензийн загварын гарал үүсэл болсон.

Та AV1 кодлогчийг хөтчөөр дамжуулан шинжлэх боломжтой гэдгээ мэдээд гайхах болно (сонирхогчид эндээс орж болно aomanalyzer.org).

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Бүх нийтийн кодлогч

Бүх нийтийн видео кодлогчийн үндсэн механизмуудыг авч үзье. Эдгээр ойлголтуудын ихэнх нь ашигтай бөгөөд орчин үеийн кодлогч, жишээлбэл VP9, AV1 и HEVC. Тайлбарласан олон зүйлийг хялбаршуулах болно гэдгийг анхааруулж байна. Заримдаа технологийг харуулахын тулд бодит ертөнцийн жишээг (H.264-тэй адил) ашиглах болно.

1-р алхам - зургийг хуваах

Эхний алхам бол хүрээг хэд хэдэн хэсэг, дэд хэсэг болон цааш нь хуваах явдал юм.

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Юуны төлөө? Олон шалтгаан бий. Бид зургийг хуваахдаа жижиг хөдөлгөөнт хэсгүүдэд жижиг хэсгүүдийг ашиглан хөдөлгөөний векторыг илүү нарийвчлалтай таамаглах боломжтой. Статик дэвсгэрийн хувьд та илүү том хэсгүүдэд өөрийгөө хязгаарлаж болно.

Codec нь ихэвчлэн эдгээр хэсгүүдийг хэсэг (эсвэл хэсгүүд), макроблокууд (эсвэл кодлогч модны блокууд) болон олон дэд хэсгүүдээр зохион байгуулдаг. Эдгээр хуваалтын хамгийн дээд хэмжээ нь харилцан адилгүй, HEVC үүнийг 64x64 болгон тохируулдаг бол AVC нь 16x16-г ашигладаг бөгөөд дэд хуваалтуудыг 4x4 хүртэл хувааж болно.

Та сүүлийн нийтлэлээс ямар төрлийн фрэйм ​​байсныг санаж байна уу?! Үүнтэй ижил зүйлийг блокуудад хэрэглэж болох тул бид I-фрагмент, B-блок, P-макроблок гэх мэт байж болно.

Дадлага хийх хүсэлтэй хүмүүст зориулж зураг хэрхэн хэсэг, дэд хэсгүүдэд хуваагдаж байгааг хараарай. Үүнийг хийхийн тулд та өмнөх нийтлэлд дурдсаныг ашиглаж болно. Intel Video Pro анализатор (төлбөртэй, гэхдээ эхний 10 фреймээр хязгаарлагдах үнэгүй туршилтын хувилбартай). Энд дүн шинжилгээ хийсэн хэсгүүд VP9:

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

2-р алхам - урьдчилан таамаглах

Хэсэгтэй болмогц бид тэдгээрт зориулж зурхайн таамаглал гаргаж чадна. Учир нь INTER урьдчилсан мэдээ шилжүүлэх ёстой хөдөлгөөний векторууд ба үлдэгдэл, мөн INTRA таамаглалын хувьд үүнийг дамжуулдаг урьдчилсан чиглэл болон үлдсэн.

3-р алхам - өөрчлөлт

Бид үлдэгдэл блоктой болмогц (урьдчилан таамагласан хэсэг → бодит хэсэг) ерөнхий чанарыг хадгалахын зэрэгцээ аль пикселийг хаяж болохыг мэдэхээр үүнийг хувиргах боломжтой. Яг зан төлөвийг өгдөг зарим өөрчлөлтүүд байдаг.

Хэдийгээр өөр аргууд байдаг ч тэдгээрийг илүү нарийвчлан авч үзье. дискрет косинусын хувиргалт (DCT - аас дискрет косинусын хувиргалт). DCT-ийн үндсэн чиг үүрэг:

  • Пикселийн блокуудыг давтамжийн коэффициентийн ижил хэмжээтэй блок болгон хувиргадаг.
  • Орон зайн илүүдлийг арилгахад туслах хүчийг нягтруулна.
  • Буцаах боломжийг олгодог.

2 оны 2017-р сарын 14 Синтра Р.Ж. (Cintra, RJ) болон Bayer F.M. (Bayer FM) зөвхөн XNUMX нэмэлт оруулах шаардлагатай дүрсийг шахах DCT шиг хувиргах тухай нийтлэл нийтэлжээ.

Хэрэв та зүйл бүрийн ашиг тусыг ойлгохгүй байвал санаа зовох хэрэггүй. Одоо тэдний бодит үнэ цэнийг харахын тулд тодорхой жишээнүүдийг ашиглацгаая.

Энэ 8x8 пикселийн блокыг авч үзье:

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Энэ блокыг дараах 8-аас 8 пикселийн хэмжээтэй зураг болгон үзүүлэв.

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Энэ блокийн пикселд DCT хэрэглэж, 8х8 блок коэффициентийг аваарай:

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Хэрэв бид энэ блокийн коэффициентийг үзүүлбэл дараах зургийг авах болно.

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Таны харж байгаагаар энэ нь анхны зураг шиг харагдахгүй байна. Эхний коэффициент нь бусад бүхнээс эрс ялгаатай болохыг та харж байна. Энэ эхний коэффициентийг тогтмол гүйдлийн коэффициент гэж нэрлэдэг бөгөөд энэ нь оролтын массив дахь бүх дээжийг илэрхийлдэг, дундаж гэх мэт.

Энэхүү коэффициентийн блок нь сонирхолтой шинж чанартай байдаг: энэ нь өндөр давтамжийн бүрэлдэхүүн хэсгүүдийг бага давтамжтай хэсгүүдээс тусгаарладаг.

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Зурган дээр эрчим хүчний ихэнх хэсэг нь бага давтамжид төвлөрдөг тул хэрэв та зургийг давтамжийн бүрэлдэхүүн хэсэг болгон хувиргаж, илүү өндөр давтамжийн коэффициентийг хасвал зургийн чанарыг хэт их хэмжээгээр алдалгүйгээр дүрсийг тайлбарлахад шаардагдах өгөгдлийн хэмжээг багасгаж чадна.

Давтамж нь дохио хэр хурдан өөрчлөгдөж байгааг илэрхийлдэг.

Туршилтын жишээн дээр олж авсан мэдлэгээ DCT ашиглан эх зургийг давтамж руу (коэффициентийн блок) хөрвүүлж, хамгийн бага ач холбогдолтой коэффициентүүдийн нэг хэсгийг хаях замаар хэрэгжүүлэхийг хичээцгээе.

Эхлээд бид үүнийг давтамжийн домэйнд хөрвүүлдэг.

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Дараа нь бид коэффициентүүдийн нэг хэсгийг (67%), голчлон баруун доод хэсгийг хасдаг.

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Эцэст нь бид энэ хаягдсан коэффициентийн блокоос зургийг дахин бүтээж (энэ нь урвуу байх ёстой гэдгийг санаарай) анхныхтай нь харьцуулна.

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Бидний харж байгаагаар энэ нь анхны дүр төрхтэй төстэй боловч анхны дүр төрхөөс маш их ялгаатай байдаг. Бид 67,1875% -ийг хаяж, анхныхтай төстэй зүйлийг олж авсаар байна. Илүү сайн чанарын дүр төрхийг олж авахын тулд коэффицентийг илүү болгоомжтойгоор хаях боломжтой байсан ч энэ бол дараагийн сэдэв юм.

Коэффицент бүрийг бүх пиксел ашиглан үүсгэнэ

Анхаарах зүйл: коэффициент бүрийг нэг пикселээр шууд буулгадаггүй, харин бүх пикселийн жигнэсэн нийлбэр юм. Энэхүү гайхалтай график нь индекс бүрийн өвөрмөц жинг ашиглан эхний болон хоёр дахь коэффициентийг хэрхэн тооцдог болохыг харуулж байна.

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Та мөн DCT-г түүн дээр үндэслэсэн энгийн дүрслэлийг хараад төсөөлөхийг оролдож болно. Жишээлбэл, жин тус бүрийн коэффициентийг ашиглан үүсгэсэн тэмдэгт А байна:

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

4-р алхам - квантчлал

Өмнөх алхам дээр зарим коэффициентийг хассаны дараа сүүлчийн шатанд (хувиргах) бид квантжуулалтын тусгай хэлбэрийг гүйцэтгэдэг. Энэ үе шатанд мэдээлэл алдах нь хүлээн зөвшөөрөгддөг. Эсвэл илүү энгийнээр хэлбэл, бид шахалтад хүрэхийн тулд коэффициентүүдийг тоон үзүүлэлтээр тодорхойлно.

Коэффициентийн блокыг хэрхэн тоолох вэ? Хамгийн энгийн аргуудын нэг бол нэг блок авахдаа нэг утгад (10-аар) хувааж, үр дүнг дугуйруулна.

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Бид энэ блок коэффициентийг эргүүлж чадах уу? Тийм ээ, бид хуваасан утгаараа үржүүлж чадна.

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Энэ арга нь коэффициент бүрийн ач холбогдлыг харгалздаггүй тул хамгийн сайн арга биш юм. Нэг утгын оронд квантчлагчийн матрицыг ашиглаж болох ба энэ матриц нь баруун доод хэсгийн дийлэнх, зүүн дээд хэсгийн цөөнхийг квантчлах замаар DCT шинж чанарыг ашиглаж болно.

Алхам 5 - энтропийн кодчилол

Бид өгөгдлийг (зургийн блок, фрагмент, фрейм) хэмжсэний дараа бид үүнийг алдагдалгүй шахах боломжтой хэвээр байна. Өгөгдлийг шахах олон алгоритмын арга байдаг. Бид тэдгээрийн заримыг нь хурдан авч үзэх болно, илүү гүнзгий ойлгохын тулд "Шахалтын тухай ойлголт: Орчин үеийн хөгжүүлэгчдэд зориулсан өгөгдөл шахах" номыг уншиж болно ("Шахалтын тухай ойлголт: Орчин үеийн хөгжүүлэгчдэд зориулсан өгөгдөл шахалт").

VLC ашиглан видео кодчилол

Бидэнд дүрүүдийн урсгал байна гэж бодъё: a, e, r и t. Тэмдэгт бүр урсгалд хэр олон удаа гарч ирэх магадлалыг (0-ээс 1 хүртэл) энэ хүснэгтэд үзүүлэв.

a e r t
Магадлал 0,3 0,3 0,2 0,2

Бид өвөрмөц хоёртын кодыг (жижиг кодыг илүү сайн) хамгийн их магадлалтайд, том кодыг бага магадлалтайд оноож болно.

a e r t
Магадлал 0,3 0,3 0,2 0,2
Хоёртын код 0 10 110 1110

Бид тэмдэгт бүрт 8 бит зарцуулна гэж үзээд урсгалыг шахаж байна. Шахалтгүй бол тэмдэгт бүрт 24 бит шаардлагатай болно. Хэрэв та тэмдэгт бүрийг кодоор нь солих юм бол хэмнэлттэй болно!

Эхний алхам бол дүрийг кодлох явдал юм e, энэ нь 10-тай тэнцүү бөгөөд хоёр дахь тэмдэгт нь байна a, нэмсэн (математик аргаар биш): [10][0], эцэст нь гурав дахь тэмдэгт t, энэ нь бидний эцсийн шахсан бит урсгалыг [10][0][1110] буюу тэнцүү болгодог 1001110, энэ нь ердөө 7 бит (эхнийхээс 3,4 дахин бага зай) шаарддаг.

Код бүр угтвартай өвөрмөц код байх ёстойг анхаарна уу. Хаффманы алгоритм Эдгээр тоонуудыг олоход тань туслах болно. Хэдийгээр энэ арга нь алдаа дутагдалтай биш боловч шахалтын алгоритмын энэ аргыг санал болгодог видео кодлогчууд байдаг.

Кодлогч болон декодер хоёулаа хоёртын код бүхий тэмдгийн хүснэгтэд хандах эрхтэй байх ёстой. Тиймээс хүснэгтийг оролт болгон илгээх шаардлагатай.

Арифметик кодчилол

Бидэнд дүрүүдийн урсгал байна гэж бодъё: a, e, r, s и t, тэдгээрийн магадлалыг энэ хүснэгтэд үзүүлэв.

a e r s t
Магадлал 0,3 0,3 0,15 0,05 0,2

Энэ хүснэгтийг ашиглан бид хамгийн олон тоогоор эрэмбэлсэн бүх боломжит тэмдэгтүүдийг агуулсан мужуудыг байгуулах болно.

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Одоо гурван тэмдэгтийн урсгалыг кодчилъё: Ид.

Эхлээд эхний тэмдэгтийг сонгоно уу e, энэ нь 0,3-аас 0,6 хүртэлх дэд мужид (үүнийг оруулаагүй). Бид энэ дэд мужийг аваад өмнөхтэй ижил хувь хэмжээгээр дахин хуваана, гэхдээ энэ шинэ мужид.

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Цацалтаа үргэлжлүүлэн кодлоцгооё Ид. Одоо хоёр дахь дүрийг ав a, энэ нь 0,3-аас 0,39 хүртэлх шинэ дэд мужид байгаа бөгөөд дараа нь бидний сүүлчийн тэмдэгтийг авна t мөн ижил үйлдлийг дахин давтан хийснээр бид 0,354-0,372 хүртэлх эцсийн дэд мужийг авна.

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Бид 0,354-0,372 хүртэлх хамгийн сүүлийн дэд муж дахь тоог сонгох хэрэгтэй. 0,36-г сонгоё (гэхдээ та энэ дэд мужаас өөр ямар ч тоог сонгож болно). Зөвхөн энэ дугаараар бид анхны дамжуулалтыг сэргээх боломжтой болно. Бид урсгалаа кодлохын тулд мужуудын дотор шугам зурж байгаа юм шиг байна.

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Урвуу үйлдэл (өөрөөр хэлбэл, код тайлах) нь маш энгийн: 0,36 тоо болон анхны мужаа ашиглан бид ижил процессыг ажиллуулж чадна. Харин одоо энэ дугаарыг ашиглан бид энэ дугаарыг ашиглан кодлогдсон урсгалыг тодорхойлно.

Эхний мужид бидний тоо зүсмэлтэй тохирч байгааг бид анзаарч байгаа тул энэ нь бидний анхны тэмдэгт юм. Одоо бид өмнөхтэй ижил процессыг дагаж энэ дэд мужийг дахин хуваана. Эндээс та 0,36 тэмдэгттэй тохирч байгааг харж болно a, мөн үйл явцыг давтан хийсний дараа бид сүүлчийн дүрд хүрэв t (бидний анхны кодлогдсон урсгалыг үүсгэж байна Ид).

Кодер болон декодер хоёулаа тэмдэгтийн магадлалын хүснэгттэй байх ёстой тул үүнийг оролтын өгөгдөлд мөн илгээх шаардлагатай.

Их дэгжин, тийм үү? Энэ шийдлийг гаргасан хэн ч байсан ухаантай байсан. Зарим видео кодлогч энэ техникийг ашигладаг (эсвэл ядаж үүнийг сонголт болгон санал болгодог).

Санаа нь квантлагдсан битийн урсгалыг алдагдалгүй шахах явдал юм. Энэ нийтлэлд маш олон нарийн ширийн зүйл, шалтгаан, солилцоо гэх мэт дутуу байгаа нь лавтай. Гэхдээ хэрэв та хөгжүүлэгч бол илүү ихийг мэдэх ёстой. Шинэ кодлогч нь энтропи кодлох өөр өөр алгоритмуудыг ашиглахыг оролддог ANS.

Алхам 6 - бит урсгалын формат

Энэ бүгдийг хийсний дараа гүйцэтгэсэн алхмуудын хүрээнд шахсан фрэймүүдийг задлахад л үлддэг. Кодлогчийн гаргасан шийдвэрийн талаар декодлогч нь тодорхой мэдээлсэн байх ёстой. Декодер нь шаардлагатай бүх мэдээллээр хангагдсан байх ёстой: битийн гүн, өнгөний орон зай, нарийвчлал, урьдчилан таамаглах мэдээлэл (хөдөлгөөний векторууд, чиглэлтэй INTER таамаглал), профайл, түвшин, фрэймийн хурд, фрэймийн төрөл, фрэймийн дугаар гэх мэт.

Бид бит урсгалыг хурдан харах болно H.264. Бидний эхний алхам бол хамгийн бага H.264 бит урсгалыг үүсгэх явдал юм (FFmpeg нь анхдагч байдлаар кодчиллын бүх сонголтыг нэмдэг. SEI NAL - энэ нь юу болохыг бид бага зэрэг олж мэдэх болно). Бид үүнийг өөрийн репозитор болон FFmpeg ашиглан хийж болно.

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

Энэ тушаал нь түүхий бит урсгал үүсгэх болно H.264 нэг хүрээтэй, 64×64 нягтралтай, өнгөний орон зайтай YUV420. Энэ тохиолдолд дараах зургийг хүрээ болгон ашиглана.

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

H.264 бит урсгал

Стандарт AVC (H.264) гэж нэрлэгддэг макрофрэймд (сүлжээний утгаараа) мэдээлэл илгээгдэхийг тодорхойлдог НАЛ (энэ нь сүлжээний хийсвэрлэлийн түвшин юм). NAL-ийн гол зорилго нь "вэбд ээлтэй" видео танилцуулга үзүүлэх явдал юм. Энэ стандарт нь телевизор (стрим дээр суурилсан), интернет (пакет дээр суурилсан) дээр ажиллах ёстой.

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

NAL элементүүдийн хил хязгаарыг тодорхойлох синхрончлолын тэмдэглэгээ байдаг. Синхрончлолын токен бүр утгыг агуулна 0x00 0x00 0x01, эхнийхээс бусад нь тэнцүү байна 0x00 0x00 0x00 0x01. Хэрэв бид хөөргөх юм бол hexdump үүсгэсэн H.264 бит урсгалын хувьд бид файлын эхэнд дор хаяж гурван NAL хэв маягийг тодорхойлдог.

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Өмнө дурьдсанчлан, декодлогч нь зөвхөн зургийн өгөгдөл төдийгүй видеоны дэлгэрэнгүй мэдээлэл, хүрээ, өнгө, ашигласан параметрүүд болон бусад олон зүйлийг мэддэг байх ёстой. NAL бүрийн эхний байт нь түүний ангилал, төрлийг тодорхойлдог.

NAL төрлийн танигч Тайлбар
0 Тодорхойгүй төрөл
1 IDRгүй кодлогдсон зургийн фрагмент
2 Кодлогдсон зүсмэлийн өгөгдлийн хэсэг A
3 Кодлогдсон зүсмэлийн өгөгдлийн хэсэг B
4 Кодлогдсон зүсмэлийн өгөгдлийн хэсэг C
5 IDR зургийн кодлогдсон IDR фрагмент
6 SEI өргөтгөлийн талаарх дэлгэрэнгүй мэдээлэл
7 SPS дарааллын параметрийн багц
8 PPS зургийн параметрүүдийн багц
9 Хандалтын тусгаарлагч
10 Дарааллын төгсгөл
11 Утасны төгсгөл
... ...

Ерөнхийдөө бит урсгалын эхний NAL нь байдаг SPS. Энэ төрлийн NAL нь профайл, түвшин, нягтрал гэх мэт нийтлэг кодчиллын хувьсагчийн талаар мэдээлэл өгөх үүрэгтэй.

Хэрэв бид эхний синхрончлолын тэмдэглэгээг алгасах юм бол эхний байтыг тайлж аль NAL төрлийг хамгийн түрүүнд олж мэдэх боломжтой.

Жишээлбэл, синхрончлолын тэмдгийн дараах эхний байт нь 01100111, хаана эхний бит (0) f талбарт байнаорbidden_тэг_бит. Дараагийн 2 бит (11) талбарыг бидэнд хэлдэг nal_ref_idc, Энэ нь NAL нь лавлагааны талбар мөн эсэхийг харуулдаг. Мөн үлдсэн 5 бит (00111) талбарыг бидэнд хэлдэг нэгжийн_төрөл, Энэ тохиолдолд энэ нь SPS блок (7) NAL.

Хоёр дахь байт (хоёртын файл=01100100, Hex=0x64, Dec=100) SPS дахь NAL талбар юм profile_idc, Энэ нь кодлогчийн ашигласан профайлыг харуулдаг. Энэ тохиолдолд хязгаарлагдмал өндөр профайлыг ашигласан (өөрөөр хэлбэл, хоёр чиглэлтэй B сегментийн дэмжлэггүй өндөр профайл).

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Хэрэв та бит урсгалын тодорхойлолтыг харвал H.264 SPS NAL-ийн хувьд бид параметрийн нэр, ангилал, тайлбарын олон утгыг олох болно. Жишээлбэл, талбаруудыг харцгаая зургийн_өргөн_мбс_хасах_1 и Газрын зургийн_өндөр_нэгжийг_хасах_1.

Параметрийн нэр зэрэг Тайлбар
зургийн_өргөн_мбс_хасах_1 0 ue(v)
Газрын зургийн_өндөр_нэгжийг_хасах_1 0 ue(v)

Хэрэв бид эдгээр талбаруудын утгуудаар зарим математикийн үйлдлүүдийг хийвэл нарийвчлалыг олж авах болно. Үүнийг ашиглан 1920 x 1080-ийг төлөөлж болно зургийн_өргөн_мбс_хасах_1 119 утгатай ((119 + 1) * макроблокийн хэмжээ = 120 * 16 = 1920). Дахин хэлэхэд зай хэмнэхийн тулд бид 1920-ийг кодлохын оронд 119-ээр хийсэн.

Хэрэв бид хоёртын хэлбэрээр үүсгэсэн видеогоо үргэлжлүүлэн шалгавал (жишээлбэл: xxd -b -c 11 v/minimal_yuv420.h264), дараа нь та хамгийн сүүлчийн NAL руу очиж болно, энэ нь хүрээ өөрөө юм.

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Энд бид түүний эхний 6 байт утгыг харж байна: 01100101 10001000 10000100 00000000 00100001 11111111. Эхний байт нь NAL төрлийг заадаг нь мэдэгдэж байгаа тул энэ тохиолдолд (00101) нь IDR фрагмент (5) бөгөөд та үүнийг цаашид судлах боломжтой:

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Тодорхойлолтын мэдээллийг ашиглан фрагментийн төрлийг тайлах боломжтой болно (зүсмэлийн төрөл) болон хүрээний дугаар (хүрээний_тоо) бусад чухал салбаруудын дунд.

Зарим талбарын утгыг авахын тулд (ue(v), me(v), se(v) эсвэл te(v)), бид дээр суурилсан тусгай декодер ашиглан фрагментийг тайлах хэрэгтэй экспоненциал Голомб код. Энэ арга нь хувьсагчийн утгыг кодлоход маш үр дүнтэй байдаг, ялангуяа олон тооны анхдагч утгууд байдаг.

Утга нь зүсмэлийн төрөл и хүрээний_тоо Энэ видеоны 7 (I-фрагмент) ба 0 (эхний фрейм) байна.

Бит урсгалыг протокол гэж үзэж болно. Хэрэв та битийн урсгалын талаар илүү ихийг мэдэхийг хүсч байвал техникийн тодорхойлолтыг үзэх хэрэгтэй ITU H.264. Зургийн өгөгдөл хаана байгааг харуулсан макро диаграмм энд байна (YUV шахсан хэлбэрээр).

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

зэрэг бусад бит урсгалуудыг шалгаж болно VP9, H.265 (HEVC) эсвэл бүр бидний шинэ шилдэг бит урсгал AV1. Тэд бүгд адилхан уу? Үгүй ээ, гэхдээ та ядаж нэгийг нь ойлговол бусад зүйлийг ойлгоход илүү хялбар болно.

Дасгал хийхийг хүсч байна уу? H.264 бит урсгалыг судлаарай

Та нэг фрэймийн видео үүсгэж, бит урсгалыг шалгахын тулд MediaInfo-г ашиглаж болно H.264. Үнэн хэрэгтээ битийн урсгалд дүн шинжилгээ хийдэг эх кодыг үзэхэд юу ч саад болохгүй H.264 (AVC).

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Дадлага хийхийн тулд та Intel Video Pro Analyzer ашиглаж болно (хөтөлбөрийг төлбөртэй гэж би хэлсэн үү, гэхдээ 10 фрэймийн хязгаартай үнэгүй туршилтын хувилбар байгаа юу?).

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

тойм

Орчин үеийн олон кодлогч бидний саяхан судалсан ижил загварыг ашигладаг болохыг анхаарна уу. Энд видео кодлогчийн блок диаграммыг харцгаая Thor. Энэ нь бидний туулсан бүх алхмуудыг агуулдаг. Энэ нийтлэлийн гол санаа нь танд энэ чиглэлийн шинэлэг зүйл, баримт бичгийн талаар илүү сайн ойлголт өгөх явдал юм.

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Өмнө нь 139p чанар, 720 fps хурдтай нэг цаг үргэлжлэх видео файлыг хадгалахад 30 ГБ дискний зай шаардлагатай гэж тооцоолж байсан. Хэрэв та энэ өгүүлэлд дурдсан аргуудыг (хүрээ хоорондын болон дотоод таамаглал, хувиргалт, квантжуулалт, энтропи кодчилол гэх мэт) ашиглавал (бид нэг пиксел тутамд 0,031 бит зарцуулдаг гэх мэт) видеог олж авах боломжтой. хангалттай чанар, 367,82 ГБ санах ой биш ердөө 139 МБ багтаамжтай.

H.265 нь H.264-ээс илүү шахалтын харьцааг хэрхэн олж авдаг вэ?

Одоо бид кодлогч хэрхэн ажилладаг талаар илүү ихийг мэддэг болсон тул шинэ кодлогчууд хэрхэн цөөн битээр илүү өндөр нарийвчлалтай болохыг ойлгоход хялбар болсон.

Хэрэв бид харьцуулбал AVC и HEVC, энэ нь бараг үргэлж CPU-ийн ачаалал болон шахалтын харьцааны хоорондох сонголт гэдгийг санах нь зүйтэй.

HEVC -ээс олон хэсэг (болон дэд хэсэг) сонголттой AVC, илүү дотоод урьдчилан таамаглах чиглэл, сайжруулсан энтропи кодчилол гэх мэт. Эдгээр бүх сайжруулалт хийгдсэн H.265 -аас 50%-иар илүү шахах чадвартай H.264.

Видео кодлогч хэрхэн ажилладаг вэ? 2-р хэсэг. Юу, яагаад, яаж

Эхний хэсэг: Видео болон зурагтай ажиллах үндэс

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх