Разбираем процесс видеокодирования на примере кодека H.264/AVC

Video Compression Guru

В этой статье мы рассмотрим основные принципы сжатия видео на примере самого распространенного кодека AVC или H.264

Зачем нужно сжимать видео?

Цифровое изображение формируется на мониторе с помощью пикселей. Цвет каждого пикселя задается с помощью RGB модели — комбинации трех основных цветов. На каждый из трех цветов приходится по 8 бит информации (для видео с глубиной цвета 8 бит), из этого следует, что для передачи 1 пикселя необходимо 24 бит информации.

Рассмотрим изображение привычного пользователю FullHD разрешения. Без сжатия для передачи подобного изображения понадобится около 50 Мбит (1920*1080*24 = 49 766 400 бит). В свою очередь, видео состоит из последовательности изображений. Типичное потоковое видео содержит 25 кадров в секунду, таким образом, объем передаваемых данных увеличится до 1,2 Гбит/с (49 766 400 * 25 = 1 244 160 000 бит/с).

Без сжатия массовая передача таких объемов видеоданных не представляется возможной. Средняя скорость передачи данных в интернете на конец 2023 года в мире составила 85 Мбит/с (по данным Глобального отчета Speedtet.net).

Принцип работы модели YUV

Схема пути изображения от захвата до вывода на экран

В цифровом телевидении для передачи и хранения видео вместо RGB используется модель – YCrCb или YUV. В модели также используется несколько компонент: отдельно введена компонента яркости Y и две компоненты цветности Cr Cb. На каждую компоненту также приходится 8 бит информации.

Основной принцип модели YUV заключается в том, что человеческое восприятие менее чувствительно к цвету, чем к яркости. У модели YUV множество форматов цветовой субдискретизации, самый распространенный — формат 4:2:0.

Цветовая субдискретизация 4:2:0

Это означает, что в потоке передается информация о яркости в полном объеме и только половина разрешения по вертикали и горизонтали для компонент цветности. Такое преобразование ведет к безвозвратной потере данных, хотя человеческий глаз не видит разницы.

Передача Full HD видео с 25 кадрами в секунду потребует порядка 600 Мбит/с, ((1920*1080 * 8 + (960*540*8*2))*25 = 622,0 бит) что в 2 раза меньше, чем при использовании RGB, но это все еще чрезмерно большой объем данных.

Для сокращения объема данных с сохранением качества используют энкодеры. Одна секунда сжатого Full HD видео энкодером H.264/AVC потребует объема данных 6-8 Мбит/с, что в 210-155 раз меньше, чем при использовании RGB.

Как работает энкодер?

Принцип сжатия любого энкодера построен на идее предсказания видеокадров и передаче разницы между предсказанным и оригинальным кадром. Чем лучше работают алгоритмы предсказания, тем эффективнее становится процесс сжатия.

Рассмотрим работу энкодера AVC с помощью инструмента для анализа качества кодирования видео Elecard StreamEye.

На первом этапе происходит разбиение кадра на макроблоки. Для H.264/AVC стандарта максимальный размер макроблока составляет 16х16 пикселей.

Разбиение кадра на макроблоки 16х16 пикселей

Сложные участки макроблоков с множеством деталей могут быть дополнительно разбиты на меньшие блоки 4х4 пикселя.

Далее происходит формирование энкодером предсказанного кадра. Для этого в арсенале имеется два типа предсказаний:

Пространственное или Intra предсказание

Области Intra предсказаний выделены красным

На кадре такие области выделены красным цветом. В данном варианте для каждого блока энкодер выбирает и использует похожие области граничащих блоков этого же кадра: слева и (или) непосредственно над ним.

Для блоков 4х4 и 8х8 предусмотрено 9 режимов Intra предсказаний:

9 режимов Intra предсказаний

DC предсказание – в текущий блок записывается значение, равное среднему арифметическому значению «пикселей-соседей»;

«угловое» предсказание строится с помощью 8 углов.

Режимы углового Intra предсказания

Для макроблоков 16х16 дополнительно доступен режим предсказания Plane, при которых значения предсказываемых пикселей определяются уравнением плоскости.

Временное или Inter предсказание

Области Inter предсказания выделены синим

При таком типе предсказания энкодер ищет в соседних кадрах блок наиболее похожий на текущий.

Inter предсказание бывает однонаправленное и двунаправленное.

Для однонаправленного Inter предсказания блока задействуются области предшествующих кадров (референсные кадры). При двунаправленном предсказании задействуются области как предшествующих, так и последующих кадров.

Используемые при Inter предсказании референсные кадры заносятся в Буфер декодированных изображений (DPB) в виде двух списков: нулевой содержит предшествующие кадры, первый — последующие. Эти кадры понадобятся декодеру для восстановления сжатых кадров.

