Как работи видео кодек? Част 1: Основи

Втората част: Как работи видео кодекът

Всеки растер изображение могат да бъдат представени във формата двумерна матрица. Що се отнася до цветовете, идеята може да се развие, като се погледне изображение като триизмерна матрица, в който се използват допълнителни измерения за съхраняване на данни за всеки от цветовете.

Ако разглеждаме крайния цвят като комбинация от т.нар. основни цветове (червено, зелено и синьо), в нашата триизмерна матрица ние дефинираме три равнини: първата за червено, втората за зелено и последната за синьо.
Как работи видео кодек? Част 1: Основи
Всяка точка в тази матрица ще наричаме пиксел (елемент на изображението). Всеки пиксел съдържа информация за интензитета (обикновено като числова стойност) на всеки цвят. Например, червен пиксел означава, че съдържа 0 зелено, 0 синьо и максимум червено. Розов пиксел може да се формира чрез комбинация от три цвята. Като се използва числов диапазон от 0 до 255, розовият пиксел се дефинира като Червено = 255, Зелено = 192 и Синьо = 203.

Как работи видео кодек? Част 1: Основи

Тази статия е публикувана с подкрепата на EDISON.

Ние се развиваме приложения за видеонаблюдение, видео стрийминг, а също така сме сгодени видеозапис в операционната зала.

Алтернативни начини за кодиране на цветно изображение

Има много други модели за представяне на цветовете, които изграждат едно изображение. Например, можете да използвате индексирана палитра, която изисква само един байт за представяне на всеки пиксел, вместо трите, необходими при използване на RGB модела. В такъв модел е възможно да се използва 2D матрица вместо 3D матрица за представяне на всеки цвят. Това спестява памет, но дава по-малка цветова гама.

Как работи видео кодек? Част 1: Основи

RGB

Например, погледнете тази снимка по-долу. Първото лице е изцяло боядисано. Другите са червените, зелените и сините равнини (интензитетите на съответните цветове са показани в сива скала).

Как работи видео кодек? Част 1: Основи

Виждаме, че нюансите на червеното в оригинала ще бъдат на същите места, където се наблюдават най-ярките части на второто лице. Докато приносът на синьото може да се види главно само в очите на Марио (последното лице) и елементите на облеклото му. Забележете къде и трите цветни равнини допринасят най-малко (най-тъмните части на изображенията) - мустаците на Марио.

За съхраняване на интензитета на всеки цвят е необходим определен брой битове - това количество се нарича битова дълбочина. Да кажем, че се изразходват 8 бита (на базата на стойност от 0 до 255) за цветна равнина. Тогава имаме дълбочина на цвета от 24 бита (8 бита * 3 R/G/B равнини).

Друго свойство на изображението е разрешително, което е броят на пикселите в едно измерение. Често се обозначава като ширина × височина, както в примерното изображение 4 на 4 по-долу.
Как работи видео кодек? Част 1: Основи

Друго свойство, с което се занимаваме, когато работим с изображения/видео, е съотношение, описваща нормалната пропорционална връзка между ширината и височината на изображение или пиксел.

Когато казват, че даден филм или картина е с размери 16 на 9, обикновено имат предвид пропорция на дисплея (НО - от Показване на съотношението). Понякога обаче може да има различни форми на отделните пиксели – в случая говорим за пикселно съотношение (PAR - от Съотношение на пикселите).

Как работи видео кодек? Част 1: Основи

Как работи видео кодек? Част 1: Основи

Бележка към домакинята: DVD соответствует DAR 4 до 3

Въпреки че действителната разделителна способност на DVD е 704x480, тя все още поддържа съотношение 4:3, тъй като PAR е 10:11 (704x10 / 480x11).

И накрая, можем да определим видео като последователност от n рамки за периода път, което може да се счита за допълнително измерение. А n след това е кадровата честота или броят кадри в секунда (FPS - от Кадри в секунда).

Как работи видео кодек? Част 1: Основи

Броят битове в секунда, необходими за показване на видео, е неговият скорост на предаване - битрейт.

битрейт = ширина * височина * битова дълбочина * кадри в секунда

