Что такое кодек?

Ни для кого не секрет, что фильмы в формате .avi сами по себе не появляются: их нужно делать самому из DVD-видео. Как сделать правильный .avi, мы уже рассмотрели (см. «МБ» №41’2006). Теперь настала очередь копнуть поглубже и разобраться в том, что происходит во время процесса кодирования.

Для начала стоит провести небольшой ликбез. Само слово «кодек» является сокращением слов кодер/декодер. По своей сути это небольшая программа, которая, в соответствии со своим уникальным алгоритмом, производит обработку каждого кадра нашего фильма. Кодек – это одно из звеньев в цепочке программ, которые работают над процессом сжатия или воспроизведения видео.
При кодировании видео из DVD в AVI цепочка выглядит примерно следующим образом: AVISYNTH получает поток, совершает над ним определенные действия (обрезка по краям, деинтерлейсинг, масштабирование) и передаёт его VirtualDubMod’у. VirtualDubMod (с помощью фильтров) производит препроцессинг и конвертирует поток в понятный кодеку формат. Кодек непосредственно осуществляет компрессию в нужный нам формат и передает сжатый поток обратно VirtualDubMod’у, который, в свою очередь, отдает его драйверу файловой системы, складывающему данные на диск в том виде, в котором ему указал VirtualDubMod. Немного сложновато, но такая система вполне справляется со своей задачей.
При воспроизведении цепочка получается немного проще. Драйвер файловой системы передает записанные на носителе видеоданные в медиаплеер, который этот поток исследует и, найдя информацию о формате сжатия, отдает его соответствующему кодеку. Кодек расшифровывает поток и посылает обратно плееру, который передает его на драйвер видеокарты для воспроизведения на экране.
Легко заметить, что ключевым звеном в обоих процессах является кодек. Без него невозможна правильная обработка потока, и без его применения видео представляло бы собой набор BMP-картинок.
Кодеки подразделяются на два основных типа.
1.Lossless («беспотерьные»), позволяющие кодировать видео без потери информации и, соответственно, с высочайшим качеством (на самом деле, потери всё-таки есть, поскольку каждый кадр сжимается JPEG-подобным алгоритмом. Но все кадры в потоке остаются на своих местах). Основной недостаток таких кодеков – очень низкий коэффициент сжатия, в результате чего фильм получается огромных – десятки гигабайт – размеров. Поэтому такие кодеки в основном применяются для получения промежуточного файла при монтаже цифрового видео. Самый простой пример – MotionJPEG, применяемый в некоторых моделях цифровых фотоаппаратов для записи видео.
2.Lossy («потерьные»), которые кодируют видео с потерей информации. Кодек определяет, которую часть информации можно отбросить, а всё оставшееся – сильно сжимает. Именно из-за этого достигается высокая степень компрессии исходного потока. Качество кодека определяется заложенным в него алгоритмом определения избыточной информации. Самые распространенные представители этого класса – DivX, XviD, MPEG2, VP6, H.264.

• • •
Само собой, в обычной жизни простого домашнего кодера вряд ли найдется место для lossless-кодеков. Не у каждого всегда свободно 80-100 гигабайт, чтобы вольготно поработать с видео. Поэтому подробнее остановимся на lossy-кодеках. Принцип их работы в большинстве случаев следующий.
В сжатом потоке можно выделить так называемые I‑кадры (ключевые) и P‑кадры (предсказанные). I‑кадр представляет собой статичную картинку из видеопотока, сжатую по алгоритму типа JPEG; изображение передаётся в этом кадре целиком. Кодек не сжимает каждый кадр потока индивидуально, как это происходит в случае работы lossless-кодеков, где весь поток состоит из I-кадров. Благодаря чему же достигается высокая степень сжатия? Вот тут начинается самое интересное. В потоке используются вышеупомянутые P-кадры.
В видеопотоке всегда есть области изображения, в которых большую часть времени абсолютно ничего не происходит – фон за диктором новостей, например. Поэтому при обработке потока кодек отбрасывает эти блоки и описывает только изменения в переменной части кадра. Временные изменения блоков описываются как раз в P-кадрах. Кроме того, для ещё большего увеличения степени компрессии потока были разработаны так называемые B-кадры («bidirectional» – двунаправленные). Они содержат информацию об изменении изображения на основе анализа предыдущего и последующего кадров.
Не бывает видео, на всём протяжении которого происходило бы абсолютно монотонное движение с одинаковым количеством объектов. Получается так, что для каждого кадра кодеку необходимо выделить разное количество памяти. И тут на помощь приходят переменный битрейт и двухпроходное кодирования. Во время первого прохода кодек собирает информацию о количестве движения и объектов в каждом кадре и записывает в файл эти данные. Во время второго прохода кодек начинает непосредственно сжимать исходный материал, но основывается при этом на полученных во время первого прохода данных. Благодаря этому на каждый кадр выделяется нужный ему битрейт, что позволяет получить высокое сжатие без особого ущерба для восприятия.
Есть у этого класса и ограничения. Большинство кодеков видят не картинку целиком, а только изменения от кадра к кадру. Отсюда следует, что шумное видео сложнее сжимать, так же как и любительское. «Мусор» в кадре, дрожание камеры – всё это приводит к увеличению количества I-кадров, и, соответственно, к распуханию конечного файла.
Рассмотрим поподробнее несколько самых распространенных кодеков, с помощью которых можно легко сделать avi-шку.

