Кодеки для сжатия видео. Часть 1

Каждый, кто занимается видеообработкой, рано или поздно встает перед проблемой выбора кодека для сжатия видео и аудио. У каждого кодека свои особенности и своя область применения. Изучение возможностей кодеков, конечно же, начинается с поиска информации в Интернет — описание настроек, сравнения. В данной статье, как видно из названия, мы рассмотрим только видеокодеки. Как можно заметить, каждый разработчик характеризует свой кодек как нечто из ряда вон выходящее. Можете говорить, что у меня мания, но такое восхваление распространено среди платных продуктов (яркий пример — DivX). Бесплатные же в большинстве своем "держатся" только на мнениях пользователей. Фактор, который многие не учитывают, когда формируют свое мнение о качестве изображения, — дисплей. Как уже говорилось в одной из предыдущих статей, важно, на каком мониторе (телевизоре) будет просматриваться видео. Количество видимых артефактов будет больше на жидкокристаллических мониторах. Чуть меньше их будет видно на ЭЛТ- мониторах. На среднестатистическом телевизоре артефактов будет видно еще меньше. "Расплатой" за такое преимущество будет худшая четкость изображения и цветопередача. Для каждого отдельно взятого дисплея количество видимых артефактов увеличивается с увеличением контрастности и яркости.

Чтобы разобраться в настройках кодеков, нужно знать общие принципы кодирования видео. Большинство современных кодеков используют следующий принцип при сжатии видеопотока. Все кадры в потоке подразделяются на базовые (Intra) и дополнительные (Inter). Что это означает? Пусть есть некоторый базовый кадр, иначе называемый I-кадром (Intra — вступительный), или ключевым кадром. Информация о нем сжимается по некоторому алгоритму (проще говоря, это картинка JPEG). Следующий за ним кадр в большинстве случаев мало чем отличается от своего предшественника. Поэтому целесообразнее сохранять информацию о новом кадре как изменения относительно предыдущего кадра. Когда количество изменений станет большим, можно сохранить новый базовый кадр, и новые дополнительные кадры будут рассчитываться относительно него. Дополнительные кадры такого типа называются P- кадрами (Predicted — предсказанные). В качестве базовых для P-кадров могут выступать I- или другие P-кадры. Существует и другой тип дополнительных кадров, называемых B-кадрами (Bidirectional, или, подлиннее, Bidirectional interpolated prediction — двунаправленные предсказанные). Такие кадры рассчитываются как изменения относительно не только предыдущего, но и последующего кадра. В качестве базовых для них могут выступать I-, P-, а в некоторых случаях — даже B-кадры. Плюсы и минусы данного подхода очевидны. Плюс в том, что такой подход сильно уменьшает размер файла. Минусы менее существенны. Это и большее время перехода на произвольную позицию, и меньшая надежность при хранении. И хотя о B-кадрах "известно" еще со времен MPEG-1, в Microsoft "пошли другим путем", и разработанная там технология VfW (Video for Windows) не предполагает наличия B-кадров в видеопотоке (уж не студенты ли двоечники разрабатывали?), потому что любой видеопоток кодируется по этой технологии последовательно по одному кадру, и понятно, что в таком случае "заглянуть" вперед и рассчитать B-кадр возможности нет. К сожалению, Virtual Dub в своей работе может использовать только VfW-кодеки. Тем не менее, встречаются VfW-кодеки, которые такое ограничение технологии VfW обходят. Теперь хотелось бы сделать одно замечание для редактирования в режиме Direct stream copy (см. статью "Virtual Dub. Настройки и модификации"). Удалить или выделить можно только диапазон от ключевого до ключевого кадра, потому что, исходя из вышесказанного, видеопоток может начинаться с I-кадра, а режим Direct stream copy не предусматривает повторного сжатия (значит, и "генерирования" нового I-кадра на месте бывшего P- или B-кадра).

