Субота, 9 Травня, 2026

Як відео стискають у 1000 разів: що насправді відбувається між пікселем і плеєром

Коли ми натискаємо «Play» у VLC чи в браузері, на екрані з’являється картинка, а в навушниках — звук. За цією буденністю ховається одна з найскладніших інженерних систем сучасного інтернету. Про те, як працює це стиснення, детально говорили Жан-Батіст Кемпф, лід-розробник VLC і президент VideoLAN, та Кіран Кунья, багаторічний контриб’ютор FFmpeg, у розмові з Лексом Фрідманом.

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

Відео як потік кадрів: від сирих пікселів до гігантських обсягів даних

У найпростішому уявленні цифрове відео — це послідовність кадрів. Кожен кадр — це сітка пікселів, де кожен піксель описується трьома компонентами: червоний, зелений і синій (RGB). Типові частоти — 24, 30 або 60 кадрів на секунду.

Якщо взяти, наприклад, відео 1920×1080 при 30 кадрах на секунду з 8-бітним RGB, отримаємо понад 2 мільйони пікселів на кадр, по 3 байти на піксель. Це приблизно 6 МБ на кадр, або близько 180 МБ на секунду. Хвилина такого «сирого» відео — вже понад 10 ГБ.

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

Сучасні кодеки зазвичай стискають відео в 100–200 разів відносно сирого потоку. Тобто ті самі 10 ГБ на хвилину перетворюються на десятки чи сотні мегабайт. А найпросунутіші схеми й експериментальні режими націлені на ще радикальніші показники — аж до порядку 1000×, залежно від контенту й допустимої якості.

Для порівняння, у світі аудіо перехід від сирого PCM до MP3 дає приблизно 10-кратне стиснення. Відео ж вимагає на порядок агресивнішого підходу, і це визначає всю архітектуру сучасних кодеків.

Чому відео стискають «для очей», а не як ZIP

Ключова відмінність медіакодеків від звичних форматів на кшталт ZIP у тому, що вони майже завжди є «втратними». ZIP, RAR чи інші архіватори працюють без втрат: на вході й виході — біт у біт однакові дані. Відео- й аудіокодеки так не роблять принципово.

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

Для аудіо алгоритми моделюють роботу слуху: які частоти ми чуємо гірше, які звуки маскують інші, де можна «зрізати» деталі без помітної втрати якості.

Для відео — моделюють зір: як ми сприймаємо яскравість і колір, на які просторові частоти (дрібні деталі, текстури) ми чутливі, а де можна «загрубити» картинку.

Це означає, що завдання кодека — не «зберегти всі біти», а «максимізувати суб’єктивну якість при заданому бітрейті». Інженери свідомо деградують сигнал, але намагаються зробити це так, щоб глядач не відчув обману.

Від RGB до YUV: як колірний простір економить половину даних

Більшість користувачів мислить зображеннями в RGB, але сучасні відеокодеки майже ніколи не працюють безпосередньо в цьому просторі. Перший великий крок до стиснення — перехід у YUV (часто в різних варіантах YCbCr).

У YUV компонент Y відповідає за яскравість (луму), а U і V — за кольорові відхилення (хрому). Це не випадковий математичний трюк, а відображення фізіології ока. На сітківці є два типи рецепторів: палички, що відповідають за чутливість до яскравості, і колбочки, що відповідають за колір. Людина значно чутливіша до змін яскравості, ніж до дрібних змін кольору.

Кодеки цим активно користуються. Після переходу в YUV яскравісний канал зазвичай зберігається з повною роздільною здатністю, а кольорові — знижуються. Типова схема — 4:2:0, де хрома має вдвічі меншу роздільну здатність як по горизонталі, так і по вертикалі.

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

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

Як кодек «вгадує» картинку: просторове й часовe передбачення

Щоб зрозуміти, як працює сучасний кодек, варто розібратися з двома типами надлишковості в відео: просторовою й часовою.

Просторова надлишковість — це схожість сусідніх пікселів у межах одного кадру. Наприклад, небо, стіна, шкіра — усі ці області мають плавні градієнти, а не хаотичний шум.

Часова надлишковість — це схожість між послідовними кадрами. У більшості сцен значна частина зображення змінюється мало: фон залишається, рухаються лише об’єкти або камера.

Кодеки будують на цьому складну систему передбачення.

Базовим елементом є I-кадри (intra frames). Їх можна уявити як окремі зображення, закодовані без посилання на інші кадри. Усередині I-кадру кодек використовує просторове передбачення: ділить зображення на блоки, намагається передбачити вміст кожного блоку на основі сусідніх, а потім зберігає лише різницю між передбаченням і реальністю. Ця різниця називається «резидуалом».

Інші типи кадрів (P- і B-кадри в багатьох стандартних кодеках) активно експлуатують часову надлишковість. Вони не зберігають повну картинку, а описують, як поточний кадр відрізняється від попередніх або наступних: куди змістилися блоки, що з’явилося, що зникло.

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

Від простору до частот: блоки, DCT і походження «квадратиків»

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

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

Як це працює на інтуїтивному рівні: будь-який фрагмент зображення можна розкласти на суму «хвиль» різної частоти й амплітуди. Низькі частоти відповідають за плавні зміни (наприклад, м’який градієнт неба), високі — за дрібні деталі й різкі переходи (текст, тонкі лінії, текстури).

Після DCT більшість енергії сигналу концентрується в кількох низькочастотних коефіцієнтах, тоді як високочастотні часто мають малі значення. Це ідеальне поле для подальшого «урізання».

