Магія H. 264


H. 264 — стандарт стиснення відео. І він всюдисущий, його використовують для стиснення відео в інтернеті, на Blu-ray, телефони, камери спостереження, дронах, скрізь. Всі зараз використовують H. 264.

Не можна не відзначити технологічність H. 264. Він з'явився в результаті 30-ти з гаком років роботи з однією єдиною метою: зменшення необхідної пропускної здатності каналу для передачі якісного відео.

З технічної точки зору це дуже цікаво. У статті будуть поверхнево описані подробиці роботи деяких механізмів стиснення, я постараюся не набриднути з деталями. До того ж, варто відзначити, що більшість викладених нижче технологій справедливі для стиснення відео в цілому, а не тільки для H. 264.

Навіщо взагалі стискати що-небудь?
Відео в стислому вигляді це послідовність двовимірних масивів, що містять інформацію про точках кожного кадру. Таким чином це тривимірний (2 просторових вимірювання та тимчасової 1) масив байтів. Кожен піксель кодується трьома байтами — один для кожного з трьох основних кольорів (червоний, зелений і синій).

1080p @ 60 Hz = 1920x1080x60x3 => ~370 Мб/с.

Цим практично було б неможливо користуватися. Blu-ray диск на 50Гб міг би вмістити всього близько 2 хв. відео. З копіюванням так само буде не легко. Навіть у SSD виникнуть проблеми з записом з пам'яті на диск.

Тому так, стиснення необхідно.

Чому ж H. 264?
Обов'язково відповім на це питання. Але спершу я покажу дещо. Погляньте на головну сторінку Apple:



Я зберіг зображення і приведу в приклад 2 файлу:



Емм… що? Розміри файлів здається переплутали.
Ні, з розмірами все в порядку. Відео H. 264 з 300 кадрами важить 175 Кб. Один єдиний кадр з відео в PNG — 1015 Кб.

Здається, ми зберігаємо в 300 разів більше даних у відео, але отримуємо файл вагою в 5 разів менше. Виходить H. 264 ефективніше PNG в 1500 разів.

Як таке можливо, у чому полягає прийом?
А прийомів дуже багато! H. 264 використовує всі прийоми про яких ви здогадуєтеся (і багато про яких немає). Давайте пройдемося по основним.

Позбавляємося від зайвої ваги.
Уявіть, що ви готуєте машину до гонок і вам треба її прискорити. Що ви зробите в першу чергу? Ви позбавитеся від зайвої ваги. Припустимо, машина важить одну тонну. Ви починаєте викидати непотрібні деталі… Заднє крісло? Пфф… викидаємо. Сабвуфер? Обійдемося і без музики. Кондиціонер? Не потрібен. Коробка передач? В мусо… стійте, вона ще стане в нагоді.

Таким чином ви позбавитеся від усього, крім необхідного.

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

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

Важливі частини? Як алгоритм може визначати їх важливість в кадрі?
Існує кілька очевидних способів урізання зображення. Можливо, верхня права чверть картинки марна, тоді можна видалити цей кут і ми уместимся у ¾ початкової ваги. Тепер машина важить 750 кг Або можна вирізати крайку певної ширини по всьому периметру, важлива інформацію завжди по середині. Так, можливо, але H. 264 всього цього не робить.

Що ж насправді робить H. 264?
H. 264, як і всі алгоритми стиснення з втратами, зменшує деталізацію. Нижче, порівняння зображень до і після позбавлення від деталей.



Бачите як на стислому зображенні зникли отвори в решітці динаміка в MacBook Pro? Якщо не наближати, то можна і не помітити. Зображення праворуч важить всього 7% від вихідного і це при тому, що стиснення в традиційному розумінні не було. Уявіть машину вагою всього лише 70 кг.!

7%, ого! Як можливо так позбавитися від деталізації?
Для початку трохи математики.

