将任何影片转换为 DVD 视频
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),mplayer 和 mencoder 共享视频滤镜,因此我们到目前为止计算出的 -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) 中阅读相关内容。
-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 创建了图像,但也创建了一个 .xml
文件,spumux 可以使用该文件。 因此,如果图像良好,只需使用 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
和 -endpos
与 mencoder 一起仅进行流复制
$ 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 视频刻录
我们使用 cdrecord 和 mkisofs(均包含在 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; 可以使用 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
现在您知道如何制作 .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>