DVD 制作
传统上,DVD 制作一直是一项昂贵的工作。功能齐全的专业应用程序可能花费数千美元,而较便宜的产品,如 Apple 的 iDVD,则具有任意的限制,大大降低了它们的实用性。一个新的开源项目 dvdauthor,正在将低成本、专业级 DVD 制作的可能性带给 Linux。虽然它尚未支持 DVD 规范的所有功能,但开发正在快速进行,并且每次发布都会添加新功能。本文将结合一个更成熟的开源工具包 mjpegtools,解释如何使用 dvdauthor 构建一个相对复杂的 DVD 应用程序——照片专辑。我们还将阐述 dvdauthor 当前支持的各种功能,以及如何使用开源工具构建几乎可以在所有 DVD 播放器上播放的 DVD-R。
DVD 由一个或多个视频标题集 (VTS) 组成,这些标题集包含 MPEG-2 视频流形式的视频信息。每张光盘最多可以有 99 个 VTS,每个标题集可以进一步细分为多达 99 个章节,从而允许 DVD 播放器跳转到视频流中的特定点。在每个 VTS 中,DVD 最多可以有八个不同的音轨和 32 个字幕轨道,观看者可以随意切换。菜单系统可以包含在标题集中,允许观看者在不同的字幕和音轨之间进行选择。一个可选的顶层菜单,称为视频管理器菜单 (VMGM),用于在不同的标题集之间导航。一个 VTS 可能包含一部故事片,另一个可能包含一部关于这部电影的纪录片,VMGM 允许观看者选择他们想观看哪一部。
DVD 格式并没有消除两种竞争广播格式 NTSC(主要在美国使用)和 PAL(欧洲和日本的标准)之间的差异。我住在英国,所以本文中使用的帧信息和分辨率细节是针对 PAL 系统的,但我会指出您需要注意的差异,并在出现时提供适用于 NTSC 光盘的适当设置。
DVD 规范包括高级功能,例如区域编码的概念、观看视频流不同角度的可能性以及使用 DVD 播放器提供的内置寄存器进行的简单计算。我对这些功能了解不多,本文也没有讨论它们。dvdauthor 邮件列表是获取更多信息的好资源。
在我们急于创建菜单、字幕和复用之前,最好用纸和笔勾勒出 DVD 的结构。专有的 DVD 工具提供了 GUI 系统来创建这种类型的结构,但 Linux 上 DVD 制作尚无此类工具可用。您很快就会看到,命令行工具有很多不同的选项,因此将您的想法写在纸上比试图将所有内容都记在脑子里要好。
我正在创建的 DVD 应用程序是一个照片专辑,使用了我去年在 UNC-教堂山分校留学期间拍摄的照片。为了简单起见,我在每个类别中只有六张照片。在纸上,我决定主菜单(VMGM 单元)应该有五个按钮,其中四个是简单的文本按钮(每个照片类别一个),外加一个解锁额外图片的秘密链接(秘密额外功能在商业 DVD 中很常见)和一个在后台播放的音乐曲目。四个常规按钮链接到四个菜单之一,每个部分一个。每个部分的菜单系统由两个菜单和一个音轨组成,带有幻灯片的精选预览图像、一个移动到下一组预览图像的按钮以及两个允许观看者观看完整幻灯片或返回主菜单的按钮。为了保持简单,照片幻灯片应与部分菜单在后台播放相同的歌曲。幻灯片结束后,观看者将被送回部分菜单。秘密链接是一个没有菜单的简短幻灯片,但它有两个不同的音乐曲目,观看者可以在视频序列播放时在两者之间切换。
为了防止事情搞混,我创建了下面的目录结构来组织文件。image 目录最终将保存完成的 DVD,而原始照片放在 photos/setN 目录中,视频文件放在 titleN 或 main 目录中
dvd - title1 - title2 - title3 - title4 - title5 - mainmenu - photos - set1 - set2 - set3 - set4 - set5 - image
为了制作幻灯片,我们需要将图片转换为视频剪辑。mjpegtools 套件包含一个名为 jpeg2yuv 的实用程序,它可以将 JPEG 文件转换为 YUV(用于视频图片的颜色模型)格式,然后可以将其管道传输到 mpeg2enc 以生成 MPEG-2 视频文件。但在进行此转换之前,我们需要确保图片文件的格式对于 DVD 是正确的。建议您在将图片馈送到 jpeg2yuv 之前,手动更改图片以符合 PAL 或 NTSC 分辨率限制(分别为 720×576 和 720×480)。mjpegtools 包含一个名为 yuvscaler 的实用程序,可以自动将传入的 YUV 数据调整为正确的分辨率,但这可能会改变图片的宽高比并导致失真。
生成幻灯片的示例命令行如下所示
jpeg2yuv -n 125 -I p -f 25 -j picture1.jpg | \ mpeg2enc -f 8 -o slide.mpg
-n 选项告诉 jpeg2yuv 它应该生成多少帧,在本例中为 125 帧(25fps 时为 5 秒);对于 NTSC,您应该使用 29.97。-I 选项告诉它使用逐行扫描(而不是丢弃图像的某些部分),-f 设置所需的帧率。mpeg2enc 的 -f 选项告诉它创建 DVD MPEG-2 视频流。需要为 DVD 中包含的所有照片重复此过程,因此您可能需要编写一个快速的 Perl 或 shell 脚本来自动化此过程。
现在我们有了单独幻灯片的视频剪辑。下一步是添加一个音乐背景音轨,该音轨贯穿每个剪辑播放。DVD 规范允许使用 PCM、AC-3 或 MPEG-2 音频,比特率各不相同。对于照片专辑,我决定使用 MPEG-2 音频;我认为我不需要 AC-3 或 PCM 的更高音频质量。mjpegtools 包含一个名为 mp2enc 的工具,可以将 WAV 文件编码为 MPEG-2 格式。mjpegtools 的另一个工具 mplex 可以将一个或多个音频文件复用到视频 MPEG 流中。要处理多个音频文件,您需要 mjpegtools 的 CVS 版本。首先使用 cat 连接特定幻灯片所需的所有视频文件,因为 mplex 似乎在处理多个输入文件时存在问题
cat *mpg > video.mpg
在 title5 目录中(第五个标题将有两个音轨),我对这个新文件运行了 mplex
mplex -f 8 -o video%d.mpg photos/set5/video.mpg \ audio1.mp2 audio2.mp2
这会在当前目录中创建一系列名为 video1.mpg、video2.mpg、...、videoN.mpg 的文件,这些文件与两个音轨 audio1.mp2 和 audio2.mp2 复用在一起。mplex 的 -f 8 参数确保新的 MPEG 文件与 DVD 兼容,与 mpeg2enc 相同。
需要注意的一个问题是 mplex 复用整个音轨。如果音轨的长度超过视频剪辑的总长度,则会扩展最后一个剪辑以覆盖音轨的其余部分。您可能需要调整 jpeg2enc 阶段的帧时间或编辑音轨以防止这种情况发生。
创建 DVD 菜单的过程与生成幻灯片类似。使用 GIMP,创建一个大小为 720×576(对于 PAL)、x 轴分辨率为 75dpi、y 轴分辨率为 80dpi(NTSC 值为 81 和 72)的新图像。添加一个 alpha 通道,然后创建您想要的菜单图片(有关主菜单的基础图像,请参见图 1)。完成后,添加另一个图层并标记出可以突出显示的按钮位置,如图 2 所示。此蒙版最多可以使用四种颜色;我使用红色标记按钮区域,白色用于确保在选择按钮时文本仍然可见。当您对菜单感到满意时,将背景图层导出为 JPEG 文件,将蒙版导出为索引 PNG。确保您已将颜色数设置为四种,如果将透明背景保存为颜色,则为三种。对 DVD 中所需的所有菜单重复此过程(有关进一步示例,请参见图 3 和图 4)。
与之前一样,使用 jpeg2yuv 和 mpeg2enc 创建 MPEG 文件,并使用 mplex 将其与音频文件复用。由于某种原因,菜单需要音频文件才能工作,因此如果您想要静音菜单,则必须使用短暂的静音片段。DVD 中的按钮作为字幕流的一部分实现,因此我们使用 dvdauthor 的 submux 工具来定义菜单的按钮。该程序从文本文件中读取字幕信息,并将其复用到视频流中。submux 文件的格式如下所示
<file_name> <start_time> <end_time> <x_offset> \ <y_offset> <4 8-bit numbers>
.sub 文件中可以有多个条目,但菜单只需要一行
mainmask.png 00:00:00.00 00:00:00.00 0 0 0 1 0 1
将开始时间和结束时间定义为零指示 DVD 播放器持续保持字幕在屏幕上。使用 dvdauthor 提供的默认调色板文件时,0 1 0 1 序列将选定的按钮变为红色。四个不同的数字(从 0-255)控制索引 PNG 中颜色的透明度值。您可能需要尝试这些值以查看可以创建什么效果,但上面的序列似乎产生了合理的结果。制作字幕文件后,我们运行 submux 以将字幕添加到视频流中
submux menu.sub < video.mpg > menu.mpg
如前所述,DVD 在一个 VTS 中最多可以有 32 个不同的字幕流。虽然它们被称为字幕流,但实际上它们是作为覆盖的图片文件而不是文本表示来实现的,因此它们也可以做其他事情。这方面的一个例子是 黑客帝国 DVD 中看到的“白兔”功能。添加字幕相当容易,因为它本质上与创建菜单的过程相同,只是没有背景图层。图 5 显示了一个示例字幕图片,为照片提供了标题。此标题的示例 submux 描述使其在屏幕上显示两秒钟将是
sub1.png 00:00:00.00 00:00:02.00 0 0 0 255 0 255
在此应用程序中,我正在使用单独的、短的 MPEG-2 剪辑,因此每个剪辑都必须有单独的 submux 描述。对于更长的剪辑,submux 文件可能具有多个条目。
制作了视频幻灯片、添加了字幕并创建了菜单后,剩下要做的就是使用 dvdauthor 将所有内容组合在一起。dvdauthor 以两种模式工作,一种用于普通标题,另一种用于定义 VMGM 菜单;VMGM 除了菜单外不能有任何视频信息。让我们从第一个标题开始
dvdauthor -o tmp -m -P \ -b 239x397-489x457,subtitle32+vts1 \ -b 239x500-489x560,vmgm1 \ -b 27x223-127x263,subtitle32+vtsm.2 \ -b 165x184-325x305,subtitle32+vts1.1 \ -b 352x184-512x305,subtitle32+vts1.2 \ -b 539x184-699x305,subtitle32+vts1.3 \ \ title2/titlemenu1.mpg -m -P \ -b 239x397-489x457,subtitle32+vts1 \ -b 239x500-489x560,subtitle32+vmgm1 \ -b 27x223-127x263,subtitle32+vtsm.1 \ -b 165x184-325x305,subtitle32+vts1.4 \ -b 352x184-512x305,subtitle32+vts1.5 \ -b 539x184-699x305,subtitle32+vts1.6 \ title2/titlemenu2.mpg -t -P \ \ title2/v1.mpg title2/v2.mpg title2/v3.mpg \ title2/v4.mpg title2/v5.mpg title2/v6.mpg \ -i post=3Dvtsm
此代码定义了两个标题菜单,每个菜单有六个按钮、六个 MPEG 视频剪辑(dvdauthor 将从一个剪辑到另一个剪辑的过渡定义为章节点)以及一个后视频指令,该指令将 DVD 播放器返回到标题菜单。坐标系与 GIMP 的坐标系相同,因此您可以使用它来获取必要的区域。按钮可以执行各种操作(请参阅dvdauthor --help以获取可能的列表)。在上面的示例中,第一个按钮将音轨设置为零,设置所需的字幕流(流 0 编号为 32,流 1 编号为 33,依此类推),并播放与标题关联的视频。第二个按钮将播放器返回到主 VMGM 菜单,第三个按钮将 DVD 播放器移动到第二个标题菜单。其他三个按钮移动到视频流中的特定章节,对应于单击其中一个缩略图。-o 选项用于输出目录,在本例中为 image/ 子目录。该程序以增量方式工作,因此两次运行相同的命令行会创建额外的标题集,而不是更新原始标题集。
对于主菜单,您需要将 -T 选项传递给 dvdauthor,以便它知道应该创建所需的 VMGM 信息。然后,链接到它已创建的 VTS 文件
dvdauthor -o tmp -T -m \ -b 497x89-693x136,vtsm1 \ -b 497x138-693x187,vtsm2 \ -b 497x189-693x239,vtsm3 \ -b 497x240-693x289,vtsm4 \ -b 426x405-490x474,vts5 \ -P mainmenu/mainmenu.mpg
在将 DVD 映像刻录到光盘之前,最好先对其进行测试。这可以使用 xine 完成;您只需要给 xine 一个像这样的参数
xine dvd:/path_to_dvd_root/VIDEO_TS/
xine 应该像播放 DVD 中的信息一样运行。由于 dvdauthor 是增量式的,因此您应该能够在创建每个单独的标题后使用 xine,以确保您正在正确地执行操作。
当您对 DVD 感到满意时,就可以刻录了。我使用 cdrecord-prodvd 应用程序进行 DVD-R 刻录。操作与 cdrecord 相同,因此首先您需要使用 mkisofs 创建 ISO 映像
mkisofs -o <output_filename> -dvd-video \ <path_to_dvd_root>
然后使用 cdrecord.prodvd 刻录它
cdrecord.prodvd dev=3D0,0,0 -pad -dao \ <path_to_DVD_image>
虽然 dvdauthor 没有专业应用程序那样易于使用的界面,但它提供了制作与好莱坞使用的标准相同的 DVD 所需的一切,而成本仅仅是 DVD-R 介质的价格。希望本文向您展示了 DVD 制作的基础知识,并为您自己的应用程序提供了一些想法。开始创作吧!
资源
cdrecord.prodvd: www.fokus.gmd.de/research/cc/glone/employees/joerg.schilling/private/cdrecord.html
dvdauthor: dvdauthor.sf.net
dvdrtools: www.nongnu.org/dvdrtools
The GIMP: www.gimp.org
mjpegtools: mjpegtools.sf.net
xine: www.xinehq.de
Ian Pointer 是英国一位失业的计算机科学毕业生,他家里有太多 DVD,现在计划制作更多。可以通过 ian@snappishproductions.com 联系他。