Например 30 кадъра в секунда, 24 bps, 480x240 видео ще изисква 82,944,000 82,944 30 bps или 480 240 Mbps (24xXNUMXxXNUMXxXNUMX) - но това е, ако не се използва метод за компресия.

Ако скоростта на трансфер почти постоянен, тогава се нарича постоянна скорост на предаване (CBR - от постоянен битрейт). Но може и да варира, в този случай се нарича променлива скорост на предаване (VBR - от променлива скорост на предаване).

Тази графика показва ограничен VBR, където не се губят твърде много битове в случай на напълно тъмен кадър.

Как работи видео кодек? Част 1: Основи

Първоначално инженерите разработиха метод за удвояване на възприеманата скорост на кадрите на видео дисплей, без да използват допълнителна честотна лента. Този метод е известен като преплетено видео; По принцип той изпраща половината екран в първия „кадър“, а другата половина в следващия „кадър“.

В момента сцените се изобразяват предимно с помощта на прогресивни технологии за сканиране. Това е метод за показване, съхраняване или предаване на движещи се изображения, при който всички линии на всеки кадър се рисуват последователно.

Как работи видео кодек? Част 1: Основи

Добре! Сега сме наясно как едно изображение се представя цифрово, как са подредени цветовете му, колко бита в секунда изразходваме, за да покажем видео, дали битрейтът е постоянен (CBR) или променлив (VBR). Знаем за дадена разделителна способност, използваща дадена скорост на кадрите, запознати сме с много други термини, като презредово видео, PAR и някои други.

Премахване на излишъка

Известно е, че видео без компресия не може да се използва нормално. Едночасово видео с резолюция 720p и 30 кадъра в секунда би заело 278 GB. Получаваме тази стойност чрез умножаване на 1280 x 720 x 24 x 30 x 3600 (ширина, височина, битове на пиксел, FPS и време в секунди).

Употреба алгоритми за компресия без загуби, като DEFLATE (използван в PKZIP, Gzip и PNG), няма да намали достатъчно необходимата честотна лента. Трябва да търсим други начини за компресиране на видео.

За да направите това, можете да използвате функциите на нашата визия. Ние сме по-добри в различаването на яркостта от цвета. Видеото е поредица от последователни изображения, които се повтарят във времето. Има малки разлики между съседни кадри на една и съща сцена. Освен това всеки кадър съдържа много области, използващи същия (или подобен) цвят.

Цвят, яркост и нашите очи

Очите ни са по-чувствителни към яркостта, отколкото към цвета. Можете да видите това сами, като разгледате тази снимка.

Как работи видео кодек? Част 1: Основи

Ако не виждате това в лявата половина на изображението, цветовете на квадратите A и B всъщност са еднакви, тогава това е нормално. Нашият мозък ни принуждава да обръщаме повече внимание на светлината и сянката, отколкото на цвета. От дясната страна между обозначените квадрати има джъмпер от същия цвят - така че ние (т.е. нашият мозък) лесно определяме, че всъщност те са от един и същи цвят.

Нека да разгледаме (по опростен начин) как работят нашите очи. Окото е сложен орган, състоящ се от много части. Но най-много ни интересуват конусите и пръчките. Окото съдържа около 120 милиона пръчици и 6 милиона колбички.

Нека разгледаме възприемането на цвета и яркостта като отделни функции на определени части на окото (всъщност всичко е малко по-сложно, но ще го опростим). Пръчковидни клетки са отговорни главно за яркостта, докато конусните клетки са отговорни за цвета. Конусите се разделят на три вида в зависимост от пигмента, който съдържат: S-конуси (сини), M-конуси (зелени) и L-конуси (червени).

Тъй като имаме много повече пръчици (яркост), отколкото конуси (цвят), можем да заключим, че сме по-способни да различаваме преходите между тъмно и светло, отколкото цветове.

Как работи видео кодек? Част 1: Основи

Функции за контрастна чувствителност