Інформаційна ентропія
Ми підходимо до найцікавішого! Якщо ви відвідували теорію інформатики, то можливо згадайте про поняття інформаційної ентропії. Інформаційна ентропія це кількість одиниць для представлення деяких даних. Зауважте, що це зовсім не розмір самих даних. Це мінімальна кількість одиниць, яку потрібно використовувати, щоб представити всі елементи даних.

Наприклад, якщо у вигляді даних взяти один кидок монети, то ентропія вийде 1 одиниця. Якщо ж кидків монетки 2, то знадобляться 2 одиниці.

Припустимо, що монета досить дивна — її підкинули 10 разів і кожен раз випадав орел. Як би ви кому-небудь розповіли про це? Навряд чи якось ніби ОООООООООО, ви б сказали «10 кидків, всі орли» — бум! Ви тільки що стиснули інформацію! Легко. Я вас врятував від багатогодинної стомлюючої лекції. Це, звичайно ж, величезна спрощення, але ви перетворили дані в якесь коротке подання з тієї ж інформативністю. Тобто зменшили надмірність. Інформаційна ентропія даних не постраждала — ви тільки перетворили подання. Такий спосіб називається ентропійних кодуванням, який підходить для кодування будь-якого виду даних.

Частотні інтервали
Тепер, коли ми розібралися з інформаційною ентропією, перейдемо до перетворення самих даних. Можна представити дані у фундаментальних системах. Наприклад, якщо використовувати двійковий код, будуть 0 і 1. Якщо ж використовувати шістнадцяткову систему, то алфавіт буде складатися з 16 символів. Між вищезазначеними системами існує взаємно однозначна зв'язок, тому можна легко перетворювати одне в інше. Поки все зрозуміло? Йдемо далі.

А уявіть, що можна уявити дані, які змінюються у просторі або часі, у зовсім іншій системі координат. Наприклад, яскравість зображення, а замість системи координат x і y, візьмемо частотну систему. Таким чином, на осях будуть частоти freqX і freqY, таке подання називається частотними інтервалами [Frequency domain representation]. І існує теорема, що будь-які дані можна без втрат представити в такій системі при досить високих freqX і freqY.

Добре, але що таке freqX і freqY?
freqX і freqY всього лише інший базис в системі координат. Так само як можна перейти з двійкової системи в шістнадцяткову, можна перейти з X-Y freqX і freqY. Нижче зображено перехід з однієї системи в іншу.



Дрібна сітка MacBook Pro містить високочастотну інформацію і перебуває в області з високими частотами. Таким чином дрібні деталі мають високу частоту, а плавні зміни, такі як колір і яскравість нижчу. Все, що між, залишається між.

У такому поданні, низькочастотні деталі знаходяться ближче до центру зображення, а високочастотні у кутах.

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

Нижче знайомий нам ноутбук, але тепер вже з, застосованими до неї, круговими масками.



У відсотках вказана інформаційна ентропія відносно вихідного зображення. Якщо не наближати, то різниця не помітна і при 2%! — машина тепер важить 20 кг!

Саме таким чином потрібно позбавлятися від ваги. Такий процес стиснення з втратами називається Квантованием.

Це вражає, які ще існують прийоми?


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

В телевізорах, кольору RGB перетворюються в YCbCr, де Y це компонента яскравості (по суті яскравість чорно-білого зображення), а Cb і Cr компоненти кольору. RGB і YCbCr еквіваленти в плані інформаційної ентропії.

Навіщо ж тоді ускладнювати? RGB хіба не досить?
У часи чорно-білих телевізорів, була тільки компонента Y. А з початком появи кольорових телевізорів у інженерів постало завдання про передачу кольорового RGB зображення разом з чорно-білим. Тому замість двох каналів для передачі, було вирішено кодувати колір компоненти Cb і Cr і передавати їх разом з Y, а кольорові телевізори вже самі будуть перетворювати компоненти кольору і яскравості у звичний їм RGB.