Что ж, перейдем к рассмотрению видеокодеков. Видеокодеки можно разделить на две группы. Первая группа — кодеки без потерь качества (lossless) и без визуальных потерь качества — предназначена для сжатия так называемого промежуточного видео, то есть видео, которое будет подвергаться дальнейшей обработке. Вторая группа предназначена для финального сжатия видео. Это видео предназначено больше для просмотра, чем для последующей обработки и/или сжатия. Остановимся кратко на кодеках "без потерь". Стандартом lossless де-факто является кодек HuffYUV, настройки которого мы рассматривали в одной из предыдущих статей. Альтернатив ему существует достаточно много, хотя достойную замену все же найти трудно. Приведу пример. MSU lossless codec обеспечивает очень высокую степень сжатия, но при этом скорость сжатия видео с разрешением 512х384 на компьютере с процессором Intel Pentium 4 3,2 ГГц всего лишь 15-20 кадров в секунду. Конечно же, использовать такой кодек при захвате видео нельзя. Кодеки без визуальных потерь качества в большинстве своем платные. Чтобы "выжать" максимум качества, предпочтительнее использовать кодеки без потерь качества. Но кодеки без визуальных потерь, в общем-то, ничем не хуже. Подробно рассмотрим кодеки для финального сжатия видео, причем только MPEG- 4-кодеки и подобные им.

DivX

Название этого кодека говорит само за себя. Вероятно, это самый распространенный кодек для фильмов "на одном-двух CD". На рис. 1-3 представлены различные закладки окна настроек этого кодека версии 6.2.5. Или 6.2? Или 6.3? Со времени выхода версии 6.0.3, после "испытания" которой я отказался от DivX, разработчики явно теряли время даром. Да, я не оговорился. Их усилия были больше направлены на запутывание пользователя в настройках, которые никак не претендуют на подробность, или на подкрашивание сайта, или на что-то еще в этом духе. В общем, я скачал пятнадцатидневную испытательную версию 6.3. После установки кодека и запуска Virtual Dub обнаружил, что кодек постарел, стал версии 6.2.5, причем для "1 Logical CPU" (интересно, а "двухпроцессорная" версия столько же стоит?). Ну, а открыв окно настроек, я увидел, что имею дело и вовсе с версией 6.2 community. Видно, что общество (community) разработчики DivX или не любят, или не уважают, или все сразу. Ибо настройки присутствуют все, но выбрать их нельзя. Этакое форменное издевательство, которое призвано ускорить расставание клиента с заветными двадцатью долларами (такова стоимоcть версии 6.2.5 Pro). После быстрой пробежки по закладкам была найдена заветная кнопка, которая на 15 дней активировала Pro-версию. Со времен версии 6.0.3 изменилась "вывеска", и добавилось (скорее даже просто видоизменилось) пару опций и картинок.

. Закладка Main (рис. 1) предлагает нам выбор профиля, количество этапов сжатия и средний битрейт (или относительное качество). Что касается профиля, то смысл в его выборе есть тогда, когда вы планируете просматривать видео на каком-либо устройстве типа DivX-проигрывателя. В этом случае смело выбирайте профиль Home Theater. В ином случае я советовал бы выбирать профиль High Definition, потому что никаких преимуществ, например, у профиля Handled перед ним при просмотре сжатого с низким разрешением и битрейтом видео на смартфоне Motorola MPx220 я не заметил. Количество этапов сжатия, судя по наличию опции Multipass Nth-pass, может быть и больше двух. Но это не факт, потому что "официальной" N-этапностью могут обладать в основном кодеки стандарта H.264. В чем преимущество сжатия в два этапа, было рассмотрено в статье "Virtual Dub. Настройки и модификации" (описание модификации Nan Dub), поэтому повторяться не будем. Для сжатия в два этапа придется сформировать соответственно два задания. Их отличие должно состоять только в выбранном режиме кодирования: Multipass 1-pass для первого этапа и Multipass Nth-pass для второго. Если у вас возникнут трудности с выбором битрейта, вы можете воспользоваться встроенным калькулятором (вызывается по нажатии на соответствующую кнопку) для его подсчета. Значение по умолчанию 780 уже мало пригодно для "компьютерного" видео, так что старайтесь не выбирать значение ниже этого. Вместо установки битрейта можно установить относительное качество, выбрав режим 1-pass quality-based. Чем выше значение Target quantizer, тем хуже качество. Опция Encoding presets является всего лишь более подробным вариантом опции Codec Performance на следующей странице.