Изследователи в експерименталната психология и много други области са разработили много теории за човешкото зрение. И един от тях се нарича функции за контрастна чувствителност. Те са свързани с пространствено и времево осветление. Накратко, става въпрос за това колко промени са необходими, преди наблюдателят да ги забележи. Обърнете внимание на множественото число на думата "функция". Това се дължи на факта, че можем да измерваме функциите на контрастна чувствителност не само за черно-бели изображения, но и за цветни. Резултатите от тези експерименти показват, че в повечето случаи очите ни са по-чувствителни към яркостта, отколкото към цвета.

Тъй като знаем, че сме по-чувствителни към яркостта на изображението, можем да се опитаме да използваме този факт.

Цветен модел

Разбрахме малко как да работим с цветни изображения, използвайки схемата RGB. Има и други модели. Има модел, който разделя осветеността от цветността и е известен като YCbCr. Между другото, има и други модели, които правят подобно разделение, но ние ще разгледаме само този.

В този цветен модел Y е представяне на яркостта и също така използва два цветови канала: Cb (наситено синьо) и Cr (наситено червено). YCbCr може да се извлече от RGB и обратното преобразуване също е възможно. С помощта на този модел можем да създаваме пълноцветни изображения, както виждаме по-долу:

Как работи видео кодек? Част 1: Основи

Конвертирайте между YCbCr и RGB

Някой ще възрази: как е възможно да се получат всички цветове, ако не се използва зелено?

За да отговорим на този въпрос, нека преобразуваме RGB в YCbCr. Да използваме приетите в стандарта коефициенти БТ.601г, което беше препоръчано от звеното ITU-R. Това разделение определя стандартите за цифрово видео. Например: какво е 4K? Каква трябва да е честотата на кадрите, резолюцията, цветовия модел?

Първо нека изчислим яркостта. Нека използваме константите, предложени от ITU и заменим RGB стойностите.

Y = 0.299R + 0.587G + 0.114B

След като имаме яркостта, ще разделим синия и червения цвят:

Cb = 0.564(B - Y)

Cr = 0.713(R - Y)

И ние също можем да конвертираме обратно и дори да станем зелени с помощта на YCbCr:

R = Y + 1.402Cr

B = Y + 1.772Cb

G = Y - 0.344Cb - 0.714Cr

Обикновено дисплеите (монитори, телевизори, екрани и т.н.) използват само RGB модела. Но този модел може да бъде организиран по различни начини:

Как работи видео кодек? Част 1: Основи

Подсемплиране на цветовете

С изображение, представено като комбинация от яркост и цветност, можем да използваме по-голямата чувствителност на човешката визуална система към яркост, отколкото към цветност, чрез селективно премахване на информация. Chroma subsampling е метод за кодиране на изображения, като се използва по-ниска разделителна способност за наситеност, отколкото за яркост.

Как работи видео кодек? Част 1: Основи

Колко е допустимо да се намали цветовата резолюция?! Оказва се, че вече има някои диаграми, които описват как да се справят с разделителната способност и сливането (резултатен цвят = Y + Cb + Cr).

Тези схеми са известни като системи за намаляване на дискретизацията и се изразяват като 3-кратно отношение - a:x:y, който определя броя на пробите на сигнали за яркост и цветова разлика.

a — хоризонтален стандарт за вземане на проби (обикновено равен на 4)
x — брой проби на цветност в първия ред от пиксели (хоризонтална разделителна способност спрямо a)
y — броят на промените в пробите на наситеност между първия и втория ред от пиксели.

Изключението е 4:1:0, предоставяйки една цветна проба във всеки блок с разделителна способност 4 на 4 осветеност.

Общи схеми, използвани в съвременните кодеци:

  • 4:4:4 (без намаляване на дискретизацията)
  • 4:2:2
  • 4:1:1
  • 4:2:0
  • 4:1:0
  • 3:1:1

YCbCr 4:2:0 - пример за синтез

Ето обединено изображение, използващо YCbCr 4:2:0. Обърнете внимание, че харчим само 12 бита на пиксел.

Как работи видео кодек? Част 1: Основи

