将任何电影转换为 DVD 视频

来自 ArchWiki
(重定向自 Video2dvdiso

MEncoder 是 mplayer 软件包的一部分。 参见 MPlayer 以了解详情。

为什么又有一篇关于此过程的文章? 关于如何将任何电影转换为可在任何硬件 DVD 播放器上观看的标准 DVD 视频的文章、手册页和博客文章有很多。 但是,这些页面大多数都侧重于此过程的某一方面。 本文的目的是在一个地方总结大多数可用的知识。

DVD 内容的定义

在此示例中,DVD 上的每部电影都有一个视频轨道、至少一个音轨,并且可能包含字幕。 我们将从创建一个简单的 DVD 开始,该 DVD 在放入 DVD 播放器时会自动启动,没有任何菜单。 如果光盘包含多部电影,您可以使用 DVD 播放器的章节功能选择一部。

音轨创建

音轨使用杜比数字 AC-3 环绕声编解码器编码,采样率为 48000Hz。 DVD 视频最多可以有 1536 kbps 的音频信息,但每个音轨的限制为 448 kbps。 您可以拥有单声道、立体声或 5.1 声道音轨。

音频和视频的总比特率不能大于 9800 kbps; 因此,每个音轨都会降低视频的比特率,但这不应该是一个问题,因为最大 8264 kbps (9800 - 1536) 的视频比特率就足够了。

虽然视频的严格约束使得几乎不可能找到无需编码的视频轨道,但找到带有 ac3 轨道的音频文件是很常见的。

为了了解输入文件的音频编解码器,您可以使用 mplayer,这是一个具有良好音轨的文件的示例

$ mplayer movie.mov
...
AUDIO: 48000 Hz, 6 ch, s16le, 448.0 kbit/9.72% (ratio: 56000->576000)
Selected audio codec: [a52] afm: liba52 (AC3-liba52)
...

如果您的输入文件已经具有 ac3 编码的音轨(具有可接受的比特率、采样率和帧率),则不应再次对其进行编码。

您只需要提取它

$ mencoder movie.mov -alang en -ovc frameno -of rawaudio -oac copy \
-o english_audio.ac3

如果音轨不是可接受的 ac3 文件,则您必须对其进行编码。 通常 ac3 每个音频通道使用 64 或 96 kbps。

对于 6 声道,编码命令为

$ mencoder movie.mov -alang en -ovc frameno -of rawaudio -srate 48000 -channels 6 \
-oac lavc -lavcopts acodec=ac3:abitrate=384 -o english_audio.ac3

或者对于立体声音频

$ mencoder movie.mov -alang it -ovc frameno -of rawaudio -srate 48000 -channels 2 \
-oac lavc -lavcopts acodec=ac3:abitrate=128 -o italian_audio.ac3

使用这两个命令,我们将得到两个文件,每个音轨一个。

如果您要更改采样率并且认为音频质量较差,您可以尝试添加参数 -af resample=48000::2:这样做 mplayer 将使用其最精确的算法。

视频轨道创建

符合标准的 DVD 视频具有明确且精确的视频要求。 宽高比可以是 '16/9' 或 '4/3',如果您制作的是 PAL 或 NTSC DVD,则可用分辨率会发生变化。 这两个标准也具有不同的帧率。 编解码器为 Mpeg-2。

DVD 不使用方形像素,像素是矩形的:虽然电影具有一定的分辨率,但播放器必须显示它,就好像它在变形像素一样。 下表显示了实际分辨率以及播放器如何显示它。

分辨率 显示为
NTSC DVD,帧率:30000/1001 (29.97) 或 24000/1001 (23.97)
720x480 720x540 (4/3) 或 854x480 (16/9)
704x480 720x528 (4/3)
352x480 640x480 (4/3)
352x240 352x264 (4/3)
PAL DVD,帧率:25
720x576 768x576 (4/3) 或 1024x576 (16/9)
704x576 768x576 (4/3)
352x576 768x576 (4/3)
352x288 384x288 (4/3)

如您所见,4/3 宽高比有 4 种分辨率; 16/9 只有一种。 NTSC 标准为您提供两种帧率,而 PAL 仅提供一种。

根据您居住的国家/地区,您必须在 NTSC 或 PAL 之间做出决定。 为了确定宽高比和分辨率,您必须知道输入电影的分辨率。

使用 mplayer 播放您的输入电影,确保 mplayer 播放的内容正是您要放入 DVD 中的内容。 您可以考虑使用 -ss-endpos-chapter 等选项。

mplayer 显示如下行

Movie-Aspect is 1.39:1 - prescaling to correct movie aspect.
VO: [xv] 512x368 => 512x368 Planar YV12 

这为您提供了宽高比和分辨率。 在此示例中,宽高比为 1.39:1 - 这与 4/3 非常相似(1.333:1 也是如此)。 虽然分辨率为 512x368,但在 704x576 PAL DVD 或 704x480 NTSC DVD 中无法对其进行编码。

如果输入没有黑边,或者输入文件正好具有 4/3 或 16/9 的宽高比,则这很好。 否则,需要一个中间步骤。

移除黑边

如果输入文件有黑边且其宽高比不是 4/3 或 16/9,则必须移除黑边并考虑“实际”分辨率和“实际”宽高比。 mplayer 具有检测黑边的功能,以便轻松移除它们:cropdetect 视频滤镜。 使用 -vf cropdetect 播放电影,在电影中寻找黑边容易看到的明亮场景。 mplayer 将为您提供带有正确 crop 值的输出。 示例

...
Movie-Aspect is 1.50:1 - prescaling to correct movie aspect.
VO: [xv] 720x480 => 720x480 Planar YV12 
...
[CROP] Crop area: X: 0..719  Y: 38..440  (-vf crop=720:400:0:40).% 0 0 
[CROP] Crop area: X: 0..719  Y: 38..440  (-vf crop=720:400:0:40).% 0 0 
[CROP] Crop area: X: 0..719  Y: 38..440  (-vf crop=720:400:0:40).% 0 0 
...

这部电影有 40 像素的黑边,其宽高比为 1.50。 因此,我们找到了一个明亮的场景,mplayer 告诉我们 crop 视频滤镜的正确值:在本例中为 720:400:0:40

使用 -vf crop=720:400:0:40 重新播放电影,我们看到实际分辨率,不幸的是,mplayer 将显示旧的宽高比,因此我们必须手动计算实际宽高比

Movie-Aspect is 1.50:1 - prescaling to correct movie aspect.
VO: [xv] 720x400 => 720x400 Planar YV12 

宽高比实际上是 720/400 = 1.8; 1.8 的宽高比意味着我们必须使用 16/9(因为它为 1.777)

获取正确的宽高比

我们现在有了没有黑边但宽高比错误的电影 - 因为 DVD 仅接受 16/9 或 4/3。 幸运的是,mplayer 还有另一个视频滤镜,可以放置正确的黑边以获得正确的宽高比。 该滤镜是 expand。 我们继续前面的示例

$ mplayer movie.mov -vf crop=720:400:0:40,expand=:::::16/9

mplayer 将显示带有小黑边的电影(毕竟我们从 1.8 变为 1.777)。 所有前导冒号都是必要的,因为滤镜会接受我们保留为默认值的许多其他参数。

达到有效的分辨率

现在我们必须决定我们将使用的分辨率。 当然,如果我们选择了 16/9 宽高比,我们将只有一个选择(PAL 为 720x576 或 NTSC 为 720x480),但如果我们选择了 4/3 宽高比,我们必须做出决定。 通常,最佳选择是包含移除黑边后的原始电影的最小分辨率,或者如果输入文件更大,则选择最大分辨率。 例如,640x480 的 4/3 电影应放入 704x480 NTSC 或 704x576 PAL 中。 为了继续前面的示例,我们将使用 720x576 PAL。

视频滤镜链变为:-vf crop=720:400:0:40,expand=:::::16/9,scale=720:576,dsize=1024:576,我们在 scale 中缩放到正确的分辨率,并在 dsize 中设置显示分辨率,如表所示。

如果 mplayer 显示类似 VO: [xv] 720x576 => 1024x576 Planar YV12 的内容,其中第一对是分辨率,第二对是显示分辨率,并且电影显示正确(例如没有椭圆形头部),我们就完成了。

视频编码

mplayer 正确显示宽高比为 4/3 或 16/9 的视频,且分辨率符合 DVD 标准之一的情况下,现在是时候将视频编码为适合 DVD 视频的文件了。 我们将使用 mencoder(来自 mplayer),mplayermencoder 共享视频滤镜,因此我们到目前为止计算出的 -vf 行将用于获得精细的 mpeg2 文件。

还有最后一件事要决定,电影的平均比特率。 符合 DVD 标准的 mpeg 音视频总比特率最高可达 9800 比特/秒,安全的选择是使用 8264 kbps 作为 mpeg-2 视频的最大比特率,它为音频留出了所有可用空间。 此外,视频通常平均只需要 4000-5000 kbps。 mencoder 非常重视平均的含义,以至于您可以假设

(average bitrate) * (movie length in seconds) = (total of bits)

并且知道 DVD 中有多少比特,您可以非常精确地计算比特率。

Kind of DVD   # of bits
DVD-R SL      37658558464
DVD+R SL      37602983936
DVD-R DL      68349329408
DVD+R DL      68383932416

例如,如果您有一部 2 小时的电影(7200 秒)、一个 448 kbits/秒的音轨(6 声道音频的常用值)和一个 DVD-R SL,您可以计算

37658558464 / 7200 - 448000 = 4782355

DVD 结构中可能存在一些空间浪费,但我们可以使用 4500 kbits 并且相当安全。

编码分两步完成,第一步是获取有关电影结构的信息,以便了解编码器应在何处使用更多比特(高动作场景)以及在何处应使用更少比特(平静或慢节奏的场景),以便以最佳质量准确使用您要求的比特。

这些命令,正如您可以从 || exit 中理解的那样,旨在写入文件中

 rm divx2pass.log

 nice -19 mencoder -alang en -oac lavc -ovc lavc -of rawvideo -vf-clr -vf \
 crop=720:400:0:40,expand=:::::16/9,scale=720:576,dsize=1024:576,harddup \
 -ofps 25 -lavcopts vcodec=mpeg2video:turbo:vpass=1:vrc_buf_size=1835\
:vrc_maxrate=8264:vbitrate=4500:keyint=15:vstrict=0:aspect=16/9 \
 -o /dev/null movie.mov || exit

 nice -19 mencoder -alang en -oac lavc -ovc lavc -of rawvideo -vf-clr -vf \
 crop=720:400:0:40,expand=:::::16/9,scale=720:576,dsize=1024:576,harddup \
 -ofps 25 -lavcopts vcodec=mpeg2video:vpass=2:vrc_buf_size=1835\
:vrc_maxrate=8264:vbitrate=4500:keyint=15:trell:mbd=2:precmp=2:subcmp=2\
:cmp=2:dia=2:predia=2:cbp:mv0:lmin=1:dc=10:vstrict=0:aspect=16/9 \
 movie.mov -o movie_video_track.m2v  || exit

注意事项

  • 这里是我们到目前为止计算出的视频滤镜链,并添加了 harddup。 获得符合 DVD 标准的视频所必需的滤镜;
  • 我们决定的比特率 (4500) 是 vbitrate 值中显示的值;
  • 宽高比显示在 aspect 值中;
  • -ofps 25 选项的存在是因为我们想要 PAL DVD,如果您想要 NTSC DVD,则必须使用 -ofps 30000/1001
  • 第一遍丢弃视频输出; 该遍仅用于创建信息文件 divx2pass.log
  • 输入文件 movie.mov 可以替换为 mplayer 可以读取的任何内容,它当然只是一个占位符;
  • 输出是原始视频流;
  • 最大比特率为 8264 kbps:它为音频留出了所有空间。 这通常是不需要的,但如果您知道音频使用了多少比特率,则可以增加:例如,如果您有两个比特率为 192 kbps 的音轨,则可以放入 9146 kbps,即 9800-192*2;
  • 为了确保适当的 A/V 同步,我们还使用 lavc 对音频进行编码,但不需要任何设置,因为音频被丢弃;
  • 如果您复制和粘贴,请确保以冒号开头的行中没有前导空格。

所有其他值对于高质量的 DVD 标准转换或多或少是固定的,您可以(并且应该)在 mencoder(1) 中阅读有关这些值的更多信息。

注意: 此处显示的滤镜链是完整的,因为我们必须进行每一遍。 例如,如果您的输入文件已经是 16/9 宽高比,您将只有 -vf scale=720:576,dsize=1024:576,harddup; 如果您的输入文件宽高比错误但没有黑边,您将只有类似 -vf expand=:::::4/3,scale=720:576,dsize=768:576,harddup 的内容; 如果您的电影具有正确的分辨率和宽高比,则最低要求是 -vf harddup

将这些命令保存在文本文件中,并在 shell 中执行 sh filename,这两个命令的执行可能需要一些时间。 但是一旦完成,您将获得分辨率正确的 DVD 视频流。

如果您有多个视频文件(例如,电影的第一部分在一个文件中,第二部分在另一个文件中),则必须按照这些说明对两者进行编码,我们将在制作 DVD 时将两者都放入 DVD 中。

合并音视频轨道

为了只有一个包含音视频的文件,我们将使用 mplex(来自 mjpegtools); 命令很简单

$ mplex -f 8 -o movie.mpg movie_video_track.m2v english_audio.ac3 italian_audio.ac3

输出文件 (movie.mpg) 将包含音轨和相关的视频轨道。 命令行上的顺序很重要:音轨的顺序将与 DVD 上的顺序相同。 您应该记下它,因为在最终的 DVD 中,我们将包含音轨的语言标签。

如果只有一个音轨,则 mplex 是必需的,但如果您只有一个音轨,则可以直接创建 mpeg 文件。 您必须替换视频编码的第二个命令。 例如,使用英语音轨一步制作 movie.mpg

nice -19 mencoder -oac lavc -ovc lavc -of mpeg -mpegopts format=dvd:tsaf -vf-clr -vf \
 crop=720:400:0:40,expand=:::::16/9,scale=720:576,dsize=1024:576,harddup \
 -srate 48000 -ofps 25 -lavcopts vcodec=mpeg2video:vpass=2:vrc_buf_size=1835\
:vrc_maxrate=8264:vbitrate=4500:keyint=15:trell:mbd=2:precmp=2:subcmp=2\
:cmp=2:dia=2:predia=2:cbp:mv0:lmin=1:dc=10:acodec=ac3:abitrate=384:vstrict=0\
:aspect=16/9 -channels 6 movie.mov -o movie.mpg  || exit

注意事项

  • -of 选项现在声明 mpeg,而不是原始视频;
  • 有一个新选项:-mpegopts,其设置是 mplex 隐藏在 -f 8 后面的;
  • -lavcopts 中同时包含视频和音频的选项。

mplex 失败主要有两个原因:第一个是音频的比特率不是正确的 48000kbps; 第二个是总比特率在电影的某些点上大于 9800kbps。

第一个问题表现为数百条警告消息,您必须重新编码音频。

第二个问题表现为帧丢失,并在一段时间后出现全局故障:您必须使用正确的最大比特率重新编码视频(如果要确保安全,请放入 8264)。

字幕轨道创建

字幕合并到 mpeg 文件中,并取决于用户选择(普通字幕)或始终(强制字幕)时显示的设置。 强制字幕通常用于将电影中外语部分翻译成主要语言,例如《指环王》中的精灵语。

在 DVD 视频中,字幕有 3360 kbps 的空间。 字幕实际上是最多 4 种颜色的图片(一种是透明的):这就是字幕通常看起来很粗糙的原因。

在 mpeg 文件中,字幕和语言之间没有关系,只有一个 sid 编号。 添加字幕时,请记下每个 sid 的字幕语言。(示例:sid 0:英语;sid 1:意大利语;sid 2:法语,...)

添加文本字幕

文本字幕很容易识别,它是一个文件,用文本编辑器打开后会显示电影的台词以及相对时间。 我们将使用 spumux(来自 dvdauthor)将电影中的文本渲染为字幕。

第一个问题是字体。 字体必须在分辨率和颜色限制内渲染时易于阅读。 我发现 Xerox Sans Serif Wide Bold 字体 免费提供 相当不错。

spumux 在目录 ~/.spumux 中查找字体的 .ttf 文件,因此创建该目录并将字体复制到其中。 对于本示例,我们假设字体文件名为 ~/.spumux/xerox.ttf

在本示例中,包含字幕的文件名为 italian.srt

spumux 使用 .xml 文件进行设置。 这是我们的文件外观

<subpictures format="PAL">
   <stream>
      <textsub filename="italian.srt"
         fontsize="22.0" font="xerox.ttf" horizontal-alignment="center"
         vertical-alignment="bottom" left-margin="60" right-margin="60"
         top-margin="20" bottom-margin="30" subtitle-fps="25"
         movie-fps="25" movie-width="720" movie-height="576"
         force="no"
      />
   </stream>
</subpictures>

制作好 sub_ita.xml 文件后,我们必须使用 spumux 将其与 mpeg 文件混合

$ spumux -s0 sub_ita.xml <movie.mpg >movie_ita_sub.mpg

您应该尝试位置值以获得您喜欢的结果。 如果您想要强制字幕,请使用 force="yes"-s 设置字幕流 ID,如果您包含更多字幕,则必须相应地增加该值。

例如,您可以在修改 .xml 文件中的字幕文件名后添加其他字幕,使用

$ spumux -s1 sub_fre.xml <movie_ita_sub.mpg >movie_ita_sub__fre_sub.mpg

从其他 DVD 提取字幕

如果要从其他 DVD 提取字幕,则必须使用 tccat'tcextract (来自 transcodeAUR)来获取字幕原始流。 之后,使用 subtitle2pgm(也来自 transcodeAUR)将原始流转换为图片和控制文件。 控制文件可以被 spumux 理解。

假设 DVD 设备为 /dev/sr0,视频轨道为第一个,我们使用 mplayer 检测可用的字幕

$ mplayer -dvd-device /dev/sr0 dvd://1 -frames 0 2>&1 | grep sid
subtitle ( sid ): 0 language: en
subtitle ( sid ): 1 language: pt

提取原始字幕流

$ tccat -i /dev/sr0 -T 1,-1 | tcextract -x ps1 -t vob -a  $((0x20 + 0)) > subs-en

-a 的值是字幕的 sid 编号 + 0x20。 在本例中,我们提取了第一个字幕流,最终将第二个零更改为所需的 sid 编号。

从字幕中提取图片会创建大量文件,因此我们创建一个目录并在其中工作。 subtitle2pgm 以黑白方式提取,灰度级必须由用户决定。 因此,首先尝试

$ mkdir subs-en-wd
$ cd subs-en-wd
$ subtitle2pgm -i ../subs-en -c 0,85,170,255 -g 4 -t 1

该目录将填充字幕。 使用图像查看器检查颜色:您将拥有白色 (255)、浅灰色 (170)、深灰色 (85) 和黑色 (0)。 为背景选择唯一的颜色,并为其他部分选择颜色:通常字母为白色,字母周围的边框为深灰色。 找到合适的配色方案后,删除该文件夹并使用新的配色方案再次执行 subtitle2pgm

$ cd ..
$ rm -rf subs-en-wd && mkdir subs-en-wd
$ cd subs-en-wd
$ subtitle2pgm -i ../subs-en -c 224,224,32,0 -g 4 -t 1

subtitle2pgm 创建了图像,但也创建了一个可供 spumux 使用的 .xml 文件。 因此,如果图像效果良好,只需使用 spumux 将它们与 mpeg 文件混合即可。

$ spumux -s0 movie_subtitle.dvdxml <../movie.mpg >../movie_subs.mpg

修复字幕图像

图像的分辨率可能不正确(例如,如果从 NTSC DVD 提取并放入 PAL DVD 中),因此显示位置不正确。 为了解决这个问题,有两种方法:一种是将每个图像转换为正确的分辨率; 另一种是仅移动图像。

让我们从前者开始。 例如,您有分辨率为 720x480 的字幕图像,这些图像是从 NTSC DVD 16/9 中提取的。 您正在制作 PAL DVD,因此分辨率为 720x576:仅包含字幕而不进行更改会使它们显示在电影的中心。

字幕会稍微变形(因为 720 像素在 PAL 中显示为 1024,而在 NTSC 中显示为 854),但我们只是告诉 spumux 将图像放在屏幕底部。

spumux 接受一些关于如何渲染字幕图像的选项。 阅读 spumux(1) 我们看到我们需要使用 yoffset 选项。 为了更改 .xml 文件的每一行,我们使用 sed。 图片对于 480 像素来说效果很好,因为我们现在有 576 像素,所以我们必须将图像在屏幕上向下移动 96 像素,所以

$ sed -i movie_subtitle.dvdxml -e 's.<spu .<spu yoffset="96" .'

使用 sed 更改 .xml 文件既简单又快捷。 如果您需要添加其他选项(例如,您想要强制字幕),只需使用 sed 表达式 s.<spu .<spu X ,其中 X 是您想要的新选项。

如果仅移动字幕图像不足以解决问题,您可能需要将图片转换为正确的分辨率。 为此,我们将使用 convert(来自 imagemagick)和一个小型 shell 脚本。

例如,要将图片从 NTSC 分辨率转换为 PAL 分辨率,我们创建以下内容

for d in *.png ;do
  convert "$d" -resize '720x575!' +dither -map "$d" tmp.png || break
  mv tmp.png "$d"
  echo "$d"
done

这会转换每个图像而不会更改调色板(感谢 -map),并进行干净的调整大小(感谢 +dither)。 生成的图像替换了旧图像,因此现在您可以直接使用 .xml 文件。

VobSub 文件

VobSub 字幕由一对文件组成:.idx.sub 文件。 有时,两者都被压缩为单个 .rar 文件。 如果是这种情况,只需使用 unrar 解压缩并获得这两个文件。

.sub 文件是一个 mpeg 序列,仅包含字幕。 您必须使用 tcextract 提取原始流

$ tcextract -i s.sub -x ps1 -a $((0x20 + 0)) > subs-en

这与从 DVD 中提取的想法相同; 第二个 0 是您要提取的字幕轨道的 sid 编号:您可以使用任何文本编辑器读取 .idx 文件以查看字幕语言标签。

您现在有了原始字幕流,您可以按照上面部分的相同说明进行操作。

DVD 制作

此时,我们应该只有包含视频轨道、音轨和字幕的 .mpeg 文件。 我们只需要包含 DVD 视频的标头结构。 我们使用 dvdauthor

dvdauthor 使用 .xml 文件来确定 DVD 文件系统的形状。 这是最基本的文件

<dvdauthor>
    <vmgm />
    <titleset>
        <titles>
            <pgc>
                <vob file="video.mpg" />
            </pgc>
        </titles>
    </titleset>
</dvdauthor>

但通常您想要标记音轨和字幕轨道,在第二个示例中,video.mpg 有两个音轨和两个字幕轨道。 我们给出一个语言标签,顺序很重要:第一个标签给第一个语言,依此类推。

<dvdauthor>
    <vmgm />
    <titleset>
        <titles>
            <subpicture lang="en" />
            <subpicture lang="pt" />
            <audio lang="en" />
            <audio lang="pt" />
            <pgc>
                <vob file="video.mpg" />
            </pgc>
        </titles>
    </titleset>
</dvdauthor>

音轨和字幕标记的想法适用于所有标题。 现在您可能遇到以下情况之一

单文件和单部电影

在这种情况下,您可以只使用最基本的 .xml 文件之一。

多文件和单部电影

如果您有多部电影的文件,dvdauthor 会将它们用作章节,只需添加 vob file 标签即可

<dvdauthor>
    <titleset>
        <titles>
            <pgc>
                <vob file="video_cd1.mpg" />
                <vob file="video_cd2.mpg" />
            </pgc>
        </titles>
    </titleset>
</dvdauthor>

单文件和多部电影

您应该从一开始就使用 -ss 创建单独的文件。 -endpos-chapter mencoder 选项。 但是,如果您已经编码,您现在可以尝试使用 -ss-endposmencoder 进行流复制

$ mencoder -oac copy -ovc copy -endpos 01:10:00 movie.mpg -o first_part.mpg
$ mencoder -oac copy -ovc copy -ss 01:10:00 movie.mpg -o second_part.mpg

这样做,您将进入第四种情况。

多文件和多部电影

在这种情况下,您必须制作不同的标题,只需添加 titles 标签即可。

<dvdauthor>
    <titleset>
        <titles>
            <pgc>
                <vob file="video1_cd1.mpg" />
                <vob file="video1_cd2.mpg" />
            </pgc>
        </titles>
    </titleset>
    <titleset>
        <titles>
            <pgc>
                <vob file="video2_cd1.mpg" />
                <vob file="video2_cd2.mpg" />
            </pgc>
        </titles>
    </titleset>
</dvdauthor>

使用 dvdauthor

编写完 .xml 文件后,您就可以使用 dvdauthor 了。 命令是

$ export VIDEO_FORMAT=PAL     # or NTSC
$ dvdauthor -o dvd -x dvd.xml

其中 dvd.xml 是 XML 文件名,dvd 是输出目录的名称。 它一定还不存在。 dvdauthor 完成其工作后,在 dvd 目录中,您将拥有符合 DVD 标准的视频。

最好在刻录前对其进行测试

$ mplayer -dvd-device dvd/ dvd://1

刻录 DVD 视频

我们使用 cdrecordmkisofs(都包含在 cdrtools 中)刻录 DVD 或创建 ISO。 要创建 .iso,命令为

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

您可以使用以下命令刻录它

$ cdrecord -v dev=/dev/sr0 dvd.iso

如果您不想创建 iso,可以使用管道在一个命令中完成这两个步骤

$ export TSIZE=$(mkisofs -dvd-video -udf -print-size dvd/ 2>/dev/null)
$ mkisofs -dvd-video -udf -o - dvd/ | cdrecord -sao -eject -v dev=/dev/sr0 tsize="$TSIZE"s -

如果您想同时创建 iso 和刻录

$ export TSIZE=$(mkisofs -dvd-video -udf -print-size dvd/ 2>/dev/null)
$ mkisofs -dvd-video -udf -o - dvd/ | tee dvd.iso | cdrecord -sao -eject -v dev=/dev/sr0 tsize="$TSIZE"s -

如果您只想要一个命令

$ mkisofs -dvd-video -udf -o - dvd/ | cdrecord -sao -eject -v dev=/dev/sr0 \
tsize=$(mkisofs -dvd-video -udf -print-size dvd/ 2>/dev/null)s -

就是这样。 您拥有一个符合标准的 DVD 视频,可以在任何硬件 DVD 播放器上观看。

Video2dvdiso

创建 以下 shell 脚本,将任何电影转换为 DVD 视频的 ISO; 该 ISO 可以使用 k3b ISO 刻录直接刻录到空白 DVD。

video2dvdiso.sh
#!/bin/sh
# AVI or any video 2 DVD iso Script
# DvdAuthor 7 and up needs this
export VIDEO_FORMAT=PAL
# Change to "ntsc" if you would like to create NTSC disks
format="pal"

# Check we have enough command line arguments
if [ $# -lt 1 ]
then
    echo "Usage: $0 <input file 1 ... input file n>"
    exit
fi

# Check for dependencies
missing=0
dependencies="ffmpeg dvdauthor genisoimage"
for command in $dependencies
do
    if ! command -v $command >/dev/null 2>&1
    then
        echo "$command not found"
        missing=$(($missing + 1))
    fi
done

if [ $missing -gt 0 ]
then
    echo "Please install the missing applications and try again"
    exit
fi

emphasise() {
    echo ""
    echo "********** $1 **********"
    echo ""
}

# Check the files exists
for var in "$@"
do
    if [ ! -e "$var" ]
    then
        echo "File $var not found"
        exit
    fi
done

emphasise "Converting AVI to MPG"

for var in "$@"
do
    ffmpeg -i "$var" -y -target ${format}-dvd -aspect 16:9 "$var.mpg"
    if [ $? != 0 ]
    then
        emphasise "Conversion failed"
        exit
    fi
done

emphasise "Creating XML file"

echo "<dvdauthor>
<vmgm />
<titleset>
<titles>
<pgc>" > dvd.xml

for var in "$@"
do
    echo "<vob file=\"$var.mpg\" />" >> dvd.xml
done

echo "</pgc>
</titles>
</titleset>
</dvdauthor>" >> dvd.xml

emphasise "Creating DVD contents"

dvdauthor -o dvd -x dvd.xml

if [ $? != 0 ]
then
    emphasise "DVD Creation failed"
    exit
fi

emphasise "Creating ISO image"

genisoimage -dvd-video -o dvd.iso dvd/

if [ $? != 0 ]
then
    emphasise "ISO Creation failed"
    exit
fi

# Everything passed. Cleanup
for var in "$@"
do
    rm -f "$var.mpg"
done
rm -rf dvd/
rm -f dvd.xml

emphasise "Success: dvd.iso image created"

使其可执行

希望该脚本非常容易理解,因此您可以根据需要对其进行更改。 有关更多信息,请参见 ffmpeg(1)mkisofs(8)dvdauthor(1)

用法示例

$ video2dvd.sh video.avi

将生成 dvd.iso

检查 dvd.iso 是否可以作为 DVD 播放

$ mplayer dvd.iso

附录 A:更改帧率

如果输入帧率和输出帧率之间的差异很小,您可以考虑加速或减速电影,而不是通过丢帧或复制帧来转换其帧率。 用于执行此操作的 mplayer 命令行参数是 -speed

最经典的情况是从 23.976 NTSC fps 转换为 25 PAL fps:这就是 PAL 加速。

25/(24000/1001) = 1.042708333333...

因此,在 PAL 国家/地区播放的 NTSC 电影通常比其原始电影快约 4%。 mplayer 对更改帧率不是很热衷,因此在最终输出中通常很明显。 另一方面,小于 5% 的加速或减速可能不明显。

为了以这种方式更改帧率,您必须

  • 计算速度值:(输出帧率)/(输入帧率);
  • 每个 mplayer 命令中使用 -speed,包括转换音频;
  • 始终显式设置输出帧率。

这是一个从 NTSC 输入制作 PAL DVD 的示例,1.042733... 来自上面的除法

$ rm divx2pass.log

$ nice -19 mencoder -oac lavc -ovc lavc -of rawvideo -vf-clr -vf \
 expand=:::::16/9,scale=720:576,dsize=1024:576,harddup \
 -speed 1.04270833333333333333 -srate 48000 \
 -ofps 25 -lavcopts vcodec=mpeg2video:turbo:vpass=1:vrc_buf_size=1835\
:vrc_maxrate=8264:vbitrate=4500:keyint=15:vstrict=0:aspect=16/9 \
 -o /dev/null movie.mov || exit

$ nice -19 mencoder -oac lavc -ovc lavc -of rawvideo -vf-clr -vf \
 expand=:::::16/9,scale=720:576,dsize=1024:576,harddup \
 -speed 1.04270833333333333333 -srate 48000 \
 -ofps 25 -lavcopts vcodec=mpeg2video:vpass=2:vrc_buf_size=1835\
:vrc_maxrate=8264:vbitrate=4500:keyint=15:trell:mbd=2:precmp=2:subcmp=2\
:cmp=2:dia=2:predia=2:cbp:mv0:lmin=1:dc=10:vstrict=0:aspect=16/9 \
 -o movie_video_track.m2v movie.mov || exit

$ nice -19 mencoder movie.mov -ovc frameno -of rawaudio -srate 48000 -channels 6 \
 -speed 1.04270833333333333333 -ofps 25 \
 -oac lavc -lavcopts acodec=ac3:abitrate=448 -o english_audio_6ch.ac3 || exit

$ nice -19 mplex -o movie.mpg -f 8 movie_video_track.m2v english_audio_6ch.ac3

附录 B:添加菜单

现在您知道如何制作 .mpg 文件了; 如果您想为 DVD 添加菜单,可以按照 Myth TV 的外部教程 [1] 进行操作。

附录 C:视频 CD

创建 VCD

ffmpeg -i <movie.avi> -target pal-vcd <filename.mpg>

创建 SVCD

ffmpeg -i <movie.avi> -target pal-svcd <filename.mpg>