Як працює відеокодек? Частина 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, зазвичай мають на увазі співвідношення сторін дисплея (DAR - від Співвідношення сторін дисплея). Однак іноді можуть бути різні форми окремих пікселів — у цьому випадку йдеться про співвідношенні пікселів (PAR - від Pixel Aspect Ratio).

Як працює відеокодек? Частина 1. Основи

Як працює відеокодек? Частина 1. Основи

Господині на замітку: DVD відповідає DAR 4 на 3

Хоча реальна роздільна здатність DVD становить 704×480, проте вона зберігає співвідношення сторін 4:3, оскільки PAR має значення 10:11 (704×10/480×11).

Ну і, нарешті, можемо визначити відео як послідовність з n кадрів за період часу, Яке можна вважати додатковим виміром. А n тоді - це частота кадрів або кількість кадрів за секунду (FPS - від Кадри в секунду).

Як працює відеокодек? Частина 1. Основи

Кількість біт за секунду, необхідне для показу відео, є його швидкістю передачі - бітрейтом.

бітрейт = ширина * висота * біт глибина * кадрів за секунду

Наприклад, для відео з 30 кадрами за секунду, 24 бітами на піксель, роздільною здатністю 480×240 потрібно 82,944,000 бітів за секунду або 82,944 Мбіт/с (30x480x240x24) — але це якщо не використовується будь-який з методів стиснення.

Якщо швидкість передачі майже постійна, то вона називається постійною швидкістю передачі (ЦБ РФ - від постійна швидкість передачі даних). Але вона також може і змінюватись, у цьому випадку називається змінною швидкістю передачі (VBR - від змінна швидкість передачі бітів).

Цей графік демонструє обмежений VBR, коли витрачається небагато бітів у разі повністю темного кадру.

Як працює відеокодек? Частина 1. Основи

Спочатку інженери розробили метод подвоєння частоти кадрів відеодисплея, що сприймається, без використання додаткової смуги пропускання. Цей спосіб відомий як черезрядкове відео; в основному, він відправляє половину екрану в першому кадрі, а іншу половину в наступному кадрі.

В даний час візуалізація сцен в основному відбувається з використанням технології прогресивного сканування. Це спосіб відображення, зберігання або передачі зображень, що рухаються, в якому всі лінії кожного кадру промальовуються послідовно.

Як працює відеокодек? Частина 1. Основи

Ну що ж! Тепер ми в курсі, як зображення представляється в цифровому вигляді, як влаштовані його кольори, скільки біт за секунду ми витрачаємо, щоб показати відео, якщо швидкість передачі стала (CBR) або змінна (VBR). Знаємо про задану роздільну здатність з використанням заданої частоти кадрів, ознайомилися з багатьма іншими термінами, такі як черезрядкове відео, PAR та деякими іншими.

Видалення надмірності

Відомо, що відео без стиснення нормально використовувати неможливо. Годинникове відео з роздільною здатністю 720p і частотою 30 кадрів на секунду займало б 278 Гб. До такого значення приходимо, перемноживши 1280 х 720 х 24 х 30 х 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. Скористайтеся коефіцієнтами, прийнятими у стандарті BT.601, який був рекомендований підрозділом МСЕ-Р. Цей підрозділ визначає стандарти цифрового відео. Наприклад: що таке 4K? Якими мають бути частота кадрів, роздільна здатність, колірна модель?

Спочатку обчислимо яскравість. Скористаємося константами, запропонованими МСЕ, і замінимо значення 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. Основи

Колірна субдискретизація

З зображенням, представленим у вигляді комбінації яскравості та кольоровості, ми можемо використовувати більш високу чутливість людської зорової системи до яскравості, ніж до кольоровості, якщо вибірково видалятимемо інформацію. Колірна субдискретизація — це метод кодування зображень, з використанням меншої роздільної здатності для кольоровості, ніж для яскравості.

Як працює відеокодек? Частина 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 Гб дискового простору для зберігання годинного відеофайлу з роздільною здатністю 720p та 30 кадрами на секунду? Якщо скористаємося YCbCr 4:2:0, цей розмір скоротиться наполовину — 139 Гб. Поки що все одно далеко до прийнятного результату.

Ви можете отримати гістограму YCbCr за допомогою FFmpeg. У цьому зображенні синє превалює над червоним, що добре видно на самій гістограмі.