Ето как изглежда едно и също изображение, кодирано с основните типове цветови субсемплиране. Първият ред е окончателният YCbCr, долният ред показва цветовата резолюция. Много прилични резултати, като се има предвид леката загуба на качество.

Как работи видео кодек? Част 1: Основи

Спомняте ли си, когато преброихме 278 GB място за съхранение, за да съхраним едночасов видео файл с резолюция 720p и 30 кадъра в секунда? Ако използваме YCbCr 4:2:0, тогава този размер ще бъде намален наполовина - 139 GB. Засега все още е далеч от приемлив резултат.

Можете сами да получите хистограмата YCbCr с помощта на FFmpeg. В това изображение синьото доминира над червеното, което се вижда ясно в самата хистограма.

Как работи видео кодек? Част 1: Основи

Цвят, яркост, цветова гама - видео преглед

Препоръчваме да гледате това страхотно видео. Обяснява се какво е яркост и общо взето всички точки са пунктирани ё относно яркостта и цвета.

Видове рамки

Да продължим. Нека се опитаме да премахнем излишъка от време. Но първо, нека дефинираме някои основни термини. Да кажем, че имаме филм с 30 кадъра в секунда, ето първите му 4 кадъра:

Как работи видео кодек? Част 1: Основи Как работи видео кодек? Част 1: Основи Как работи видео кодек? Част 1: Основи Как работи видео кодек? Част 1: Основи

Можем да видим много повторения в кадрите: например син фон, който не се променя от кадър на кадър. За да разрешим този проблем, можем абстрактно да ги класифицираме в три типа рамки.

I-рамка (Intro рамка)

I-рамката (референтна рамка, ключова рамка, вътрешна рамка) е самостоятелна. Независимо какво искате да визуализирате, I-кадърът е по същество статична снимка. Първият кадър обикновено е I-кадър, но редовно ще наблюдаваме I-кадри дори сред не първите кадри.

Как работи видео кодек? Част 1: Основи

P-рамка (Pредактиран кадър)

P-кадър (предсказуем кадър) се възползва от факта, че почти винаги текущото изображение може да бъде възпроизведено с помощта на предишния кадър. Например, във втория фрейм единствената промяна е топката да се движи напред. Можем да получим рамка 2, като просто леко модифицираме рамка 1, използвайки само разликата между тези рамки. За да конструираме рамка 2, ние се позоваваме на предходната рамка 1.

Как работи видео кодек? Част 1: ОсновиКак работи видео кодек? Част 1: Основи

B-рамка (Bi-предсказуема рамка)

Какво ще кажете за връзки не само към минали, но и към бъдещи кадри, за да осигурите още по-добра компресия?! Това е основно B-кадър (двупосочен кадър).

Как работи видео кодек? Част 1: ОсновиКак работи видео кодек? Част 1: ОсновиКак работи видео кодек? Част 1: Основи

Междинно оттегляне

Тези типове рамки се използват за осигуряване на възможно най-доброто компресиране. Ще разгледаме как става това в следващия раздел. Засега нека отбележим, че най-скъпият по отношение на консумираната памет е I-кадърът, P-кадърът е значително по-евтин, но най-изгодната опция за видео е B-кадърът.

Как работи видео кодек? Част 1: Основи

Временно излишък (прогноза между кадрите)

Нека да разгледаме какви опции имаме, за да минимизираме повторенията във времето. Можем да разрешим този тип излишък, като използваме методи за кръстосано прогнозиране.

Ще се опитаме да изразходваме възможно най-малко битове, за да кодираме поредица от кадри 0 и 1.

Как работи видео кодек? Част 1: Основи

Можем да произвеждаме изваждане, просто изваждаме кадър 1 от кадър 0. Получаваме кадър 1, използваме само разликата между него и предходния кадър, всъщност кодираме само получения остатък.

Как работи видео кодек? Част 1: Основи

Но какво, ако ви кажа, че има още по-добър метод, който използва дори по-малко битове?! Първо, нека разделим рамка 0 на ясна мрежа, състояща се от блокове. И тогава ще се опитаме да съпоставим блоковете от кадър 0 с кадър 1. С други думи, ще оценим движението между кадрите.