. На закладке Codec (рис. 2) приведены качественные параметры кодирования. Опция Codec Performance устанавливает баланс между скоростью и качеством. Для наиболее качественного кодирования следует выбирать самый медленный режим. Картинка, показывающая баланс между скоростью и почему-то сжатием, никакого отношения к жизни не имеет. Интересно, зачем там изображено сжатие, ведь этот параметр мы строго задали на предыдущей закладке. И второй вопрос: почему на картинке отсутствует качество? Видимо, "художник" был не лишен чувства юмора. Max keyframe interval задает максимальный промежуток между соседними I-кадрами. Слишком низкое значение может привести к появлению "блочности", слишком высокое — к увеличению времени перехода на произвольную позицию при проигрывании видео. Из группы Motion Estimation, ранее носившей название Advanced Tools, бесполезными можно назвать обе опции: Global Motion Compensation и Quarter Pixel search. Первая, как следует из названия, призвана снизить битрейт (повысить качество) в сценах с вращением, наездом камеры. На деле данная функция в силу своей экспериментальности может качество даже ухудшить. Функция Quarter Pixel search предназначена для видео с низким разрешением, однако и она существенно на качество не влияет. Напротив, при попытке проиграть сжатое с этими опциями видео смартфон Motorola MPx220 неприятно ругнулся, что о GMC и Q-pel он ничего не знает, и предупредил, что проиграет видео некорректно. И вправду, проиграл некорректно. А ведь опция Q-pel была предназначена именно для него! Количество последовательных B- кадров при выборе профиля Home Theater не может быть больше одного.

. На закладке Video (рис. 3) представлены фильтры для обработки видео, которые я настоятельно НЕ рекомендую. Соответствующие фильтры Virtual Dub, на мой взгляд, более качественные. Единственная полезная опция, не относящаяся к фильтрам, — Quantization. H.263 обычно рекомендуют для низких битрейтов, а MPEG-2 — для высоких, потому что квантизация MPEG-2 обеспечивает более высокую четкость. У меня на этот счет своего мнения так и не сложилось. Но вот удивительно, квантизация MPEG-2 в настройках этого кодека отсутствует.
Навскидку можно предположить, что DivX не любит высокой четкости. Но это лишь мое предположение, которое не нужно принимать за утверждение. Рассмотрим все же некачественные фильтры. Группа фильтров Video resolution предназначена для обрезки и изменения размера кадра. Interlace — фильтр деинтерлейсинга. Эффект от его применения практически нулевой. Noise Reduction (шумоподавитель) и Psychovisual Enhancements (психовизуальное улучшение) в сумме могут сделать мультик из вашего видео.

. Кнопка Advanced на самом деле не скрывает ничего "продвинутого". Она будет полезна для сохранения настроек. Кнопка Restore Defaults предназначена для восстановления начальных настроек.

У DivX есть один серьезный недостаток (впрочем, для кого как) — платность. При посещении сайта меня не покидало такое чувство, что разработчики стараются снабдить каждого пользователя как можно большим объемом рекламы и извлечь выгоду буквально из каждой опции своего кодека.

x264

Кодер стандарта H.264 от создателей VLC Media Player. С его помощью можно только сжимать видео. Для просмотра понадобится устанавливать еще декодер H.264. Посмотрим, что умеет кодер нового поколения. Различные закладки окна настроек изображены на рис. 4-7. Полное описание всех настроек данного кодека невозможно без описания всех "нововведений" стандарта H.264. Поэтому о многих настройках я расскажу кратко, а о стандарте H.264 постараюсь подробнее рассказать в другой раз.