Як працює відеокодек? Частина 1. Основи

Кольоровість, яскравість, кольорова гама.

Рекомендується до перегляду ось це чудове відео. Тут пояснюється, що таке яскравість, та й взагалі розставлені всі крапки над ё про яскравість і колір.

Типи кадрів

Рухаємось далі. Спробуємо усунути надмірність за часом. Але спочатку визначимо деяку базову термінологію. Припустимо, у нас є фільм із 30 кадрами в секунду, ось його перші 4 кадри:

Як працює відеокодек? Частина 1. Основи Як працює відеокодек? Частина 1. Основи Як працює відеокодек? Частина 1. Основи Як працює відеокодек? Частина 1. Основи

Ми можемо бачити багато повторень у кадрах: наприклад, синій фон, що не змінюється від кадру до кадру. Щоб вирішити цю проблему, ми можемо абстрактно класифікувати їх як три типи кадрів.

I-кадр (Intro Frame)

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

Як працює відеокодек? Частина 1. Основи

P-кадр (Predicted Frame)

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

Як працює відеокодек? Частина 1. ОсновиЯк працює відеокодек? Частина 1. Основи

B-кадр (Bi-predictive Frame)

А як щодо посилань не лише на минулі, а заразом і на майбутні кадри, щоб забезпечити ще краще стиснення?! Це, в основному, і є B-кадр (двонаправлений кадр).

Як працює відеокодек? Частина 1. ОсновиЯк працює відеокодек? Частина 1. ОсновиЯк працює відеокодек? Частина 1. Основи

проміжний висновок

Ці типи кадрів використовуються для забезпечення найкращого стиснення. Ми розберемо, як це відбувається, у наступному розділі. А поки що відзначимо, що найбільш «дорогим» по витраченій пам'яті є I-кадр, P-кадр обходиться помітно дешевше, а найвигіднішим варіантом для відео є B-кадр.

Як працює відеокодек? Частина 1. Основи

Тимчасова надмірність (міжкадрове прогнозування)

Давайте розглянемо які ми маємо можливості для мінімізації повторень за часом. Цей тип надмірності вирішимо з допомогою методів взаємного прогнозування.

Постараємося витратити якнайменше бітів для кодування послідовності кадрів 0 і 1.

Як працює відеокодек? Частина 1. Основи

Ми можемо зробити віднімання, просто віднімаємо кадр 1 з кадру 0. Отримуємо кадр 1, тільки використовуємо різницю між ним і попереднім кадром, фактично кодуємо залишок, що тільки виходить.

Як працює відеокодек? Частина 1. Основи

Але що якщо я вам скажу, що є ще кращий метод, який використовує ще менше бітів?! Спочатку давайте розіб'ємо frame 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. Основи

Це перший кадр. Попередні кадри для прогнозування взяти не можемо, але вдасться його стиснути. Закодуємо виділення червоного блоку. Якщо ми подивимося на його сусідів, то помічаємо, що навколо нього є деякі колірні тенденції.

Як працює відеокодек? Частина 1. Основи

Припускаємо, що у кадрі кольори розповсюджуються по вертикалі. Що означає, що колір невідомих пікселів міститиме значення його сусідів.

Як працює відеокодек? Частина 1. Основи

Такий прогноз може виявитися невірним. Саме з цієї причини потрібно застосувати цей метод (внутрішній прогноз), а потім ще відняти реальні значення. Це дасть нам залишковий блок, що призведе до набагато стислішої матриці в порівнянні з оригіналом.

Як працює відеокодек? Частина 1. Основи

Якщо хочете попрактикуватися з внутрішніми прогнозами, можете створити відео з макроблоками та їх прогнозами за допомогою ffmpeg. Щоб зрозуміти значення кожного кольору блоку, доведеться ознайомитися з документацією ffmpeg.

Як працює відеокодек? Частина 1. Основи

Або ж можна використовувати Intel Video Pro Analyzer (як я вже згадував вище, у пробній безкоштовній версії обмеження на перші 10 кадрів, але вам цього спочатку вистачить).

Як працює відеокодек? Частина 1. Основи

Друга частина: Принципи роботи відеокодеку

Джерело: habr.com

Додати коментар або відгук