Кодек Xvid

Иcточник: 3DNews.ru
Опубликована: 01.02.2005
Сегодня, мы рассмотрим кодек Xvid, который претендует на звание "ISO совместимого". Это значит, что он должен проигрываться стационарными плеерами, поддерживающими Mpeg4 стандарт. На практике, это до сих пор не так.

Есть 4 реальных конкурента на рынке сильного сжатия видеоматериалов: Divx, Xvid, WMV_VCM и VP6. Между собой совместимы только DivX и Xvid (как последователи стандарта Mpeg4). Я не выделил бы ни один кодек в качестве однозначного лидера. У каждого из этих кодеков есть свои изъяны.

Например, Xvid искажает цвета и не очень хорошо работает с материалами, где есть постепенные нарастания и снижения яркости, но у него высокая чёткость на динамических сценах. DivX - менее чёткий, по сравнению с Xvid (опять же, при определённых условиях, это можно назвать плюсом). К WMV_VCM пожалуй меньше всего нарицаний, но он менее чёток на динамических сценах, по сравнению с Xvid. А вот про VP6 отдельный разговор. О нём написана хорошая статья Виктором Томиловым.

Теперь приступим непосредственно к виновнику. Вы можете спросить - а чем собственно Xvid, мне больше нравится? Отвечу - он мне больше подходит по причине качественной работы с динамическими сценами. Мне очень часто приходится заниматься сжатием "домашнего видео", а оно, как известно, не блещет качеством съёмки. Всё это снимается без штатива, естественно, картинка ходит ходуном. При этих условиях, только Xvid после сжатия, сохраняет максимальную деталировку.

Кодек Xvid постоянно обновляется. Это результат того, что его код является открытым и любой, кому это интересно, может принять участие в доработке программы. Первоначальный код переписывался 3 раза полностью. Последние версии (альфа и бета) уже совместимы с кодом ISO Mpeg4. Это значит, что фильмы, сжатые при помощи кодека Xvid, будут нормально просматриваться декодером DivX. По моему мнению, декодер DivX более качественный, чем собственный декодер Xvid.

Начнём. Для сборки фильма я использую программу VirtualDub. Это очень простая программа. Захват в ней я описал, а обычная работа с VirtualDub описана во многих статьях и повторятся я не буду. После запуска VirtualDub и открытия в нём вашего видео вы должны будете произвести настройку фильтров (его я опишу в другой статье). Когда этот этап пройден, вам нужно сжать исходный материал кодеком с сильным сжатием для дальнейшего хранения и просмотра. Мы договорились, что это будет Xvid. На момент написания статьи, была выпущена версия Beta2, которую можно скачать с сайта. Я опишу работу с этой версией.

После того, как вы произвели монтаж своего фильма и произвели настройку фильтров, нужно настроить кодек. Для запуска настройки кодека Xvid, нужно произвести последовательность действий, отображённую на рисунке.

После запуска конфигурации кодека, вы увидите окно настройки кодека:

Для большего удобства я ввёл свои условные пункты от одного до шести. Далее, при описан кодека, я буду отталкиваться от этих пунктов.

Если у вас раньше была установлена другая версия кодека Xvid, то после запуска окна настройки кодека нужно обязательно установить кодек по-умолчанию. Для этого нужно нажать на кнопку помеченную цифрой 1. В случае каких-то проблем при кодировании, так же может потребоваться установка кодека в cостояние "по умолчанию".

Цифрой 2 помечены две вкладки.

Первая из них - выпадающее меню. Здесь сделаны стандартные предустановки, которые должны быть совместимы с аппаратными проигрывателями. На самом деле, использование этой вкладки под большим вопросом. Во-первых, на данный момент аппаратные Mpeg4 проигрыватели не получили достаточно широкого распространения. Это является дополнительной функцией DVD проигрывателей, но далеко не все проигрыватели это могут делать. Многое зависит от прошивки. Так что, для аппаратных проигрывателей это на вряд ли пригодится. Во-вторых, здесь только готовые предустановки для разрешения, битрейта и других параметров. Но если вы пытаетесь сжать готовый фильм, то для него потребуется своё разрешение и битрейт. В связи с этим, эта функция почти не применима.

Вторая вкладка (находящаяся под кнопкой ...) изображена на рисунке:

Сверху на этой вкладке есть возможность выбора предустановок, про которые я уже написал. Опция "Quantization type" даёт возможность выбора типа матрицы квантизеров. Не вдаваясь в подробности, что это такое, просто скажу, что даёт этот выбор. Мы можем сделать выбор из 3 пунктов:

"H.263" - это стандартная матрица квантизеров для Mpeg4. Это даёт менее чёткую картинку, чем MPEG матрица и рекомендуется делать для битрейтов ниже 900 kBit/s. Вторым пунктом стоит "MPEG". Этот выбор даст более чёткую картинку и соответственно, требует битрейтов больших, чем 900 kBit/s. "MPEG-Custom" даёт возможность задавать самому матрицу квантизеров. Я бы не рекомендовал вам пробовать это делать вручную.

Опция "Adaptive Quantization" включает возможность маскировки ярких и тёмных мест при сжатии. Раньше эта опция называлась "lumi masking". Эта опция нужна для того, что бы увеличить коэффициент сжатия исходного материала. Теоретически, человеческий глаз не заметит такого преобразования. Но на практике, при включении этой опции происходят искажения. В кодере Xvid этот алгоритм реализован недостаточно качественно.

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

Опция "Quarterpel" включает разрешение с точностью до четверти пикселя. Это повышает чёткость особенно на низких разрешениях, но вместе с этим, добавляет шум на изображение. Естественно, просто так это не происходит. Включение Quarterpel повышает загрузку процессора и увеличивает поток, используемый для этого. Включать эту опцию я не рекомендовал бы. Качество работы до сих пор не безупречно.

Опция "Global Motion Compensation" предназначена для компенсации движения. Она начинает функционировать, когда идёт панорамирование, наезд или отъезд на объект, а так же при вращении. Задумка конечно хорошая, но использовать я так же не рекомендовал бы.

А вот про опцию "Reduced resolution" ничего не известно. И вообще, не понятно, делает ли она что-нибудь.

Далее, опция BVOPs включает использование B-frames. Само по себе использование B-frames должно повысить качество кодируемого материала. Объясню, что такое B-frames.

При сжатии видео используется 3 типа кадров: I,P и B - frames. I-frames - это кадры без сжатия. Вернее, сжатие производится с очень небольшими коэффициентами компрессии. I-frames так же называются ключевыми кадрами. При просмотре сжатого фильма, вся навигация по фильму производится через ключевые кадры. После I-frames следует последовательность P-frames например так: IPPPPPPPPPPPPPPPPIPPPPPPP и так далее. P-frames имеет гораздо больший коэффициент сжатия. Для того, что бы повысить коэффициент сжатия, были введены B-frames. Они ставятся между двумя менее сжатыми кадрами (I,P-frames). Последовательность получается такой: IPBPBPBPBPBPBPIPBPBPBP… Коэффициент сжатия B-frames больше, чем коэффициент сжатия P-frames. Это достигается тем, что он сравнивается с 2 окружающими кадрами, а в B-frames записывается, чем он отличается от них. Но вместе с этим, это накладывает определённые ограничения. Например, видеопоследовательность не может заканчиваться B-frames. Начинаться же видеоряд должен обязательно с I-frames. В нём содержится вся информация об изображении. В P-frames и B-frames содержится информация не удалённая кодеком во время сжатия, что так же накладывает определённые трудности при монтаже сжатого материала. Итак, разобрались, с B-frames мы можем сильнее сжать видео. Вы спросите, а причём здесь качество? Всё просто. Сильнее сжали, а размеры видео файла у нас те же самые. Этот "освободившийся" поток перераспределяется на все кадры. Конечно, качество на B-frames ниже, чем у P-frames. Если поставить "Max consecutive BVOPs"=1, то они появляются 12 раз в секунду (последовательно с более качественными P-frames) и картинка, в целом, остаётся достаточно качественной.

Разобрались, включение B-frames (BVOPs) повышает качество.

Посмотрим теперь на опцию "Max consecutive BVOPs". Здесь нужно ставить максимальное количество идущих подряд B-frames. Если поставить 0, то мы попросту отключим использование B-frames. Если поставить больше 1, то качество картинки (на мой взгляд) падает. Плюс, я встречал появление необоснованных артефактов. Я рекомендую ставить 1.

Опция "Quantizer ratio (%)" означает, во сколько раз будет повышен квантизер для B-frames. Теперь объясню, что такое квантизер.

Квантизер может быть назван так же DRF - Detail Removal Factor. По-русски, степень потери детализации изображения. Минимально возможный квантизер - 2 (это то же самое, что 1).

Максимальный квантизер, ограничивается кодеком. Причём, чем больше квантизер, тем больше потерь в детализации будет происходить. Изначально, если кодек не ограничивать в размерах получаемого файла, он будет стремится держать квантизеры как более низкими. Но при этом размер получаемого файла будет получаться большим. Теперь, если ограничить размер получаемого AVI файла, кодек начнёт повышать эти квантизеры до тех пор, пока не попадёт в заданный размер. Причём, он устанавливает для каждого кадра свои кантизеры, в зависимости от сложности кадра.

В опции Quantizer ratio (%) мы указываем, во сколько раз увеличится квантизер и соответственно, во сколько раз ухудшится детализация на B-frames. Квантизер B-frames считается по следующей формуле: [(Quantizer of previous P-frame+Quantizer of following P-frame)*(B-frame quantizer ratio)/200+(B-frame offset/100)]. Исходя из формулы, квантизер B-frames зависит от значений квантизеров окружающих его P-frames, значения Quantizer ratio (%) (множитель) и Quantizer offset (смещение). Снижать этот параметр не рекомендую (теряется смысл B-frames). Повышать вы можете на своё усмотрение, это повысит сжатие B-frames (соответственно, снизит качество этих кадров) и повысит качество I и P-frames.

Опция "Quantizer offset" показывает, сколько нужно прибавить к квантизеру B-frames относительно расчётной величины после Quantizer ratio (%). Изменять этот параметр не стоит. Если включить опцию "Packed bitstream", то производится упаковка P-frames и B-frames в одном потоке. Это даёт возможность декодировать B-frames без задержек. При 2 проходном кодировании и включении этой опции кодер работает не правильно. Если у вас достаточно мощный процессор, нет никакого смысла включать эту опцию.

Опция "Closed GOV" предназначена для того, что бы перед I-frames никогда не стоял B-frames. Если вы не собираетесь сжатый материал впоследствии резать или сращивать, нет никакой надобности в этой функции. Зато при отключении этой функции качество можно ещё повысить за счёт добавления B-frames. Если же, вы собираетесь впоследствии как-либо монтировать Mpeg4, то вам понадобится включение этой функции. Только одно предостережение, вы сможете резать готовый Mpeg4 файл только по ключевым кадрам и многие стыки получатся очень корявыми. Лучше позаботиться о монтаже заранее.

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

Цифрой 3 (Encoding type) помечена опция, управляющая типом работы кодека.

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

1 тип - "Single Pass". Это однопроходный режим работы с постоянным битрейтом. Битрейт задаётся в окошке обозначенном цифрой 4. При вызове настроек однопроходного режима (нажатие на кнопку … под цифрой 4) появится окно:

В этом окне есть всего 3 параметра.

2 тип - Twopass - 1 st pass. Это первый проход двухпроходного режима. О нём говорить особо нечего, заглянем только в его настройки:

В окошке "Stats filename" стоит название файла, в который будет записываться статистика от первого прохода о фильме.

"Discrad first pass" если убрать галочку с этого пункта, то во время первого прохода будет не только производится сбор статистики, так же будет производится сохранение сжатого материала. Если вы используете двух проходный режим, то нет никакого смысла это делать. Единственное, для чего может это понадобится - что бы сделать видео с переменным битрейтом за 1 проход. Но размер при этом будет абсолютно не управляем., он получится на усмотрение кодека.

Теперь расскажу, о двухпроходном режиме и переменном битрейте. Для этого нужно немного рассмотреть теорию работы кодека. Кодеки Mpeg4 разработаны таким образом, что они видят не картинку целиком, а только объекты и изменение картинки от кадра к кадру. Из этого можно сделать вывод, что шумное видео сложнее сжимать, чем чистое и статичные картины так же проще сжимаются, чем динамичные (именно эту информацию и собирает кодек во время первого прохода). Допустим, у вас есть какой-то ролик или фильм. В любом видео, не бывает, что бы было абсолютно монотонное движение и неизменное количество объектов. Получается, что для каждого кадра нужно выделять разное количество памяти. Для того, что бы выделять каждому кадру своё количество битрейта, был введён переменный битрейт. То есть, во время первого прохода кодек собирает информацию о количестве движения и объектов, производит запись её в файл. Во время второго прохода, кодек начинает обрабатывать фильм снова. Только он уже производит сжатие исходного материала, пользуясь статистикой от первого прохода. При этом, для каждого кадра выделяется нужный ему битрейт. Таким образом происходит повышение качества кодируемого материала.

Продолжим рассмотрение настроек типа работы кодера.

3 тип - Twopass - 2 st pass. Это второй проход двухпроходного режима. Заглянем в его настройки:

Рассмотрю настройки сверху.

Для того, что бы произвести сжатие в два прохода, вам потребуется воспользоваться возможностями программы VirtualDub. Конкретно, как это делается, написано в моей статье "Личный опыт работы с DivX".

Теперь мы дошли до компрессии по криволинейному алгоритму (Curve compression) . Эта функция есть только у кодека Xvid. Я бы не назвал это большим преимуществом кодека Xvid, но в определённых обстоятельствах это может добавить немного качества.

При работе с компрессией по криволинейному алгоритму, перед тем, как им воспользоваться нужно произвести сжатие без него. Если вы видите, что видео получилось недостаточно качественнее, посмотрев видео можно проанализировать, в каких местах плохо отработал кодек. С динамикой, как правило, проблем не бывает. Динамика - это высокобитрейтные сцены. Так же, к высокобитрейтным относится зашумлённое видео или видео с множеством мелких предметов. Так вот, если при просмотре оказалось, что динамика смотрится хорошо, а статика не очень, можно немного снять битрейт с динамичных и среднебитрейтных сцен, для этого нужно поставить какой-то процент в "Low bitrate scenes %". Если среднебитрейтные (движение есть, но его не много) сцены смотрятся то же не очень хорошо, то битрейт можно снять только с высокобитрейтных сцен. Для этого нужно проставить какое-то значение в опции "High bitrate scenes %". Как я уже сказал, эти параметры нужно подбирать экспериментально.

Под цифрой 4 скрывается поток, который будет расходоваться на фильм.

Здесь мы можем задать размер файла, который мы хотим получить (при этом кнопка будет подсвечена надписью "Target size (kbytes)"). Только учтите, что у вас ещё есть звук, на который то же надо оставить место. Если вы хотите сделать фильм на один CD диск, то для подсчёта размера видео лучше всего воспользоваться каким-либо калькулятором, который учтёт размер звука в итоговом файле. В том случае, если кнопка подсвечена надписью "Target bitrate (kbps)", то задаваться будет средний битрейт, с которым будет кодироваться фильм. Для того, что бы переключить из одного режима в другой, нужно нажать на эту кнопку. Битрейт можно изменять слайдером и вводом цифр вручную, а вот размер файла можно задавать только вводом вручную, в килобайтах.

Для того, что бы вызвать дополнительные настройки кодека, нужно нажать на кнопку 5.

При этом вы увидите окно:

Посмотрим на настройки:



Перейдём на следующую вкладку "Quantization".

Что такое квантизеры я уже объяснял выше. В этом меню можно расставить, в каких интервалах будут работать квантизеры отдельно для I,P и B-frames. По большому счёту, не вижу смысла менять эти значения. Кодер Xvid распоряжается квантизерами достаточно хорошо. Но скажу, что это значит ещё раз.

На последней вкладке находится отладочная информация кодека.

При выборе параметров оптимизации для конкретного процессора ("Performance optimizations") можно сделать 2 выбора:

Далее, идут два пункта ("OutputDebugString debug level" и "Print debug info on each frame"), которые требуются для отладки кодека и при сжатии они абсолютно не нужны.

И последний пункт в этой закладке "Display encoding status". Эта опция включает информационную панель во время сжатия.

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

Теперь последний пункт 6

Здесь указываются интервалы, на которых нужно повышать или понижать битрейты. Этот пункт очень удобно использовать на титрах. На них не обязательно сохранять полное качество, но полностью отрезать их мне не очень то нравится. При нажатии на кнопку "Add" добавится ещё один пункт в списке. Для того, что бы его отредактировать, нужно нажать на кнопку "Edit":

Сверху здесь указывается, с какого кадра начнётся действие этого раздела. Его действие идёт до следующего раздела, а если следующего раздела нет, то действие идёт до конца фильма. Номер кадра вводится вручную. Посмотреть, с какого кадра вам нужно делать раздел очень просто. Для этого в VirtualDub нужно перейти на нужный кадр (двигая слайдер мышью, а для точного позиционирования стрелками право-лево). Внизу отображается номер кадра, на котором вы остановились.

Вы можете просто выделить его и скопировать в буфер. После вставления этого номера в окошко "Start frame #" можно продолжать настройки для этого раздела. Всё, что вы настроите ниже, будет применено только для этого раздела.

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

При выборе параметра "Weight" в окошке нужно указать коэффициент умножения битрейта (ставится вручную или ползунком). Если поставить 0,5, то битрейт снизится в 2 раза относительно расчётного значения. При выставлении в 1 с битрейтом ничего не произойдёт.

Если выбрать "Quantizer", то в окне нужно указать квантизер, с которым будет производиться сжатие. Это не очень удобно. Я пользуюсь снижением битрейта. Пожалуй, этот пункт можно использовать для того, что бы получить на каком-то промежутке предсказуемое качество. Для этого мы задаём на этом промежутке какой-то квантизер (например 10 - это довольно высокий квантизер, при котором практически все детали будут сохранены).

Теперь немного расскажу, как можно просматривать фильмы, сжатые при помощи кодека Xvid.. В связи с тем, что кодек переписывался несколько раз, материалы, закодированные разными версиями кодека Xvid, не совместимы между собой. Это касается и декодеров. Если декодер написан для версии Xvid, несоответствующей версии кодера, которым сжат фильм, то при проигрывании мы получим артефакты. Во многих проигрывателях есть собственные декодеры Xvid, они очень часто работают не правильно. Самый лучший вариант - отключить все внутренние декодеры и заставить проигрыватель пользоваться системными декодерами. Так же, выпускаются различные декодеры, поддерживающие Xvid и другие форматы. Примером такого декодера может служить FFDSHOW. Пользоваться такими вещами для просмотра я бы так же не вам рекомендовал. Многие проблемы при просмотре возникают именно из-за таких декодеров. Бывают случаи, когда попадается фильм сжатый очень ранними версиями Xvid. В этом случае, для того, что бы просмотреть этот фильм нужно будет поставить старую версию Xvid, что безусловно, очень не удобно. К сожалению, другого решения этой проблемы нет. Последние версии Xvid уже совместимы со стандартными декодерами Mpeg4. То есть, если в сжатом файле выставить метку FourCC в значение DX50, то для проигрывания этого видео запустится декодер DivX5.

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


Ссылка: http://www.oszone.net/1777/