. На закладке Bitrate (рис. 4) находятся параметры, которые определяют размер будущего видеофайла и количество этапов сжатия.
Существует пять режимов установки степени сжатия и количества этапов. Название режима Single pass означает, что видео будет сжато в один этап. Quantizer позволяет выбрать относительное качество видео. Чем выше значение, тем хуже качество. Bitrate позволяет выставить средний битрейт видео. Подсчитать, сколько места займет видео при определенном битрейте, нетрудно. Для этого битрейт нужно разделить на 8 (число бит в байте) и умножить на продолжительность видео в секундах. Мы получим размер видео в килобайтах. Для того, чтобы получить мегабайты, нужно дополнительно разделить полученное число на 1024. При кодировании в два этапа нужно сформировать соответственно два задания. Для первого задания следует использовать режим Multipass — First pass (или его "версию" fast). Нужно при этом указать, в каком файле будет храниться статистика. Опция Update Statsfile нужна, если видео сжимается в большее число этапов.
Для второго (и последующих) этапа нужно использовать режим Multipass — Nth Pass.

. На закладке Rate Control (рис. 5) находятся параметры переменного битрейта. Keyframe boost определяет, на сколько процентов размер ключевого кадра может превышать среднее значение битрейта, задаваемое пользователем. B-frames reduction, как можно догадаться,
определяет, на сколько процентов может быть урезан размер B-кадров в сравнении с тем же средним значением. Параметры Min QP, Max QP имеют приблизительно такой же смысл, как и Quantizer. То есть чем выше эти пороги, тем хуже качество. Если эти значения будут слишком низкими, то будет выше вероятность появления "блочности". Значения по умолчанию вполне приемлемы, хотя я предпочитаю устанавливать Min QP равным 4. Небольшое замечание: одно из значений Min/Max QP должно быть четным, а другое нечетным. Scene Cut Threshold — порог смены сцены. При его превышении будет сформирован новый I-кадр. Min/Max IDR-frame interval — минимальный и максимальный интервал, который может разделять два соседних I-кадра. Чем отличается I-кадр от IDR-, я толком не понял. В "доступной" документации сказано, что не всякий I-кадр может являться базовым для окружающих его P-, B-кадров. Таким образом, если I-кадр является базовым, то в терминах x264 он называется IDR-кадром.

. Закладка MBs&Frames (рис. 6) предоставляет настройки B-кадров и методов формирования P- и B- кадров. В группе Partitions представлены различные методы сбора информации в кадрах сжимаемого видео для как можно более оптимального формирования последующих. Тут все просто. Чем методов больше, тем ниже будет скорость кодирования. В теории и качество будет лучше. На практике оно, во всяком случае, будет не хуже. Некоторые настройки B-кадров нам уже знакомы. Первая опция указывает максимальное число последовательных B-кадров.

Bias указывает отклонение. То есть при положительных значениях Bias кодек будет стремиться к использованию большего числа B-кадров, и наоборот. Включенная опция Use as references позволит кодеку использовать B-кадры в качестве базовых для других B-кадров. Опция Bidirectional ME соответствует опции Use VHQ for bframes кодека XviD. Сложно объяснить действие опции Weighted biprediction. Сам механизм weighted prediction (взвешенное предсказание) описан в стандарте H.264 и, грубо говоря, позволяет кодеру при выполнении второго, третьего и т.д. этапов сжатия для P-кадров осуществлять выбор наиболее оптимальных из нескольких предсказанных во время предыдущего этапа сжатия параметров. Собственно, опция Weighted biprediction включает этот "туманный" алгоритм для B-кадров. Adaptive позволяет кодеку не создавать B-кадр, если он считает это неуместным. Direct mode определяет "режим" формирования B-кадров: временной (когда сбор информации происходит в некоторой области кадра на протяжении нескольких кадров) или пространственный (когда сбор информации происходит внутри отдельно взятых кадров). Первый обеспечивает лучшее визуальное качество, а второй — более высокий уровень SNR (отношение "полезный сигнал/шум").

