Ogg Theora

Ogg
формат контейнера для мультимедиа данных. Может включать аудио данные в формате Vorbis или FLAC, а также видео данные в формате Theora.
Theora
свободный, открытый и бесплатный видео кодек, по области применения аналогичный MPEG-4.

Мы будет перекодировать фильм, записанный на DVD в Ogg Theora (звук будет перекодирован в Vorbis) с целью поместить его на один CD диск. Перекодировка будет производиться с помощью программы ffmpeg2theora. В качестве операционной системы используется Kubuntu Feisty Fawn.

FFmpeg
набор библиотек и кодеков для чтения и записи мультимедиа файлов во множестве форматов. Эти библиотеки используются "движками" плееров, таких, как xine. "Движки", в свою очередь, используются проигрывателями, такими как Kaffeine или Amarok. Получается, что если некоторое видео проигрывается в вашей системе, вы сможете перекодировать его.
ffmpeg2theora
простая консольная программа, читающая файл с помощью FFmpeg и перекодирующая его в Ogg Theora и Vorbis.

Внимание! Копируя 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
Creative Commons License This work is licensed under a Creative Commons Attribution-Share Alike 3.0 License.