На цьому етапі вступає в гру квантування. Коефіцієнти в частотній області діляться на певні кроки (кванти), дрібні значення округлюються до нуля або грубо спрощуються. Саме тут відбувається значна частина втрат: дрібні деталі, на які око менш чутливе, просто викидаються або сильно спрощуються.

Під час декодування відбувається зворотний процес: коефіцієнти розквантуються, до них застосовується зворотне перетворення (inverse DCT або аналог), і ми повертаємося в просторову область, отримуючи приблизну версію оригінального блоку.

Те, що перетворення блокове, має прямий візуальний наслідок. Якщо бітрейт занадто низький, а квантування занадто агресивне, між сусідніми блоками з’являються помітні розриви. Саме звідси беруться знайомі «квадратики» на погано закодованому відео — так звані blocking artifacts. Вони не випадкові, а є прямим наслідком блокової природи перетворень і стиснення.

Ентропійне кодування: коли математика вичавлює останні біти

Навіть після всіх перетворень і квантування дані все ще містять статистичну надлишковість. Деякі значення зустрічаються частіше, інші — рідше. Щоб максимально ефективно упакувати цей потік, кодеки застосовують ентропійне кодування.

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

На етапі декодування перший крок програмного кодека — якраз «розмотати» цей математичний шар: виконати зворотне ентропійне кодування, відновити послідовність синтаксичних елементів, а вже потім переходити до зворотних перетворень, розквантування й реконструкції кадрів.

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

Асиметрія обчислень: чому кодувати важче, ніж декодувати

Одна з найменш очевидних, але фундаментальних рис сучасного відеостиснення — його глибока асиметрія. Кодування (encoding) і декодування (decoding) — це не дзеркальні операції з однаковою складністю.

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

Кодер, навпаки, — це «мозковий центр», який приймає всі складні рішення. Він повинен вирішити, як саме передбачати блоки, які режими руху використовувати, як налаштувати квантування, які коефіцієнти можна пожертвувати, як розподілити бітрейт між різними частинами кадру й між кадрами в часі.

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

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

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

Кожне нове покоління кодеків: мінус 30% бітрейту, плюс вибух навантаження

Еволюція відеокодеків — це постійний торг між ефективністю стиснення й обчислювальною складністю. Історично кожне нове покоління стандартів приносить приблизно 30-відсоткове зниження бітрейту для тієї ж візуальної якості.

Ці 30% виглядають скромно, але в масштабах інтернету це колосальна економія трафіку, місця в дата-центрах і пропускної здатності мереж. Для великих платформ це прямі гроші.

Однак за кожні нові 30% доводиться платити. Щоб досягти такого виграшу, кодери стають значно складнішими: додаються нові режими передбачення, складніші моделі руху, гнучкіші блокові структури, просунутіші схеми квантування й ентропійного кодування.

Результат — різке зростання вимог до CPU на етапі кодування. У деяких випадках перехід на новий кодек може означати збільшення обчислювальних витрат на порядок, а то й на два.

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

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

GPU, CPU і реальність: чому майже половина відео все ще декодується «вручну»

У масовій уяві відтворення відео давно асоціюється з апаратним прискоренням: «це ж зробить відеокарта». Частково це правда — сучасні GPU мають вбудовані блоки для декодування популярних кодеків.

Але реальність помітно складніша. Оцінки показують, що близько 45% відеофайлів не можуть бути декодовані на GPU й змушені повертатися до програмного декодування на CPU. Причини різні: варіанти профілів і рівнів кодеків, нестандартні параметри, відсутність підтримки конкретних режимів у певних моделях GPU, екзотичні формати.

Тому програвачі на кшталт VLC і бібліотеки на кшталт FFmpeg змушені спочатку аналізувати потік, з’ясовувати, чи сумісний він із апаратним декодером, і лише потім вирішувати, куди його відправляти — у «чорну скриньку» GPU чи в софтварний декодер.

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

Від бітів до пікселів: як завершується шлях відео

Якщо розкласти весь шлях від файлу до екрана, отримаємо кілька великих етапів. Спочатку операційна система або мережевий стек постачає потік байтів — із диска, по HTTP, з DVD чи іншого джерела.

Далі контейнер (MP4, MKV, MOV та інші) демультиплексується: з потоку виділяються окремі доріжки — відео, аудіо, субтитри. Для кожної доріжки визначається відповідний кодек.

Потім відеодоріжка або передається на GPU, якщо формат і параметри сумісні, або обробляється програмним декодером. На цьому етапі відбувається зворотне ентропійне кодування, зчитування синтаксичних елементів, реконструкція передбачення, зворотні частотні перетворення, розквантування й відновлення кадрів у сирому вигляді — як правило, у YUV.

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

Кожен із цих кроків — результат багаторічної роботи тисяч інженерів і дослідників. Кожна «дрібниця» — від вибору розміру блоку до форми квантувальної матриці — впливає на те, як виглядатиме й звучатиме кінцевий ролик.

Висновок: невидима інженерія, що тримає відеоінтернет

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

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

Усе це відбувається непомітно для користувача. Для нього є лише кнопка «Play». Але за нею — один із найскладніших технологічних ланцюжків, які коли-небудь створювало людство, і саме він робить можливим світ, де відео стало універсальною мовою інтернету.


Джерело

How video compression works – VLC lead developer explains | Lex Fridman Podcast

НАПИСАТИ ВІДПОВІДЬ

Коментуйте, будь-ласка!
Будь ласка введіть ваше ім'я

Ai Bot
Ai Bot
AI-журналіст у стилі кіберпанк: швидко, точно, без води.

Vodafone

Залишайтеся з нами

10,052Фанитак
1,445Послідовникислідувати
105Абонентипідписуватися

Статті