Запись собственных DVD в Linux
Автор: (c) 2002 Chris Stoddard
Перевод: (c) 2003 Юрий Прушинский


В этой статье речь пойдёт о том, как сделать собственный DVD-диск (используя Linux и DVD+RW или DVD-RW привод), совместимый с большинством стандартных плейеров.

Содержание

Вступление

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

Необходимое оборудование:

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

Необходимое ПО:

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

У dvd+rw tools нет Makefile, поэтому собрать "бинарники" можно следующим образом:

    gcc dvd+rw-format.c
    mv a.out dvd+rw-format
    cp dvd+rw-format /usr/local/bin
    gcc growisofs.c
    mv a.out growisofs
    cp growisofs /usr/local/bin

Кодирование и запись видео:

Одним из самых ответственных шагов является правильный захват видео: нужно корректно указать размер видео и частоту смены кадров. Следующая команда для записи видео использует стример, который входит в состав xawtv:

  streamer -n ntsc -t 60:00 -s 720x480 -r 30 -o stream.avi -f mjpeg -F stereo -c /dev/video0

Здесь параметр -n указывает формат, так что если вы используете PAL, то измените ntsc на pal. Параметр -t устанавливает время записи в минутах, -s указывает размер видео, в США мы пользуемся NTSC, который использует размер видео 720x480, если же вы используете PAL, то смените размер на 720x576. Параметр -r определяет частоту смены кадров, для NTSC нужно выставить значение 30, для PAL - 24. Ну, и наконец, -c определяет видео устройство (измените его, если это необходимо). Остальные параметры изменять не нужно.

Следующее, что нам необходимо сделать, это правильно закодировать видео и аудио информацию в какой-нибудь удобоваримый для DVD-плейера формат. Для этого мы воспользуемся утилитами из mjpeg-tools. Следующая команда вытаскивает весь звуковой сигнал из avi-файла и кодирует его в mp2 audio. Ключ -V здесь нужен для совместимости с форматом VCD:

  lav2wav +p stream.avi | mp2enc -V -o audio.mp2

Далее вытаскиваем видео и кодируем его в mpeg. Продолжительность этого процесса напрямую зависит от мощности вашей системы. Здесь для нас важны опции -f 8, которая делает видео совместимым с DVD, а также -n n, что означает "использовать NTSC", соответственно. Смените на -n p для PAL:

  lav2yuv +p stream.avi | mpeg2enc -n n -f 8 -s -r 16 -o video.m1v

Теперь надо объединить два получившихся закодированных файла. При этом не забудьте про ключ -f 8 для совместимости с DVD:

  mplex -f 8 audio.mp2 video.m1v -o complete.mpg

Чтобы наш диск читался на любом DVD-плейере, его структура ДОЛЖНА быть идеальной, так что убедитесь что вы выполнили следующие команды именно так, как показано:

  mkdir dvd
  mkdir dvd/VIDEO_TS

Далее создаем IFO файл, содержащий Table of Content:

  tocgen > dvd/VIDEO_TS/VIDEO_TS.IFO

