Что такое видеопоток? И сколько он весит?
Современный человек имеет дело с большими объемами видеоданных. Мы смотрим ролики на Youtube, загружаем в смартфоны сезоны любимых сериалов и мультфильмы на планшет детям. Записываем на 50-ти гиговые диски фильмы в высочайшем Blu-ray качестве для просмотра в домашнем кинотеатре. Мы используем квадрокоптеры для панорамных съемок фото или видео, и системы видеонаблюдения для контроля наших домов, офисов, объектов бизнеса… Все эти данные необходимо где-то хранить. Постоянно или временно, значения не имеет.Что такое видеопоток? И сколько он весит?
Видеопотоком принято считать последовательность цифровых двумерных массивов, которые содержат информацию о пикселях каждого кадра каждую секунду. По сути, это массив байтов, которые несут в себе информацию по одному временному и двум пространственным параметрам. Один пиксель кодируется тремя байтами (по одному для каждого основного цвета RGB — красный, зеленый, синий).
Это невероятно большой объем информации. Просто представьте,
1080Р@60Hz = 1920х1080х60х3 = > ~ 370 Мб/с данных. Иными словами, 1 секунда видео «весит» больше 370 Мб!
А теперь попробуем посчитать, сколько сотен Blu-ray дисков нам понадобится, чтобы записать всего один фильм? При условии, что на один диск объемом в 43 Гб уместится всего 2 минуты видео. И заодно, сколько часов нам понадобилось бы, чтобы просто скопировать эту информацию на диск. Величины получаются запредельные.
Собственно, для того, чтобы наша планета не превратилась в «мир носителей информации», были разработаны специальные кодеки видеокомпрессии, позволяющие «сжимать» видеопоток до приемлемых размеров. Кодеки позволяют существенно, до десятков тысяч раз уменьшить вес видеоданных, не особо жертвуя при этом качеством видеоизображения.
В 2003-м году в области широкого применения появился стандарт сжатия видео Н.264. Он нашел свое применение в самых разных сферах, где имеется работа с потоковым видео: в интернете, в мобильных устройствах, в системах видеонаблюдения, в системах конференц-связи и т.д.
Как работает кодек Н.264?
Кодирование видео при помощи кодека Н.264 производится с применением специальных алгоритмов. Расскажем о нескольких основных.
Стандартный алгоритм сжатия с потерями — уменьшение детализации видеоизображения.
Стандартный алгоритм сжатия с потерями - уменьшение детализации видеоизображения.
Найдите отличия между картинками: слева – оригинал, справа – результат компрессии. В целом ничего не изменилось, мы видим одну и ту же картинку: часть ноутбука, пальцы, клавиши. Но суть, как известно, кроется в мелочах: на «ужатой» картинке смазанный участок вместо отверстий динамика и нечеткие символы обозначения клавиш.
Почему это происходит? При компрессии происходит сглаживание мелких деталей. Перед нами целая общая картинка, но более слабого качества, размытая в частностях. Собственно, только один этот алгоритм позволяет добиться почти 90% сжатия видео по сравнению с оригиналом.
Квантование, или энтропийное кодирование статичных данных.
Освежим в памяти понятие информационной энтропии. По сути — это минимальное количество единиц для представления некоторых данных.
Например, вы покупаете 10 мороженых. Вы говорите: дайте 10 пломбиров в сахарном рожке. Вы же не просите – дайте одно мороженое мне, одно для моего друга, два – детям и так далее. Вы просто кратко обозначили вашу потребность, без избыточной информации. Можно сказать, вы энтропийно закодировали данные о мороженом: один и тот же элемент кодируется в статике один раз (объект – мороженое пломбир в сахарном рожке), остальные 9 раз эта информация просто запоминается, поскольку ничем не отличается от первого.
Теперь подберемся поближе к истине, точнее к видео.
Представим данные, которые изменяются во времени и пространстве, в новой системе координат. Вместо классической, с осями абсцисс и ординат, возьмем систему, с частотным пространством — Frequency domain representation. Таким образом, на осях будут частоты freqX и freqY. Существует теорема Котельникова, которая гласит, что при достаточно высоких частотах freqX и freqY любые данные можно представить в частотной системе координат с любой точностью и без потерь качества.
При преобразовании нашего изображения в частотную систему координат, получаем картинку следующего вида.
преобразование изображения в частотную систему координат
Мелкая решетка динамиков – детализированное изображение, которое содержит высокочастотную информацию, а потому находится в области с высокими частотами. Плавные изменения в картинке (цвет, яркость) – в низкочастотном спектре. Соответственно, все, что по цвету-яркости находится между ними – остается на том же уровне, в среднем сегменте. Низкочастотные детали располагаются ближе к центру картинки, а высокочастотные разнесены по углам.
К чему нам это знание?
К тому, что теперь мы точно знаем, где располагается важная информация, а где та, которой можно пренебречь. Соответственно, применив маску, мы понизим детальность видеоизображения. А когда преобразуем ЭТО в привычную картинку, увидим, что новое изображение похоже на исходное, но с меньшей степенью детализации. Соответственно, можно поиграть с настройками, выбирая маску и размер оставленной детализации.
Вот как это все выглядит:
Видеокомпрессия производится путем снижения уровня цифровой энтропии (избыточной детализации) и уровень потерь вы можете настроить сами.
Следующий способ сжатия видеоданных — метод цветовой субдискретизации.
Метод основан на особенности человеческого глаза слабо различать оттенки цвета. Это связано, прежде всего, со строением органов зрения. В глазу человека – примерно 125 миллионов колбочек, которые отвечают за восприятие яркости и только 8 миллионов колбочек, которые отвечают за цветовосприятие. Поэтому мы лучше воспринимаем оттенки ярче-темнее, чем сможем разглядеть 45 оттенков серого.
Что из этого следует? Мы можем сэкономить на информации о цвете в процессе видеосжатия. Кодировать компоненту яркости в полном разрешении, в то время как компоненту цветности изображения – только в четверть. Таким нехитрым способом размер изображения можно уменьшить вполовину, и потери при этом будут минимальны.
Еще один алгоритм видеокомпрессии, который используется в стандарте Н.264 — компенсация движения.
Представьте себе многократно повторяющееся движение. Отличник армейской подготовки подтягивается 100 раз. Пауэрлифтер тягает гири. Или теннисный матч. На протяжении достаточно длительного времени мы видим, в принципе, одно и то же: скачущие теннисисты, зрители на трибунах, судьи. Все они, кроме игроков, практически статичны. Единственное движущееся пятно – теннисный мяч.
Видео можно кодировать в обычном порядке: трехмерный массив пикселей, две координаты в пространстве, одна во времени. Но зачем, если ничего не меняется, кроме положения мяча. Нельзя ли сэкономить, сделав картинку фоном и оставив на ней летающий туда-сюда мяч?
Именно так и делает Н.264. Изображение разбивается на макроблоки размером 16х16, которые используются для расчета движения. Один кадр, так называемый, I‑кадр, остается статичным (Intra frame). В нем все, что не движется. Трибуны, зрители, судьи, кусочек неба или крыши стадиона. Кстати в H.265 кодеке алгоритм сжатия использует макроблоки 64х64.
Дальнейшие кадры могут быть двух видов:
— Р-кадры [predicted]: вектор движения кодируется для каждого макроблока на основе предыдущих кадров. Декодер использует предыдущие кадры, взяв последний из I‑кадров, и постепенно добавляет изменения последующих кадров.
— B-кадры [bi-directionally predicted] – здесь расчет производится в обоих направлениях, на основании как предыдущих, так и последующих кадров.
По сути, кодируется только подтягивающийся атлет, поднимающий гири качок и летающий теннисный мяч, остальные 90 процентов изображения воспроизводятся путем повтора закодированного опорного кадра.
Таким образом, видео стадиона и трибун может весить предельно мало, ведь это будет практически статичная картинка-фон, по которому быстро-быстро перемещаются макроблоки-мяча и ракеток. Эффективное кодирование различий векторов движения существенно сжимает видео и экономит место на носителях информации.
И наконец, энтропийное кодирование без потерь поможет завершить процесс видеосжатия. Все примененные типы и способы компрессии эффективны, но в итоге мы все равно можем сжать еще. Некоторое количество бесполезных избыточных данных в I-кадрах, а также в векторах движения Р- и В-кадров. Это как плохо отжатая рубашка: размер ваш, яркость не изменилась, но весит вещь чуть поболее, чем ее тщательно «выкрученная» соседка.
Это кодирование аналогично энтропийному кодированию для статичных данных: оно сокращает размер видео, убирая избыточное кодирование повторяющихся движений. Энтропийное кодирование без потерь выжмет из вашей видеоинформации последние лишние детали.
Итак, эффективное кодирование видео при помощи стандарта Н.264 позволяют сжимать видео практически в 10 000 раз от исходного размера. Это позволяет нам добиться поставленной цели: экономить место на носителях информации, снизить сетевой трафик и получить видео отличного качества при разумном его весе.