Россия, г. Смоленск ул. Николаева д. 19а кв. 56 |
Алгоритмы сжатия видео
Базовые технологии сжатия видео
Описание алгоритма компрессии
Технология сжатия видео в MPEG распадается на две части: уменьшение избыточности видеоинформации во временном измерении, основанное на том, что соседние кадры, как правило, отличаются не сильно, и сжатие отдельных изображений.
Для того чтобы удовлетворить противоречивым требованиям и увеличить гибкость алгоритма, рассматривается четыре типа кадров:
- I-кадры - кадры сжатые независимо от других кадров ( I-Intra pictures ),
- P-кадры - сжатые с использованием ссылки на одно изображение ( P-Predicted ),
- B-кадры - сжатые с использованием ссылки на два изображения ( B-Bidirection ),
- DC-кадры - независимо сжатые с большой потерей качества (используются только при быстром поиске).
I-кадры обеспечивают возможность произвольного доступа к любому кадру, являясь своеобразными входными точками в поток данных для декодера. P-кадры используют при архивации ссылку на один I- или P-кадр, повышая тем самым степень сжатия фильма в целом. B-кадры, используя ссылки на два кадра, находящихся впереди и позади, обеспечивают наивысшую степень сжатия. Сами в качестве ссылки использоваться не могут. Последовательность кадров в фильме может быть, например, такой: IBBPBBPBBPBBIBBPBB... Или, если мы не экономим на степени сжатия, такой (рис. 8.1):
![I-кадры - независимо сжатые (I-Intrapictures), P-кадры - сжатые с использованием ссылки на одно изображение (P-Predicted), B-кадры - сжатые с использованием ссылки на два изображения (B-Bidirection)](/EDI/20_07_20_2/1595197216-9970/tutorial/311/objects/8/files/8_1.gif)
Рис. 8.1. I-кадры - независимо сжатые (I-Intrapictures), P-кадры - сжатые с использованием ссылки на одно изображение (P-Predicted), B-кадры - сжатые с использованием ссылки на два изображения (B-Bidirection)
Частота I-кадров выбирается в зависимости от требований на время произвольного доступа и надежности потока при передаче через канал с ошибками. Соотношение P- и B-кадров подбирается, исходя из требований к величине компрессии и ограничений декодера. Как правило, декодирование B-кадров требует больше вычислительных мощностей, однако позволяет повысить степень сжатия. Именно варьирование частоты кадров разных типов обеспечивает алгоритму необходимую гибкость и возможность расширения. Понятно, что для того, чтобы распаковать B-кадр, мы должны уже распаковать те кадры, на которые он ссылается. Поэтому для последовательности IBBPBBPBBPBBIBBPBB кадры в фильме будут записаны так: 0**312645..., где цифры - номера кадров, а звездочкам соответствуют либо В-кадры с номерами -1 и -2, если мы находимся в середине потока, либо пустые кадры (ничего), если мы в начале фильма. Подобный формат обладает достаточно большой гибкостью и способен удовлетворять самым различным наборам требований.
Одним из основных понятий при сжатии нескольких изображений является понятие макроблока. При сжатии кадр из цветового пространства RGB переводится в цветовое пространство YUV. Каждая из плоскостей сжимаемого изображения ( Y, U, V ) разделяется на блоки 8x8, с которыми работает ДКП. Причем плоскости U и V, соответствующие компоненте цветности берутся с разрешением в два раза меньшим (по вертикали и горизонтали), чем исходное изображение. Таким образом, мы сразу получаем сжатие в два раза, пользуясь тем, что глаз человека хуже различает цвет отдельной точки изображения, чем ее яркость (подробнее об этих преобразованиях смотрите в описании алгоритма JPEG ). Блоки 8x8 группируются в макроблоки. Макроблок - это группа из четырех соседних блоков в плоскости яркостной компоненты Y (матрица пикселов 16x16 элементов) и два соответствующих им по расположению блока из плоскостей цветности U и V. Таким образом, кадр разбивается на независимые единицы, несущие полную информацию о части изображения. При этом размер изображения должен быть кратен 16.
Отдельные макроблоки сжимаются независимо, т.е. в B-кадрах мы можем сжать макроблок конкретный как I-блок, P-блок со ссылкой на предыдущий кадр, P-блок со ссылкой на последующий кадр и, наконец, как В-блок.
Алгоритм сжатия отдельных кадров в MPEG похож на соответствующий алгоритм для статических изображений - JPEG. Если говорить коротко, то сам алгоритм сжатия представляет собой конвейер преобразований. Это дискретное косинусное преобразование исходной матрицы 8x8, квантование матрицы и вытягивание ее в вектор v11,v12,v21,v31,v22,...,v88 (зигзаг-сканирование), сжатие вектора групповым кодированием и, наконец, сжатие по алгоритму Хаффмана.
Общая схема алгоритма
В целом весь конвейер преобразований можно представить так:
- Подготовка макроблоков. Для каждого макроблока определяется, каким образом он будет сжат. В I-кадрах все макроблоки сжимаются независимо. В P-кадрах блок либо сжимается независимо, либо представляет собой разность с одном из макроблоков в предыдущем опорном кадре, на который ссылается P-кадр.
- Перевод макроблока в цветовое пространство YUV. Получение нужного количества матриц 8х8.
- Для P-блоков и B-блоков производится вычисление разности с соответствующим макроблоком в опорном кадре.
- ДКП
- Квантование.
- Зигзаг-сканирование.
- Групповое кодирование.
- Кодирование Хаффмана.
При декодировании весь конвейер повторяется для обратных преобразований, начиная с конца.
Использование векторов смещений блоков
Простейший способ учитывать подобие соседних кадров - это вычитать каждый блок сжимаемого кадра из соответствующего блока предыдущего. Однако более гибким является алгоритм поиска векторов, на которые сдвинулись блоки текущего кадра по отношению к предыдущему. Для каждого блока в изображении мы находим блок близкий по некоторой метрике (например, по сумме квадратов разности пикселей) в предыдущем кадре в некоторой окрестности текущего положения блока. Если минимальное расстояние по выбранной метрике с блоками в предыдущем кадре больше выбранного порога - блок сжимается независимо (рис. 8.2).
Таким образом, вместе с каждым блоком в поток теперь сохраняются координаты смещения максимально похожего блока в предыдущем I- или P-кадре, либо признак того, что данные сжаты независимо. Эти координаты задают вектор смещения блока ( motion vector ). В ситуациях, когда камера наезжает на объект или дает панораму, использование векторов смещений блоков позволяет значительно уменьшить амплитуду разности кадров, и как следствие - значительно поднять степень сжатия.
Если мы проанализируем реальные фильмы, то окажется, что часто блок сдвигается не на кратное число пикселов, а, например, на 10.4 пиксела (камера быстро движется вправо, план съемки сдвигается равномерно и проходит полный кадр размером 352х240 за 1.35 секунды). При этом оказывается, что для повышения степени сжатия выгодно строить 4 области поиска векторов смещений: исходную, сдвинутую на полпиксела по горизонтали, сдвинутую на полпиксела по вертикали и сдвинутую на полпиксела по горизонтали и по вертикали (по диагонали), которые строятся с помощью достаточно быстрых алгоритмов билинейной или кусочно-линейной аппроксимации. Этот прием также позволяет уменьшить разность между блоками и повысить степень сжатия при минимальной дополнительной информации, которую надо сохранять в файл (плюс 2 бита на каждый блок). Правда строить аппроксимированные блоки придется и при декомпрессии, однако это сравнительно дешевая по времени операция, которая весьма незначительно увеличивает общее время декомпрессии.
Также надо понимать, что алгоритм поиска оптимальных векторов смещения заключается, вообще говоря, в переборе. Существуют различные методы уменьшения этого перебора, и настройки видео-кодеков, регулирующие скорость сжатия нередко варьируют именно параметры метода перебора.