В случае если энкодер определяет, что области кадра слабо отличаются от областей на ранее закодированных кадрах, подобные области могут быть помечены, как пропуск (skip). Данные области не кодируются, энкодеру достаточно указать номер кадра и расположение.

Смещение блоков с помощью векторов

При сравнении двух последовательных кадров, можно заметить как один кадр сдвинут относительно второго. В процессе Inter предсказания энкодер не только находит похожие области на соседних кадрах, но и указывает смещение блоков с помощью векторов. Таким образом энкодер записывает в поток сопутствующие данные, для которых также существует механизм устранения избыточности.

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

Типы сжатых кадров

Кадры, полностью сжатые с помощью Intra предсказания, называются I-кадрами и обозначены красным столбцом в структуре группы кадров (GOP).

I-кадры

Синие столбцы отображают P-кадры, у которых блоки предсказаны с помощью однонаправленного Inter предсказания.

P-кадры

Зеленые столбцы отражают B-кадры, имеющие области, предсказанные с помощью двунаправленного Inter предсказания.

B-кадры

В процессе кодирования энкодер может переупорядочить кадры. Таким образом появляются две последовательности: последовательность сжатия - “stream” и воспроизведения - “display”.

Две последовательности кадров: stream и display

Сложность и степень сжатия кадров отличаются. I-кадры имеют больший размер и выше качество, по причине того, что эти кадры используются как опорные референсы для P- и B-кадров. У B-кадров самая высокая степень сжатия. Наличие B-кадров в потоке повышает сложность вычислений и качества при сохранении битрейта.

После того как энкодер предсказал кадр, он производит сравнение с входным кадром. Энкодер сохраняет разницу между предсказанным и оригинальным кадрами, алгоритмы предсказания и сопутствующие данные, по которым декодер сможет восстановить кадр. Разницу между предсказанным и оригинальным кадрами называют остаточной информацией или residual. Остаточная информация представляет собой массивы данных со значениями компонент яркости и цветности.

Разница между предсказанным изображением и оригиналом

Дискретно косинусное преобразование Фурье

На следующем этапе к блокам 4х4 пикселя residual данных применяют спектральное дискретно косинусное преобразование Фурье (DCT). Делается это для того, чтобы представить блоки остаточной информации в виде набора частот и матрицы из 16 коэффициентов. Каждый коэффициент описывает определенную пространственную частоту.

Применение DCT и квантования к блокам

Для сокращения объема данных необходимо отбросить значения, слабо влияющие на качество изображения. Для этого значения матриц подвергают квантованию — делению на целое число, называемое квантом. В результате матрицы содержат большое количество нулей и близких к нулю значений, помимо этого уменьшается разрядность коэффициентов.

Энкодер отбрасывает нулевые значения, т.к. они слабо влияют на воспринимаемое качество изображения. Такие данные теряются безвозвратно.

При сжатии 8-битного видео параметры квантования энкодера могут принимать значения от 0 до 51. 

Степень сжатия изображения с разными параметрами квантования

Высокие значения кванта приводят к сильным округлениям коэффициентов и большому объему нулевых и близких к нулю значений.

С помощью параметра квантования можно управлять степенью сжатия и качеством видео.

Энтропийное кодирование

На заключительном этапе кодирования набор квантованных спектральных коэффициентов подвергается энтропийному кодированию. Принцип кодирования заключается в том, чтобы наиболее часто встречающимся в потоке значениям поставить в соответствие наиболее короткое кодовое слово.

Для этого у H.264/AVC имеется два алгоритма:

  • CABAC (context-adaptive binary arithmetic coding)
  • CAVLC (context-adaptive variable-length coding)

CABAC обладает более высокой эффективностью и сложностью вычислений, а также доступен только в Main и High профилях.

Декодер выполняет операции в обратной последовательности и выдает несжатые YUV кадры рендереру, который в свою очередь трансформирует YUV обратно в RGB и выводит на экран.

Рассмотренные принципы сжатия присущи всем энкодерам. Современные энкодеры выигрывают за счет более сложных комбинаций разбиения кадров, наличия большего числа и вариантов Intra и Inter предсказаний, также для них характерны более эффективные механизмы устранения избыточности и фильтрации.

Расширенное видео к этой статье можно посмотреть на нашем YouTube канале.

Автор

Александр Круглов — ведущий инженер компании Elecard. Работает в сфере видеоанализа с 2018 года. Александр отвечает за работу с крупнейшими клиентами Elecard, такими как Netflix, Cisco, Walt Disney Studios и др.

4

Комментарии