Мы будет перекодировать фильм, записанный на DVD в Ogg Theora (звук
будет перекодирован в Vorbis) с целью поместить его на один CD диск.
Перекодировка будет производиться с помощью программы
ffmpeg2theora
.
В качестве операционной системы используется Kubuntu Feisty Fawn.
Внимание! Копируя DVD, вы можете нарушать действующее законодательство.
В Kubuntu ffmpeg2theora
устанавливается
в одноименном пакете. В зависимостях значатся libavcodec0d
и libavformat0d
- это и есть библиотеки FFmpeg. А также
libogg0
, libtheora0
и
libvorbis0a
- это библиотеки для создания Ogg Theora/Vorbis.
DVD проигрыватели играют фильм с DVD, не монтируя диск. Для наших целей диск надо смонтировать.
$ mount /cdrom
Видео хранится на DVD в подкаталоге video_ts
в файлах вида
vts_XX_Y.vob
. XX
- это номер видеофрагмента.
Обычно DVD диск состоит из нескольких фрагментов: меню, реклама,
несколько фильмов... Большие фрагменты (фильмы) размещаются
в нескольких файлах (часто размер одного файла ограничен 1 Гбайтом).
Y
- это номер файла, составляющего фрагмент.
Необходимо найти файлы, составляющие фильм, который мы собираемся
перенести на CD. Меню переносить нет необходимости, все равно
субтитры и дополнительные звуковые дорожки не поместятся. Вероятно,
можно будет отбросить начальные файлы, составляющие фрагмент, они
могут содержать заставки с логотипами издателей диска. Проще всего
отобрать нужные .vob
файлы, поочередно открыв их
в видеопроигрывателе, например, в Kaffeine. Предположим, что мы
отобрали файлы c vts_04_1.vob
по vts_04_7.vob
.
В простейшем случае ffmpeg2theora
запускается
с единственным параметром - файлом, который необходимо перекодировать.
Результирующий файл будет называться так же, но с расширением
.ogg
. Так как DVD монтируется только для чтения,
необходимо указать результирующий файл с помощью ключа
-o
. Параметры кодирования выбираются умолчательные.
$ ffmpeg2theora /cdrom/video_ts/vts_04_1.vob -o /tmp/video.ogg Input #0, mpeg, from '/cdrom/video_ts/vts_04_1.vob': Duration: 00:28:22.2, start: 0.280000, bitrate: 5045 kb/s Stream #0.0[0x1e0]: Video: mpeg2video, yuv420p, 720x576, 7500 kb/s, 25.00 fps(r) Stream #0.1[0x80]: Audio: ac3, 48000 Hz, 5:1, 384 kb/s Stream #0.2[0x81]: Audio: ac3, 48000 Hz, 5:1, 384 kb/s Pixel Aspect Ratio: 1.42/1 Frame Aspect Ratio: 1.78/1 Resize: 720x576 ...
Нам нужно уместить фильм на CD, т.е. сжать до 700 Мбайт. Для этого нужно выбрать звуковую дорожку (в этом фильме их две), определиться с необходимым качеством звука, расчитать допустимый битрейт для видео.
По выводу программы видно, что в нашем примере две звуковые дорожки.
Нужная дорожка выбирается с помощью ключа --audiostream
.
В качестве параметра ключа нужно указать номер дорожки - цифру после
точки, т.е. 1 или 2 в нашем случае. Получается:
$ ffmpeg2theora /cdrom/video_ts/vts_04_1.vob -o /tmp/video.ogg \ --audiostream 2
Нужную дорожку следует выбирать экспериментально. Запустите процесс
кодирования, выбрав одну из дорожек. Прервите процесс
(нажав Ctrl+C
). Получившийся неполный OGG
вполне нормально открывается. Послушайте и определитесь, та ли
звуковая дорожка выбрана.
В данном случае возникло интересное затруднение:
$ ffmpeg2theora /cdrom/video_ts/vts_04_2.vob -o /tmp/video.ogg Input #0, mpeg, from '/cdrom/video_ts/vts_04_2.vob': Duration: 00:26:22.7, start: 1702.520000, bitrate: 5426 kb/s Stream #0.0[0x1e0]: Video: mpeg2video, yuv420p, 720x576, 7500 kb/s, 25.00 fps(r) Stream #0.1[0x81]: Audio: ac3, 48000 Hz, 5:1, 384 kb/s Stream #0.2[0x80]: Audio: ac3, 48000 Hz, 5:1, 384 kb/s Stream #0.3[0x21]: Subtitle: dvdsub Stream #0.4[0x20]: Subtitle: dvdsub Pixel Aspect Ratio: 1.42/1 Frame Aspect Ratio: 1.78/1 Resize: 720x576 ...Вторая часть нашего фильма содержит звуковые дорожки в другом порядке (смотрите на идентификатор в квадратных скобках). Мы будем склеивать части и выбирать надо номер дорожки с нужным идентификатором в первой части. В нашем случае русская озвучка была с идентификатором
[0x81]
. В первой части это дорожка с номером 2, во
второй части - с номером 1. Далее необходимо использовать ключ
--audiostream 2
.
Качество звука можно задать двумя способами. Либо в "единицах качества",
числом от -2 до 10, задаваемым ключом -a
. Либо средним
битрейтом в килобитах в секунду, задаваемым ключом -A
.
Т.к. нам необходимо знать размер результирующего файла, воспользуемся
вторым способом. Можно смело задавать битрейт в два раза меньше
"приемлемого качества" для MP3. Например, для звука "CD качества"
(44 КГц, 16 бит, стерео) вполне достаточно будет 64 Кбит/с. Ogg Vorbis
весьма достойно ведет себя на низких битрейтах, и в данном случае
мы кодируем фильм, а не коллекцию музыки.
В данном фильме присутствует многоканальный звук. На CD он не поместится,
необходимо перекодировать в стерео. Делается это ключом -c
с параметром 2 (два канала).
Если звук для фильма не столь важен, можно урезать битрейт еще в два
раза, уменьшив частоту дискретизации звука. Например до 22050 Гц.
Делается это ключом -H
. Вот так: -H 22050
Для нашего фильма мы оставим частоту дискретизации оригинальной (48 КГц), урежем звук до двух каналов и будет сжимать со средним битрейтом 64 Кбит/с:
$ ffmpeg2theora /cdrom/video_ts/vts_04_1.vob -o /tmp/video.ogg \ --audiostream 2 -A 64 -c 2
Качество видео тоже можно задать либо в "единицах качества" - числом
от 0 до 10, заданным ключом -v
. Либо тоже битрейтом в
килобитах в секунду, задаваемым ключом -V
. Мы опять
воспользуемся вторым способом.
Видео должно занимать все оставшееся после звука место в наших 700 мегабайтах. Это надо расчитать. Можно воспользоваться калькулятором или простой электронной таблицей (ODS, 12Кб). Исходные данные: длина фильма (в секундах), размер файла (700 Мб), битрейт звука (уже определились, 64 Кбит/с).
Длину фильма можно увидеть, запустив на пробное кодирование каждый из намеченных файлов. Просуммировать указанные продолжительности и расчитать в секундах. В данном случае получилось 9886 секунд (лучше округлять в большую сторону), что составляет примерно 2 часа 44 минуты (длинный фильм).
Желаемый размер файла - 700 Мбайт, или 700 * 1024 = 716800 Кбайт. Битрейт, имеющийся у нас в распоряжении составляет (примерно): 716800 * 8 / 9886 = 580.05 Кбит/с (чтобы из байтов получить биты, надо умножить на 8). Из них 64 займет звук. На видео останется 516 Кбит/с. Это довольно мало, практика показывает, что для достойного качества битрейт видео должен быть более 700 Кбит/с. Но в данном случае остановимся на этом варианте.
Получаем:
$ ffmpeg2theora /cdrom/video_ts/vts_04_1.vob -o /tmp/video.ogg \ --audiostream 2 -A 64 -c 2 -V 516
И последний шаг. Необходимо соединить все части вместе и непосредственно
запустить процесс. Соединяем стандартной командой cat
,
а ffmpeg2theora
говорим читать входной файл из стандартного
ввода (в качестве имени файла указываем дефис "-
").
Окончательная команда имеет вид:
cat /cdrom/video_ts/vts_04_1.vob \ /cdrom/video_ts/vts_04_2.vob \ /cdrom/video_ts/vts_04_3.vob \ /cdrom/video_ts/vts_04_4.vob \ /cdrom/video_ts/vts_04_5.vob \ /cdrom/video_ts/vts_04_6.vob \ /cdrom/video_ts/vts_04_7.vob | \ ffmpeg2theora -o /tmp/video.ogg \ --audiostream 2 -A 64 -c 2 -V 516 -
Процесс занимает довольно продолжительное время (более 4 часов на Celeron-M 1.5 МГц). Размер результирующего файла составил 691 Мбайт, значит методика расчетов верна. Качество получилось довольно сносным, хотя (что естественно) заметно хуже оригинала.
В недостатки Ogg Theora запишем очень долгое открытие файла (по крайней мере в Kaffeine). А также полное отсутствие поддержки со стороны аппаратных DVD/MPEG-4/и.т.д. проигрывателей, будем надеятся, временное.
Удачи. И не забудьте переместить получившийся файл из каталога
/tmp
, Debian любит очищать этот каталог при перезагрузке.
Denis Nelubin, Sep 2007