Але ось у чому хитрість: компоненту яскравості кодується в повному дозволі, а компоненти кольору лише чверть. І цим можна знехтувати, оскільки очей/мозок погано розрізняє відтінки. Таким чином можна зменшити розмір зображення в половину і з мінімальними відмінностями. В 2 рази! Машина буде важити 10 кг.!

Дана технологія кодування зображення зі зниженням колірного дозволу називається колірний субдискретизацией. Вона використовується повсюдно вже давно і відноситься не тільки до H. 264.

Це найвагоміші технології в зменшенні розміру при стиску з втратами. Нам вдалося позбутися від більшості деталізації і скоротити інформацію про кольорі в 2 рази.

А можна ще більше?
Так. Обрізання зображення це лише перший крок. До цього моменту ми розбирали окремо взятий кадр. Настав час поглянути на стискання в часі, де нам належить працювати з групою кадрів.

Компенсація руху
H. 264 стандарт, який дозволяє компенсувати руху.

Компенсація руху? Що це?
Уявіть, що ви дивитеся тенісний матч. Камера зафіксована і знімає з певного кута і єдине що рухається це м'ячик. Як би ви закодували це? Ви б зробили що і зазвичай, так? Тривимірний масив пікселів, дві координати в просторі і один кадр за раз, так?

Але навіщо? Велика частина зображення однакова. Поле, сітка, глядачі не змінюються, єдине що рухається це м'ячик. Якщо визначити єдине зображення фону і одне зображення м'ячика, що рухається по ньому. Не заощадило б це значно місця? Ви бачите, до чого я веду, чи не так? Компенсація руху?

І це саме те, що H. 264 робить. H. 264 розбиває зображення на макроблоки, зазвичай 16х16, які використовуються для розрахунку руху. Один кадр залишається статичним, зазвичай його називають I-кадр [Intra frame], і містить всі. Наступні кадри можуть бути або P-кадри [predicted], або B-кадри [bi-directionally predicted]. В P-кадри вектор руху кодується для кожного макроблока на основі попередніх кадрів, таким чином декодер повинен використовувати попередні кадри, взявши останній з I-кадрів відео і поступово додаючи зміни наступних кадрів поки не дійде до поточного.

Ще цікавіше справи з B-кадрами, в яких розрахунок проводиться в обох напрямках, на підставі кадрів йдуть до та після них. Тепер ви розумієте чому відео на початку статті важить так мало, це всього лише 3 I-кадру, в яких метушаться макроблоки.

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

Ми розглянули статичну і тимчасове стиснення. З допомогою квантування ми у багато разів зменшили розмір даних, потім з допомогою колірної субдискретизации ще вдвічі скоротили отримане, а тепер ще компенсацією руху домоглися зберігання лише 3х кадрів з 300, які були спочатку у розглянутому відео.

Виглядає вражаюче. Тепер що?
Тепер ми підведемо риску, використовуючи традиційне энтропийное кодування без втрат. Чому ні?

Энтропийное кодування
Після етапів стиснення з втратами, I-кадри містять надлишкові дані. У векторах руху кожного з макроблоків в P-кадри і B-кадри багато однакової інформації, так як часто вони рухаються ідентично, як це можна спостерігати в початковому відео.

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

Ось тепер все! В основі H. 264 лежать вищезгадані технології. В цьому і полягають прийоми стандарту.

Відмінно! Але мене розбирає цікавість дізнатися, скільки ж важить тепер наша машина.
Вихідне відео було знято в нестандартному форматі 1232x1154. Якщо порахувати, то вийде:

5 сек. @ 60 fps = 1232x1154x60x3x5 => 1.2 Гб
Стисле відео => 175 Кб

Якщо співставити результат з обумовленою масою машини в одну тонну, то вийде вага дорівнює 0.14 кг 140 грамів!

Так, це магія!

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

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.