Теперь копируем наш кодированный видео файл в структуру директорий диска и даем ему нужные атрибуты:

  cp complete.mpg dvd/VIDEO_TS/VTS_01_1.VOB
  chmod u+w dvd/VIDEO_TS/*.VOB

IFO и BUP файлы содержат информацию для DVD-плейера, определяющую свойства видео файла, который он пытается воспроизвести. Утилита ifogen анализирует видео и вытаскивает требуемую информацию. Для создания необходимых файлов выполните следующую команду:

  ifogen -f dvd/VIDEO_TS/VTS_01_1.VOB > dvd/VIDEO_TS/VTS_01_0.IFO
  (cd dvd/VIDEO_TS; for i in *.IFO; do cp $i basename $i .IFO.BUP; done)

Далее надо создать iso образ, который можно будет записать на DVD-диск. Только убедитесь, что вы воспользуетесь при этом той версией mkisofs из состава dvdrtools, которая поддерживает файловую систему DVD:

  mkisofs -dvd-video -udf -o dvd.iso dvd/

Ну, и, наконец, приступаем к записи нашего диска. Если вы пользуетесь приводом DVD+RW старого поколения, то сначала болванку диска нужно отформатировать. Для этого выполните следующие команды и замените srcd0 на имя вашего пишущего устройства:

  dvd+rw-format -f /dev/srcd0
  growisofs -Z /dev/srcd0=dvd.iso

Если же у вас новый привод DVD-RW, то это делать необязательно -- это выполнит сама утилита dvdrecord:

  dvdrecord -dao speed=2 dev=0,0,0 dvd.iso

Возможные проблемы с синхронизацией аудио сигнала

Наиболее часто возникают проблемы при синхронизации аудио сигнала. При этом вам надо попробовать настроить ваш жесткий диск - включить 32 bit I/O и DMA:

  hdparm -c 1 -d 1 /dev/hda

Далее, загрузить драйвер bttv с опцией gbuffers=10:

  modprobe bttv gbuffers=10

По идее это должно решить любые проблемы с синхронизацией звука. Если это не помогло, то попробуйте использовать опцию -O n при использовании утилиты mplex. Она позволяет задерживать видео на n миллисекунд. Недостаток этого в том, что все надо делать методом проб и ошибок, и довольно часто на обработке объединенного видеофайла ifogen вылетает (segfault). Кроме этого, можно попробовать записать видео в меньшем размере, скажем в 352x240. Для этого воспользуйтесь yuvscaler из комплекта mjpeg-tools и уменьшите исходный размер с 720x480. Но лично я этого никогда не пробовал.

Заключение:

Весь вышеописанный процесс, конечно, не позволит вам записать DVD такого же качества, как и на лицензионных дисках, которые продаются в магазинах, хотя качество видео будет в основном зависеть от устройства захвата видеосигнала или от самого источника видеосигнала, так что используйте наилучшие настройки при записи на видеокассету, с которой потом будете переписывать изображение на DVD. Сам процесс может занять несколько часов, так что я написал скрипт, который делает всё за меня, пока я занимаюсь своими делами или сплю. Учтите, что 100 минут видео займет около 11 ГБ в несжатом виде, 2 ГБ после сжатия и 1ГБ в виде iso образа.

Текстовая версия скрипта make-dvd.sh
-----make-dvd.sh-----
#!/bin/sh

# Cleans out any left over files and makes the necessary directories
rm -r -f dvd video dvd.iso
mkdir dvd
mkdir dvd/VIDEO_TS
mkdir video

# Changes the channel on the TV tuner card
v4lctl setstation 3
# Records the video stream
streamer -n ntsc -t 60:00 -s 720x480 -r 30 -o video/stream.avi -f mjpeg -F stereo -c /dev/video0

# Encodes the video stream
lav2wav +p video/stream.avi | mp2enc -V -o video/audio.mp2
lav2yuv +p video/stream.avi | mpeg2enc -n n -f 8 -s -r 16 -o video/video.m1v
mplex -f 8 video/audio.mp2 video/video.m1v -o video/complete.mpg

# Builds DVD image from the encoded video
# This portion of the script was lifted directly from
# the writedvd script which comes with the dvdauthor tools
tocgen > dvd/VIDEO_TS/VIDEO_TS.IFO
cp video/complete.mpg dvd/VIDEO_TS/VTS_01_1.VOB
chmod u+w dvd/VIDEO_TS/*.VOB
ifogen -f dvd/VIDEO_TS/VTS_01_1.VOB > dvd/VIDEO_TS/VTS_01_0.IFO
(cd dvd/VIDEO_TS; for i in *.IFO; do cp $i basename $i .IFO.BUP; done)
mkisofs -dvd-video -udf -o dvd.iso dvd/

# Burns the DVD for 1st Generation DVD+RW
# Comment out the dvd+rw-format line if the disc is already formated and
# contains no data.
# Comment these two lines out if you are using a newer drive
dvd+rw-format -f /dev/srcd0
growisofs -Z /dev/srcd0=dvd.iso

# Burns DVD for more modern DVD formats like DVD-RW
# Uncomment this line if you are using a newer drive
#dvdrecord -dao speed=2 dev=0,0,0 dvd.iso
-----make-dvd.sh-----

Copyright (C) 2002, Chris Stoddard.

Hosted by uCoz