DVD 2 MPEG4

Здесь я хотел бы рассказать, как я первый раз сжимал DVD-видео. Можно рассматривать как руководство к действию.

Внимание: делая рипы (копии) DVD дисков, распространяя их, вы можете нарушить закон об авторском праве. Я предупредил!

Цель: получить 700 Мб avi-файл, качеством ничем не уступающий пиратским рипам фильмов.

Приборы и материалы:

  • DVD фильм - мюзикл "Chikago", 1 час 48 минут, звук 48Khz стерео, 2 потока: оригинал и дубляж.
  • AtlonXP 1800+ с DVD-дисководом и сетью 100Мбит, 256мб RAM, Win2k SP2.
  • AtlonXP 2000+ (40 Gb HDD), 256мб RAM, Win2k SP2.
  • VirtualDubMod 1.4.11
  • Headac3e (ac3 -> wav)
  • DivX 5.03 Professional
  • WinAMP 2.80 + out_lame.dll + lame_enc.dll v3.93

Что такое DVD?

Получив в свое распоряжение DVD-фильм, я первым делом принялся исследовать его качество. Как не странно, в некоторых местах я сумел разглядеть что-то, похожее на макроблоки! Но естественно на экране телевизора об их видимости говорить нет смысла. Второе, я покопался в файлах на диске. Очевидно файлы .bop и .ifo являлись настройками для DVD-меню (так как данный формат специально разработан для DVD-плееров к телевизору, там нет почти никакой совместимости с компьютерными форматами). Далее я выяснил, что все видео хранится в .vob файлах, которые по сути и представляют MPEG2-поток. Их было 4 штуки, почти 1Гб каждый. При перетаскивании их на любой DirectSHow плеер система формирует граф из установленных декодеров - это сплиттер, который разделяет видео- и аудио-поток (demuxer), и дальше два фильтра для декодированию видео и звука. Сплиттер обычно находится в системе, а декодеры устанавливаются вместе с DVD-плеером. При проигрывании не отдельного файла, а диска (файл->открыть DVD) к этим фильтрам добавляется еще декодер главного меню, который так же изначально присутствует в системе (здесь и дальше это Win2k).

Расшарив DVD-дисковод в сети, фильм отлично смотрелся через сеть на компьютере без DVD-дисковода. Поставив на другом компьютере скачанные бесплатные DVD-декодеры и переписав .vob файлы, я начал сжимать...

Сжатие видео

Привычный инструмент - VirtualDub отказывался читать .vob файлы, ссылаясь на ошибку синхронизации потоков. Однако и в его справке сказано, что он не поддерживает .vob файлы. Выход нашелся в интернете - умельцы сделали из исходников VitualDub'а VitualDubMod, который не только их читал, но и обладал другими приятными способностями.
Еще нашлась программка dvd2avi которая делает то, что сказано в ее названии. В ней обнаружилась сложности: MPEG2 - формат, поддерживающий интерлейс, поэтому неизвестно какая скорость кадров должна быть у выходного видео. При декодировании .vob в 30 fps появлялся интерлейс на некоторых кадрах, а при декодировании в 25 его не было, но могли появляться пропущенные (dropped) кадры. Выбор: либо делать деинтерлейс с 30 fps, но это ухудшает качество других кадров, либо 25 fps (другого dvd2avi не предлагает). Зато есть возможность сохранения звука сразу из всех .vob файлов в один .ac3 (что он из себя представляет изнутри я до сих пор не разобрался), однако сложность с применением многопроходного сжатия заставила от нее отказаться.
VitualDubMod имеет встроенный декодер MPEG2, который при необходимости на ходу может делать ресайз, кроп и деинтерлейс. Но этими возможностями я пользоваться не стал, кроп и ресайз делался с помощью фильтров программы (а не декодера). Интерлейса после декодера видно не было, наверно он сам делал деинтерлейс или частота кадров была соответствующая (хотя это странно).
После нескольких экспериментов были выбраны следующие параметры:

  • видео: 640x368 (кроп черных бортов сверху и снизу, потом бикубик ресайз), 24 fps (без изменений)
  • кодек DivX 5.03 Professional, со следующими настройками:
    • 900Kbps
    • b-frames
    • multipass один раз
    • все остальные настройки выключены или по умолчанию.

Бикубик ресайз увеличивает четкость, следовательно ухудшает сжимаемость кадра, и если есть шум в видео, он также будет усилен, что тоже плохо. Поэтому обычно рекомендуют использовать линейный ресайз. Но меня не устраивала потеря четкости в видео без шума, поэтому я не стал следовать этому правилу, тем более что кодек прекрасно сжимал, и только в сценах с сильным движением были заметны макроблоки. Я исходил из уже имеющегося фильма, сжатым этим же кодеком. Однако несмотря на то, что площадь кадра в пикселях у него была меньше, при почти равной продолжительности (120 минут против 108), качество сжатия было хуже. Этот пример показывает, что каждое исходное видео при прочих равных параметрах должно сжиматься с разными размерами кадра (битрейт в силу одинаковой продолжительности такой же). Преимущество за большими площадями кадра, меньшими потерями деталей.

Сжатие звука

В итоге каждый .vob файл сжался в беззвучный .avi, и они потом склеились вместе. Качество сжатия оказалось на высоте, 590 метров почти кристально чистого видео. На звук осталось 110 метров, и исходя из этого определился его битрейт. 48Khz вместо 44Khz - потому что это мюзикл, хоть и с некачественным дубляжем. Оригинальный трек сжимался потом отдельно с максимальным качеством VBR, но записать его было уже некуда. Итак:

  • звук: 48Khz стерео, 120Kbps ABR MP3

Но перед тем как сжать звук, надо его сначала получить в виде .wav файла (WinAMP .ac3 не понимает). Поэтому была раздобыта софтинка по имени Headac3e, которая неизвестными мне двухпроходными (!!!) манипуляциями сделала PCM .wav файл. Дальше WinAMP с плагином out_lame (такой способ мне больше нравится, в отличии от командной строки, так как я могу на лету подключять эквалайзер и другие плагины).

Видео и звук слились опять воедино при помощи VitualDubMod, получилось ровно 700 Мб.

Результат и резюме

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

P.S.

Со времени написания этой статьи произошли небольшие измения:

  • Перед декодированием .vob файлы переписываются на винчестер и склеиваются (copy file_a.vob + file_b.vob [...] c:\temp\main.vob)
  • Вся работа производится только с помощью VirtulaDubMod 1.5.4.1 (появилась возможность записывать несколько звуковых дорожек, работа с vbr mp3).
  • Кодирование звука прямо из .vob в Lame mp3 с помощью утилиты BeSweet.
  • Есть возможность подключить к своему компьютеру "виртуальный" DVD дисковод, если машина работает в локальной сети (быстрой). Для этого надо примонтировать сетевой диск на сетвую папку, где нахидится содержимое диска.
*****
(c) kusaku 2003