От Уикипедия - блокирайте компенсацията на движението

Блоковата компенсация на движението разделя текущия кадър на неприпокриващи се блокове и векторът за компенсация на движение отчита произхода на блоковете (често срещано погрешно схващане е, че предишен рамката е разделена на блокове без припокриване и векторите за компенсация на движението показват къде отиват тези блокове. Но всъщност е обратното - не се анализира предишният кадър, а следващият; не е ясно къде се движат блоковете, а откъде идват). Обикновено изходните блокове се припокриват в изходния кадър. Някои алгоритми за компресиране на видео сглобяват текущия кадър от части не дори от един, а от няколко предишни предадени кадъра.

Как работи видео кодек? Част 1: Основи

По време на процеса на оценка виждаме, че топката се е преместила от (x= 0, y=25) до (x= 6, y=26), стойности x и y определяне на вектора на движение. Друга стъпка, която можем да направим, за да запазим битовете, е да кодираме само разликата на векторите на движение между последната блокова позиция и предвидената, така че крайният вектор на движение ще бъде (x=6-0=6, y=26-25=1 ).

В реална ситуация тази топка би била разделена на n блокове, но това не променя същността на въпроса.

Обектите в рамката се движат в три измерения, така че когато топката се движи, тя може да стане визуално по-малка (или по-голяма, ако се движи към зрителя). Нормално е да няма перфектно съвпадение между блоковете. Ето комбиниран изглед на нашата оценка и реалната картина.

Как работи видео кодек? Част 1: Основи

Но виждаме, че когато използваме оценка на движението, има значително по-малко данни за кодиране, отколкото когато използваме по-простия метод за изчисляване на делта между кадрите.

Как работи видео кодек? Част 1: Основи

Как би изглеждала реалната компенсация на движението

Тази техника се прилага към всички блокове наведнъж. Често нашата условна движеща се топка ще бъде разделена на няколко блока наведнъж.

Как работи видео кодек? Част 1: Основи

Можете сами да усетите тези концепции, като използвате Юпитер.

За да видите вектори на движение, можете да създадете външен прогнозен видеоклип, като използвате FFMPEG.

Как работи видео кодек? Част 1: Основи

Можете също да използвате Intel Video Pro Analyzer (платено е, но има безплатен пробен период, който е ограничен само до първите десет кадъра).

Как работи видео кодек? Част 1: Основи

Пространствено излишък (вътрешна прогноза)

Ако анализираме всеки кадър във видеоклипа, ще открием много взаимосвързани области.

Как работи видео кодек? Част 1: Основи

Нека да разгледаме този пример. Тази сцена се състои основно от сини и бели цветове.

Как работи видео кодек? Част 1: Основи

Това е I-рамка. Не можем да вземем предишни кадри за прогнозиране, но можем да ги компресираме. Нека кодираме селекцията на червения блок. Ако погледнем съседите му, забелязваме, че има някои цветови тенденции около него.

Как работи видео кодек? Част 1: Основи

Предполагаме, че цветовете се разпространяват вертикално в рамката. Което означава, че цветът на неизвестните пиксели ще съдържа стойностите на своите съседи.

Как работи видео кодек? Част 1: Основи

Такава прогноза може да се окаже невярна. Поради тази причина трябва да приложите този метод (вътрешна прогноза) и след това да извадите реалните стойности. Това ще ни даде остатъчен блок, което ще доведе до много по-компресирана матрица в сравнение с оригинала.

Как работи видео кодек? Част 1: Основи

Ако искате да практикувате с вътрешни прогнози, можете да създадете видео на макроблокове и техните прогнози с помощта на ffmpeg. За да разберете значението на всеки цвят на блока, ще трябва да прочетете документацията на ffmpeg.

Как работи видео кодек? Част 1: Основи

Или можете да използвате Intel Video Pro Analyzer (както споменах по-горе, безплатната пробна версия е ограничена до първите 10 кадъра, но това ще ви е достатъчно в началото).

Как работи видео кодек? Част 1: Основи

Втората част: Как работи видео кодекът

Източник: www.habr.com

Добавяне на нов коментар