. На закладке More (рис. 7) представлены настройки, способные заставить сильно "задуматься" любой современный микропроцессор. Опция Partition decision аналогична опции VHQ mode кодека XviD (алгоритмы поиска движения) — чем выше значение, тем выше качество и время сжатия. Следующая опция Method определяет, в каких направлениях будет выполняться поиск движения. Влияние на качество и время такое же, как и у предыдущей опции. А вот Range — область поиска — лучше не выбирать больше 16 — процессор начнет быстро превращаться в "тугодума". Chroma ME включает поиск движения не только по яркостной составляющей, но и по цветоразностям, что увеличивает качество и время сжатия. Опции Trellis и CABAC способны увеличить качество. Можно их включить — вреда от них точно не будет. Deblocking filter на самом деле не повлияет на время сжатия, так как это будет только указание декодеру, который будет воспроизводить видео, включить фильтр подавления "блочности" с заданными параметрами. Фильтр Noise reduction я трогать не рискнул (это все же фильтр). Проще воспользоваться уже знакомыми фильтрами Virtual Dub. Sample AR задает отношение сторон точки и ничем не отличается от аналогичной настройки у XviD, но мала вероятность того, что проигрыватель может проигнорировать этот параметр. Опция Threads предназначена для многопроцессорных систем. Неважно, логические это процессоры или физические. Если установлено, например, два процессора Pentium 4 с поддержкой технологии Hyper Threading, то "правильное" значение Threads равно 4.

В этом кодеке был обнаружен и один неприятный баг. Полученное видео содержало в самом начале некоторое количество "выпавших" кадров. Это количество равно максимальному числу B-кадров в настройках кодека. При этом общее количество кадров в видеоролике остается тем же. То есть весь поток как бы сдвигается на n кадров (и последние n полезных кадров пропадают). Аудио при этом "остается" на месте, то есть происходит рассинхронизация. Звук опережает видео на 40*n миллисекунд (в случае PAL). Такой баг проявляется только в VfW-версии кодека (которую и использует Virtual Dub) и является следствием ограничения технологии Video for Windows, о котором было сказано выше. В отличие от XviD, х264 не имеет средств "обхода" такого ограничения. Как выход из ситуации предлагается использование CLI (Command Line Interpreter) версии кодека. Однако такой вариант исключает всякое редактирование сжимаемого видео средствами Virtual Dub. Следующее замечание является одновременно и советом. При задании новых размеров кадра видео старайтесь, чтобы ширина и длина были числами четными. Связано это может быть как с особенностями цветового пространства YUV и требованиями стандартов, так и с внутренними особенностями отдельного кодека. И более того: у некоторых кодеков требования более жесткие. Например, корректная работа кодека х264 возможна, если ширина кадра кодируемого видео без остатка делится на 8, а высота — на 16.
Что ж, на сегодня вполне достаточно. Во второй части заключительной статьи цикла, посвященного обработке видео с помощью Virtual Dub, мы рассмотрим еще два популярных кодека — XviD и VP70 — и подведем итог.

Ссылки:

x264 (revision 553) — сайт (бесплатный, авторы VideoLAN team, Sharktooth).
FFDShow (многофункциональный кодек, включающий декодер H.264) — сайт (бесплатный, администратор проекта Milan Cutka).
DivX (6.3) — сайт (платный, испытательная версия 15 дней, автор DivX Inc.).

Окончание следует

Maxe Erte the Mad, maxe.erte@gmail.com


Компьютерная газета. Статья была опубликована в номере 33 за 2006 год в рубрике soft

©1997-2024 Компьютерная газета