Когда вы смотрите видео в HD-качестве, вы, скорее всего, не задумываетесь о том, сколько данных пришлось бы передавать, если бы не было сжатия. Цифры были бы устрашающими. Но видео всё-таки доходит до вас быстро и в хорошем качестве — и за это стоит сказать спасибо видеокодекам и одному из их основных инструментов: предсказанию.
Давайте разберемся, как это работает.
Видео избыточно — и это хорошая новость
Любое видео содержит огромное количество избыточной информации. Соседние пиксели в одном кадре очень похожи друг на друга — небо остаётся голубым на протяжении многих пикселей подряд, стена сохраняет один цвет, лицо человека не меняется резко от одного пикселя к соседнему.
Но это ещё не всё. Соседние кадры тоже очень похожи между собой. Если человек говорит в кадре, фон за ним практически не меняется от кадра к кадру. Рука двигается плавно, а не прыгает хаотично.
Всю эту избыточность умные алгоритмы умеют убирать. И именно здесь в игру вступает предсказание. Предсказание — это процедура, которая пытается сделать предположение о том, что собой представляет кодируемый блок ещё до того, как он будет сжат. Причём делается это на основе уже закодированных данных — чтобы декодер на другом конце мог повторить ту же самую процедуру и восстановить картинку.
Существует два вида предсказания: внутри кадра и между кадрами.
Предсказание внутри кадра: продолжаем картинку
Представьте, что вы кодируете небольшой квадратный блок изображения. Слева от него и сверху уже есть закодированные пиксели. Идея внутрикадрового предсказания проста: берём эти граничные пиксели и под некоторым углом продолжаем их в сторону кодируемого блока — как будто рисуем линейкой.
Получившийся блок-«предсказание» вычитается из реального блока. Если предсказание хорошее, остаток будет очень маленьким — и именно он затем преобразуется и обрабатывается. Чем точнее предсказание, тем меньше данных нужно обработать.
Этот инструмент появился в стандарте AVC, где было доступно семь угловых направлений предсказания. В следующем стандарте, HEVC, количество углов выросло до тридцати трёх. В новейшем стандарте VVC — удвоилось по сравнению с HEVC. Больше режимов позволяет кодеру лучше подобрать направление предсказания для конкретного блока.
Предсказание между кадрами: ищем блок в прошлом
Межкадровое предсказание работает иначе. Его идея — найти текущий блок в уже закодированных кадрах: предыдущих или даже следующих (которые в порядке кодирования уже обработаны).
Если человек в кадре чуть сдвинулся вправо, кодек находит его в предыдущем кадре и говорит: «вот этот блок — это то же самое, что было там, только сдвинутое на столько-то пикселей вправо».
Эта идея появилась ещё в MPEG-1 и с тех пор постоянно совершенствуется.
Когда движение сложное: аффинная компенсация в VVC
Простой сдвиг — это только один вид движения. В реальности объекты в кадре поворачиваются, масштабируются, искажаются. Классические кодеки до VVC умели описывать только параллельный перенос — как будто блок просто сполз в сторону.
В VVC появилась аффинная компенсация движения. Кодируемый блок разбивается на маленькие подблоки 4×4 пикселя, каждому из которых назначается свой вектор движения. Этот вектор не передаётся в потоке явно — он вычисляется из небольшого набора параметров, которые и отправляются декодеру. В итоге кодек позволяет лучше моделировать повороты, масштабирование и сдвиг — хотя и с ограничениями: большие углы поворота ему всё равно не под силу.
Почему экшен и спорт весят больше, чем вебинар
Здесь всё логично. Чем проще и предсказуемее движение в кадре, тем точнее работает предсказание и тем меньше остаточных данных нужно передавать.
На сцене с говорящим человеком на статичном фоне межкадровое предсказание работает отлично: фон не меняется вовсе, движение минимально. Кодек легко находит нужный блок в опорном кадре, и для статичного фона обычно требуется совсем немного новой информации.
А вот фейерверк или динамичная спортивная сцена — это хаотичное движение сразу во всём кадре. Предсказание часто ошибается, остатки большие, данных нужно передавать больше. Именно поэтому спортивные трансляции требуют более высокого битрейта, чем обычные вебинары при том же разрешении.
Предсказание — один из ключевых принципов, который позволяет видеокодекам сжимать огромные объёмы данных, сохраняя приемлемое качество изображения. От простого поиска похожего блока в соседнем кадре до более сложных моделей движения в VVC — задача остаётся одной: передать не всю картинку целиком, а только то, что действительно изменилось. Чем лучше кодек умеет находить и описывать эти изменения, тем эффективнее он использует каждый бит.