Кодеки компании DivX Networks
Первым из этой серии на свет появился кодек DivX 3.11, который являлся взломанной версией Microsoft’овского MPEG-4 version 3. Самый первый, далеко не идеальный, но, тем не менее, очень широко распространенный несколько лет назад. До сих пор можно запросто встретить фильмы, пожатые именно этим старичком. DivX Networks на месте не стоит, и последняя версия DivX уже носит номер 6.4. Но самым стабильным по сей день остаётся DivX 5.2.1.

Кроме основных характеристик, в DivX 5 можно выделить следующее:
•общая компенсация движения. Сильно помогает при увеличении/уменьшении объектов в кадре и при панорамировании, если объект сохраняет свою статичность и изменяет только размер и местоположение;
•обработка нецелых пикселей. DivX 5 умеет работать с частями 1.25, 1.5, 1.75 пикселя, что позволяет более реалистично передавать движение объектов на изображении.
Последние версии DivX 6 не обзавелись ничем революционным, качество кодирования визуально не улучшилось, и поэтому пока переход на их использование оправдан.

Кодеки XviD
В отличие от коммерческого DivX, XviD является open-source-проектом. Любой желающий может скачать исходники и внести свой вклад в его развитие. Долгое время находившийся в стадии бета-тестирования, в настоящее время этот кодек дорос до версии 1.2 и его использование позволяет добиться в некоторых случаях недостижимого для DivX качества изображения при одинаковом битрейте. XviD также поддерживает все «фишки» DivX: B‑кадры, компенсацию движения, четверти пикселей и т.п. Из недостатков – более медленная, по сравнению с DivX, скорость кодирования.

Кодеки AVC (H.264Ррррр)
Эти кодеки могут обеспечить наилучшее качество за счёт своего продвинутого алгоритма, но за это придётся поплатиться системными ресурсами, которых потребуется очень много. Кроме коммерческой версии также существует open-source-версия, которая называется x.264, полностью аналогичная по функциональности H.264.

Существует ещё огромное количество кодеков, но все они мало востребованы рядовыми пользователями. Поэтому остановимся на четырех упомянутых. Какой же из них лучше? Разобраться в этом можно только экспериментальным путем.

Тестирование
Для проведения эксперимента возьмем небольшой кусочек DVD-видео (у меня под рукой оказался трейлер нового фильма Мэла Гибсона «Апокалипто») и сожмём его в AVI всеми четырьмя кодеками. Эксперимент проведём два раза: в первый установим одинаковый для всех кодеков битрейт и размер кадра и сравним визуально качество и размер итогового файла; во втором зададим размер кадра и итоговый размер и опять же сравним качество картинки и битрейт. Кодирование будем производить с помощью GordianKnot RipPack 0.35.2, т.к. он позволяет без труда установить все параметры кодирования для всех четырех кодеков – DivX 3.11, DivX 5.2.1, XviD 1.2, x.264.
Исходя из результатов тестирования (см. таблицы 1 и 2), сложно выделить победителя. Все кодеки, за исключением DivX 3.11, показали замечательные результаты. Но всё-таки предпочтение мы отдадим кодеку DivX 5.2.1. Причин тут несколько. Во‑первых, практически идеальное качество картинки.

Во-вторых, приемлемое время кодирования. И в-третьих – хороший битрейт при жёстко заданном размере конечного файла. Чемпионом мог бы стать x.264, который делает avi-шку чуть-чуть лучше по всем параметрам, но запредельное время кодирования вряд ли устроит рядового пользователя.

К слову, кодирование производилось на сервере Fujitsu-Siemens Primergy Econel 200, с двумя процессорами Intel Xeon 2800. Согласитесь, для такой машины кодировать видео со скоростью 14 кадров в секунду – это позор. Но x.264 требует под себя слишком много ресурсов. Итог – DivX 5.2.1 – наш выбор!


Рекомендуем почитать: