Сибирский Лихоман
"DivX ;)". История, технология, совершенствование.
Подготовлено по заказу журнала ХАКЕРспец. Авторский вариант.

Предистория.

В 99-2000 году на западе уже достаточно распространилась технология DVD и стали продаваться массово DVD с фильмами. Естесственно не у всех хватало денег покупать DVD каждый день, народ научился обходить защиты DVD (CSS) и быстро стал клепать программы для рипинга видео в DVD-шном качестве. Естесственно нужно было во что-то перекодировать супер качественный MPEG-2, снятый с DVD, для дальнейшего хранения, переноса и просмотра. Пробовали разные кодеки - WMF (ASF), RA, Angel Potion, DivX, и большинство остановилось на последнем - его качество оказалось на средних потоках наилучшим, а AVI формат позволял в последующем без проблем редактировать полученный фильм (резать, перекодировать, накладывать другой звук и т.д.), благо, что редакторов для AVI понаписано множество, а вот для RA или ASF - по пальцам.

Считается, что изначально DivX - это вскрытый кодек Windows Media MPEG-4 V3. В строке "производитель" в свойствах кодека сказано - "Hacked with Joy!" Сама M$ в свое время решила отказаться по некоторым причинам от AVI формата при кодировании видео файлов. Кодек был немного доработан (by Jerome Rota aka Gej), и выпущен в свет в сентябре 99-го как DivX, снова поддерживающий AVI формат. В последствии DivX-3 включил в себя два отдельных кодека - почти оригинальную версию от M$, названную "DivX Low Motion" и кодировавшую лучше медленные сцены из фильмов и равномерные заливки, и доработанную версию, названную "DivX Fast Motion", кодировавшую лучше быстрые сцены и "зашумленные" записи.

Летом 2000 года в кодек была включена поддержка формата а-ля WMA, кодировавшего звук на низких битрейтах чище, чем mp3, правда с ограничением потока 64 кбит для 44 кГц/стерео. Аудио кодек был назван DivX audio, а версия видео кодека была названа DivX 3.11a и являлась последней версией DivX из серии 3.хх. Авторы больше не захотели заниматься с ним, считая дело закрытым и вполне коммерческим, начав долбить золотую жилу. Но об этом чуть позже.

Технология.

DivX принадлежит к семейству кодеков из серии MPEG-4. Это конечно не полнокровный MPEG-4, в стандарт которого входит уйма приятностей. Кроме уже привычных нам субтитров, нескольких потоков разноканального звука, стандарт MPEG-4 поддерживает интерактивность, многослойность видео, графику поверх видео и пр. А DivX, как и его отец, ASF (WMF), предназначен изначально для передачи видеоданных (телеконференции, трэйлеры фильмов) со звуком, по среднескоростным сетям Интернета и просмотра этих видеоданных на компьютере. Отсюда вытекают его упрощения и ограничения, которые некоторые злопыхатели пытаются ставить в вину всему стандарту MPEG-4. Дескать и жмет он слишком сильно и искажений больше, чем у MPEG-2 (DVD), и субтитров нет, и интерлейса записать нельзя...

Исходя из задач в упрощенном формате оставили такие параметры - как у всех нормальных MPEG кодеков у DivX есть ключевые кадры (КК), по-аглицки - Key Frames (KF), в которых записывается основная информация о видеопотоке и дельта кадры (ДК), по-аглицки - Delta Frames (DF), в которых, для уменьшения потока (массы файла), записываются только изменения по отношению к предыдущему кадру. Следовательно мы пришли к краткому описанию серии MPEG стандартов: MPEG - это формат, который сжимает некий (аудио, видео etc.) поток на основе удаления излишней информации. Как это выглядит на простом примере показано на рис.1.

Совершенствование технологии.

LM и FM.

Первым усовершенствованием изначального кода M$ была попытка сделать кодек для быстрых сцен. Оригинальный код и его вскрытый собрат давали сильную грязь на местах быстрого сдвига объектов, так как видимо были в основном расчитаны на неподвижно сидящего человека перед камерой для телеконференции и его доработали, получив кодек DivX Fast Motion (FM). Это позволило кодировать фильмы с быстрыми сценами. Кодер же, изначально полученный из M$ варианта, был назван соответственно Low Motion (LM) - рис.2.

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

FM, в отличие от LM, старается зажать видео информацию по максимуму, не обращая внимания на заданный уровень, и в результате более-менее ровные заливки (стена, небо, лицо крупным планом) превращаются у него в мозаику, несмотря на то, что поток при этом меньше заданного в десятки раз! Простой пример - концерт великого тенора Паваротти. Очень статичная картинка. Конечно ее нужно цифровать только через LM, но ради эксперимента зададим кодирование кодеком FM с потоком 3000 кбит - очень высокий поток, качества DVD. И получаем результат, посмотрите на увеличенное лицо мастера Лучиано (рис.3). К чести FM надо сказать, что качество движущихся объектов и сложных сцен он кодирует все же чище, чем LM.

ММ4.

Понятно, что практически нет фильмов, включающих только быстрые или только медленные сцены. Возникла идея
чередовать кодеки, кодируя разные части фильма разными кодеками - медленные сцены с помощью LM, а быстрые с помощью FM, благо, что декодер для обоих кодеров был один. Технология получила название Mixed MPEG-4 (MM4), или смешанное кодирование.

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

Сначала микширование ММ4 происходило вручную - фильмы, пожатые разными кодеками, просматривались в какой-то программе (скажем Virtual Dub), сравнивались и выискивались фрагменты, лучше пожатые одним из кодеков, составлялась таблица КК, по которой затем нарезался из двух разных вариантов целый фильм. После этого накладывался звук. Надо сказать, что не всегда в ММ4 применяется кодирование именно двумя разными вариантами кодека (LM и FM), иной раз можно получить гораздо лучшее качество фильма, даже если закодировать фильм одним кодеком (скажем LM), но с разными битрейтами (для быстрых сцен поток повыше, чтобы ДК могли включать максимум изменений без пропуска кадров, а для медленных сцен поток пониже, т.к. ровные фоны и слабые сдвиги LM сжимает намного лучше, оставляя при этом превосходное качество картинки).

Через некоторое время, в ноябре 2000, появились программы, которые позволили автоматизировать процесс ММ4, задав установки либо для получения минимального размера файла для фильма, либо наоборот - максимального качества. Некоторые из них позволяли проследить процесс вручную. Это были китайская программа MakeFilm TNG (by MI-CHI) и немецкая Project DivX (by Joern Thiemann). Их внешний вид можно увидеть на рис.4.

Немецкий Project DivX был более наглядным (можно видеть рядом на экране оба варианта фильма), содержала автоматику (через обработку статистики кадров фильма в таблице Oracle с последующим сравнением на качество с оригиналом), позволял проделать процесс вручную (т.к. никакая автоматика не заменит субъективный взгляд человека на значимость артефактов), а также имел возможность локализации (отдельно лежал текстовый файл сообщений программы). Прожект позволял задать желаемый размер конечного файла для автоматической выборки, что было немаловажно для тех, кто хотел вписаться в размер CD и предсказывал размер результирующего файла при ручной выборке. В результате Project прожил немного дольше, чем MakeFilm. Оба проекта вышли первый и последний раз в конце ноября и авторами похоже больше не поддерживались.

VKI.

Конечно применение технологии ММ4 позволило существенно улучшить картинку, но была еще одна серьезная проблема, аппендикс, доставшийся кодеку от отца. Это была "грязь", "артефакты" на смене сцен. Первоначальный вариант кодека M$ и его детей имели опцию при кодировании - задание временного интервала между КК. Интервал задавался в целых секундах (от 1 до 9999), обычно применялась 1 секунда, чтобы иметь возможность нарезки фрагментов как можно ближе к сменам сцен. А парадокс заключается в том, что увеличение ключевого интервала может дать некоторое улучшение картинки при том же потоке данных.

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

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

И вот в декабре 2000 выходит заплатка к DivX 3.11 - "VKI patch" (Virtual Keyframe Interval), которая сильно облегчила жизнь, расставляя ключевые кадры не только через заданный интервал в секундах, но и в местах смены сцен (просто проверяя массу ДК и сравнивая ее с массой предыдущего КК - если дельта кадр оказывался слишком тяжелым, его заменяли на ключевой), при этом скорость кодирования практически не изменилась! Патч вышел для обоих вариантов кодека и устанавливался простой заменой соответствующих dll в каталоге systems.

Результат превзошел все ожидания. Простая, казалось бы, мысль - установка лишних ключевых кадров в наиболее сложных местах обеспечивала резкий подъем качества. При этом размер файла иногда даже уменьшался! Это зависело от того, что один ключевой кадр заменял собой несколько "тяжелых" дельта кадров. Теперь ключевой интервал можно было устанавливать хоть в 3 секунды (как в установках по умолчанию в патче), а хоть и в 999 секунд - ключевые кадры сами ставились в нужных местах, при этом оставалось гораздо больше места на дельта кадры, что давало дополнительное повышение качества! Это была революция в кодировании DivX.

Как же отнеслись программы ММ4 к этому новшеству? По разному. MakeFilm просто отказался работать. Это случилось потому, что для проверки идентичности двух файлов, закодированных разными способами, программа сравнивала в том числе количество КК в обоих источниках. А при кодировании разными VKI кодеками количество КК в файлах, закодированных вроде бы с одного источника, очень часто различаются. В чем же дело? А дело в том, что задавая разный уровень потока для двух вариантов фильма, мы провоцировали кодек по разному считать массу дельта кадров, и кроме того, ключевые кадры тоже сжимаются при этом по разному. Как следствие, в LM вариантах количество ключевых кадров было несколько больше. Ну а так как MakeFilm не имел развития, ошибка в проверке идентичности параметров файлов полностью лишила его работоспособности.

Project DivX тем не менее сохранил свою значимость для ММ4 кодирования. Несмотря на различие в количестве ключевых кадров, он по прежнему позволял составлять таблицу ключевых мест (таблица КК, по которым производилась нарезка фрагментов из двух файлов) и затем автоматически составлял из нужных фрагментов целый фильм. Почему же ему не мешало различие в количестве КК? А дело вот в чем. Переход на следующий ключевой кадр в Project осуществляется по FM варианту, в котором ключевых кадров должно быть меньше, и "лишние" ключевые кадры LM варианта, попавшие в этот фрагмент, просто не замечались программой!

Frame server.

Кодирование DVD в DivX представляет собой задачу из нескольких этапов. Некоторые программы позволяют объединить эти этапы, другие имеют больше настроек и удобнее на каком-то одном этапе. Самая популярная программа кодирования - Virtual Dub, к сожалению совершенно не подозревает о существовании формата MPEG-2 (DVD), и для кодирования в Дубе (а он позволяет накладывать на видео различные фильтры, подрезать кадр или изменить его размер) сначала приходится подготавливать видео различными способами.

Первый способ - это закодировать видео на очень высоких битрейтах, для минимума искажений изначального материала, а затем уже перекодировать его еще раз в Дубе. Это отнимает время, но позволяет сразу создать копию с хорошим качеством, которую можно затем перекодировать на более низкие битрейты или другим кодеком для последующего микширования с помощью технологии ММ4.

Второй способ - воспользоваться фрэймсервером. Это программа, которая является посредником между MPEG-2 (VOB файлом) и программой кодирования - она передает в программу кодирования кадры из исходного видео. Это позволяют VFAPI и plug-in для FlasK MPEG - avisynth. В самом VDub есть возможность фрэймсерва, скажем можно использовать его фрэймсерв для передачи кадров из Дуба в Project Divx.

Кодирование ММ4 в один проход.

В декабре 2000 появился еще один конкурент первых двух автоматических ММ4 программ - модификация Virtual Dub MM4. Автор этого хакнутого варианта Дуба использовал новую технологию в ММ4. Появилась возможность задать в одной программе нужные потоки для LM и FM (или для двух LM с высоким и низким битрейтом), и уровень потока, при котором кодирование переходило с одного кодека на другой. Сжатие всего фильма проводилось автоматически и за один раз, что было очень удобно и уменьшало количество времени примерно в полтора раза. Программа захватывала в буфер несколько кадров, проверяла, насколько хорошо они сжимаются, и если поток превышал норму, переходила на другой кодек. Аналогично, если поток был ниже порога, переходила обратно на первый кодек. При этом в течение кодирования можно было увидеть на графике моменты перехода (рис.5). К сожалению совершенно потерялась возможность подогнать готовый файл под размер CD - только перекодируя все заново с другими настройками можно было подобрать нужный размер файла.

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

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

К сожалению автор этого прогрессивного варианта не подписался, могу только констатировать его национальность по слову "Abbrechen", оставшемуся в одном из диалогов Дуба. В описании на свой хакнутый вариант последней строкой он признался в своих программистских способностях. Дословно: "Last recommendation: use the regular VirtualDub to edit your AVI files, this one could be fucked up by my hacks". Занавес.

Усложненный ММ4 в несколько кодеков.

В феврале 2001 появилась программа FairUse (рис.6), позволяющая кодировать сразу в несколько вариантов кодека (2-10), подбирая нужный поток для заданного качества и конечного размера файла. Кроме того, имелась некая проверка качества кодирования, посредством сравнения всех кодируемых вариантов с оригиналом. Программа содержала свои собственные, хакнутые и доработанные варианты кодека DivX, которые, по мнению автора, должны были расставлять ключевые кадры более прогрессивным способом.

FU позволяла кодировать прямо с DVD, предварительно рипая его на винт в своем собственном формате, требовала на диске место под рип DVD и все кодируемые варианты (т.е. 2-10 раз по 600 Мб), сразу могла сделать обрезку кадра и деинтерлейс, и могла вставить субтитры из VOB файла прямо в кадр. Она имела свой wizard, помогающий настроить параметры кодирования и была полностью автоматической - настроил и выключил монитор, иди спать, программа сама все закодирует, выберет, порежет и сохранит нужный вариант.

Интересный способ представления потока видеоинформации был использован автором - kbit/frame. И действительно, при обычном способе задания потока, kbit/sec, не учитывается количество кадров в секунду, а между тем, при 30 кадрах на каждый кадр упадет гораздо меньше информации, чем при 24 кадрах! Об этом обычно никто не задумывается, но качество картинки при одинаковом потоке у 24 кадрового фильма будет выше.

Ее большим недостатком было то, что автор так и не соизволил вставить поддержку кодирования с винта, для случая, когда DVD уже списан на винт другой программой и отдан. Вторым недостатком была тяжесть процесса - FU полностью отжирала все ресурсы машины, параллельно нельзя было работать, машину приходилось оставлять на время кодирования. Третьим недостатком для некоторых было время кодирования - время увеличивалось в несколько раз, по сравнению с классическими способами. Но полностью автоматический режим конечно отнять было нельзя, и качество кодирования сразу в несколько вариантов тоже.

SBC и кодирование в два прохода.

Лавры FairUse не давали покоя другим авторам, и серия Dub MM4 была продолжена в апреле 2001 новым продуктом - Nandub (by Nandos systems). Новая хак-версия суперпопулярной программы Virtual Dub (by Avery Lee), должна была дать, по мнению автора хака, "Продвинутый контроль над битрейтом" (Smart Bitrate Control). С одной стороны автор америку не открывал - использовались технологии, уже опробованные за несколько месяцев. Это был ММ4 - его вариант, когда используется несколько кодеков в один проход с выбором порога перехода.

Главным же достоинством этого хакнутого варианта стала возможность кодирования в два прохода. Конечно при этом увеличивалось время кодирования, но качество при очень сильном сжатии могло заметно улучшиться, а кроме того, решалась очень важная проблема - подогнать размер файла точно под размер компакт-диска. Как же это происходит? За первый проход программа собирает файл статистики, насколько сильно фильм сжимается разными кодеками с разными установками и оценивает по некоторым параметрам качество получаемого материала. Вторым же проходом осуществляется собственно кодирование по данным файла статистики.

К сожалению, автор внедрил столько новых опций в свой продукт, при этом используя одному ему понятную терминологию, что его изучение и использование, ввиду полного отсутствия какого-либо описания превратилось в игру Что-Где-Когда. Сам автор извинялся примерно в следующем стиле: "Sorry guys, I haven't had a minute to prepare a decent documentation in the past few days and I feel I have to rush a bit the public release of this software because it seems many people are waiting for it. So, it goes out as is." В общем, звиняйте хлопци, времени нету, нехай плывет самотеком, сами разберетесь. Большинство пользователей тогда оттолкнуло именно это безмерное усложнение и без того уже сложного процесса кодирования. Хотя многие честно пытались разобраться.

Программа продолжала развиваться и на настоящий момент содержит несколько полезных возможностей, в том числе вставки различного типа звука в AVI и поддерживает двухпотоковое аудио. К чести автора надо сказать, что он упростил свой Smart Control, и сделал настройки более доступными. На данный момент это наиболее популярная программа сложного кодирования.

Divx 4.

Пока шло совершенствование технологии, те, кто заварил эту кашу, усиленно хотели хорошей жизни. Что же происходило с авторами кодека?

В 2000 году бывший администратор MP3.com и стратегический консультатнт InterVU, Джордан Гринхол нашел хакера Джерома Рота (Gej) и предложил создать компанию на основе его, уже популярной (12 млн. закачек с сайта), DivX технологии. В мае 2000, при поддержке третьего основателя, Джо Бездека, была создана компания DivXNetworks, Inc. В течение лета компания набрала команду и открыла сайт www.projectmayo.com, посвященный кодеку и новым планам на жизнь - коммерциализации проекта. Начался активный поиск инвесторов, и уже в сентябре авторам выпали первичные инвестиции (Series A) на сумму 5,6 млн. долларов.

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

В мае 2001 компания открыла сайт divx.com, на котором собрались новости Divx технологии, последние версии кодека, наиболее популярные программы для него, форум и примеры видеоклипов. Про старый вскрытый кодек 3.хх конечно же полное молчание, как будто никто ничего и не вскрывал.

Сырой 4-й кодек был выпущен в начале 2001 года, содержал интересные фичи и множество глюков. Он поддерживал двухпроходное кодирование (с созданием за первый проход файла статистики сложности), деинтерлейс, сжатие по битрейту и по процентному качеству, естесственно переменный ключевой интервал, возможность задания ключевого интервала в кадрах, а не в секундах, возможности подстройки параметров квантизации и параметров подсчета среднего битрейта. В августе 2001 был выпущен релиз (рис.7), который мирно продолжал глючить.

Компания объявила своим приоритетом создание программного обеспечения DivX Open Video System(tm) (OVS) для поставки закодированного видео конечному пользователю (video-on-demand, VOD). Причем для этого будут использованы новейшие security технологии для борьбы с пиратством. За что боролись, на то и напоролись. DivX, вроде бы "Open source", теперь будет вставлять в кодируемый или транспортируемый фильм скрытые коды авторизации...

В общем-то конечно это дело компании, что они там объявляют, волноваться особенно не о чем, наше дело - правое. Даже если кодек перестанет быть free, его все равно вскроют и будут использовать для переписи DVD. Конечно пока эти DVD сами не станут по 5 копеек пучок. А что же нам дают последние версии кодека?

Кодек 4.х не претерпел крупных изменений с бета-версий, хотя за полгода вышло уже 12 релизных версий - на сегодняшний день последняя версия кодека называется DivX 4.12. Многие глюки кодека идут с фильмами, закодированными старым, 3.хх кодеком. Скажем в некоторых плэерах изображение может просто перевернуться вверх ногами. Поэтому рекомендации лучших собаководов - отвечать "нет" на вопрос "Проигрывать ли старые 3.хх фильмы новым кодеком?" при установке кодека и иметь установленную 3.11 версию для старых фильмов. Иногда возникают проблемы со звуком при установке DivX 4.

Выводы.

Кодек DivX, с применением последних технологий кодирования, позволяет сжимать оригинальный DVD диск в 10 и более раз, вмещая его на 1-2 компакт диска, и оставляя при этом качество фильма на очень хорошем "потребительском" уровне - намного лучше VCD или VHS. И это качество вполне приемлемо для просмотра на среднем домашнем компьютере или для вывода с компьютера на телевизор. При этом фильм может содержать оригинальный DVD звук с Dolby Digital 5.1 и субтитры на нескольких языках. А так как кодек является free, по крайней мере старые его версии (какая может быть лицензия на хакнутую программу?), то зеленая дорога открыта - кодируйте на здоровье!


(c) 02/2002, Сибирский Лихоман http://lihoman.ru
опубликовано в редакторском варианте
в ХАКЕРспец 4[17]2002
Следующая статья раздела
Возврат на список статей