В этой статье речь пойдёт о том, как сделать собственный DVD-диск (используя Linux и DVD+RW или DVD-RW привод), совместимый с большинством стандартных плейеров.
Содержание
- 1. Вступление
- 2. Необходимое оборудование
- 3. Необходимое ПО
- 4. Кодирование и запись видео
- 5. Возможные проблемы с синхронизацией аудио сигнала
- 6. Заключение
Вступление
Меня всегда поражает насколько просто в Линуксе совершенствовать и развивать уже начатые кем-то проекты. Запись собственных DVD в Линукс тоже попадает в категорию подобных задач - вроде бы все инструменты для этого есть, и в информации на эту тему недостатка не наблюдается, но нигде до сих пор нет полного документа, описывающего весь процесс "от и до". Конечно, запись DVD под Линукс находится еще во "младенчестве", нет ещё продвинутых средств редактирования с поддержкой меню и других функций, но на данном этапе уже вполне возможно записывать и сохранять домашнее видео или ТВ-передачи в формате DVD. Я не буду рассматривать редактирование видео, а просто опишу процесс записи сигнала с ТВ или с видеокассеты на DVD.
Необходимое оборудование:
Я также не хочу вдаваться в тонкости установки и настройки необходимого железа, если вы не знаете как его устанавливать, то обратите внимание на следующие статьи, надеюсь, они вам помогут.
- Устройство для захвата видео. Лично я пользуюсь картой Hauppauge WinTV PCI, карты с ТВ-тюнером достаточно дешевы и купить их можно практически в любом компьютерном магазине. К тому же они довольно хорошо поддерживаются в Линуксе. Естественно, есть и дорогие аналогичные устройства, которые позволяют захватывать видео с высоким качеством, но очень немногие из их числа будут работать в Линуксе. См. статью "Видеоприложения на Вашем Linux" на Russian Linux Gazette.
- Привод DVD+RW или DVD-RW. Я пользуюсь старым приводом Ricoh MP5120A DVD+RW, который я приобрел за 150 долларов. К счастью, подобные приводы устанавливаются аналогично стандартным приводам CD-RW. Кроме этого желательно, чтобы наш привод имел возможность проигрывать DVD-диски. Поэтому убедитесь, что ваш DVD-плейер поддерживает формат дисков, в котором вы собираетесь записывать их на своем пишущем устройстве. См. статьи "Просмотр DVD в Linux" на Russian Linux Gazette и "Запись CD на приводе ATAPI CDR Mini-HOWTO" на Linux Gazette.
- Быстрый ЦП (процессор) и большой жесткий диск. У меня лично Athlon 1600XP, RAM 384 MB и 40 GB жесткий диск. Я бы наверное и не рискнул заниматься всем этим делом, если бы система была слабее 1Ghz и меньше 20Gb свободного места на диске.
Необходимое ПО:
Каждый из этих пакетов имеет свой способ и особенности установки, так что пожалуйста, изучите инструкции по установке для каждого из них.
- xawtv понадобится нам в качестве стримера, который мы будем использовать для записи видео: xawtv
- mjpeg-tools понадобятся для кодирования записанного видео в формат DVD: mjpeg-tools
- dvdauthor является основной из всех других используемых программ, без нее у нас ничего не получится. Эта программа генерирует IFO файлы, которые необходимы для DVD-плейера. Устанавливается она довольно просто - соберите командой make, и затем скопируйте получившиеся "бинарники" в /usr/local/bin: dvdauthor
- dvdrtools, утилита-аналог cdrtools, которая потребуются для записи на новые DVD-RW приводы: dvdrtools
- dvd+rw tools понадобятся для записи на старые устройства DVD+RW, так что они нужны только обладателям первого поколения приводов DVD+RW: dvd+rw tools
У 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-----