hiei |
2004-02-28 07:29 |
4. 把 DVD 转成 AVI 现在你有两个选择 - 或者是 transcode 或者 MEncoder. 两者各有好坏. 这里列出了一个非常简略的说明, 至少在 2002 年 4 月 28 日的 CVS 上版本是这样的:
* MEncoder 不能调整音频延迟. 当你用 MPlayer 播放的时候, 如果音频和视频是不同步的, 那么你就应该使用 transcode. * transcode 不能处理 VBR/ABR * * MP3, 只能处理 CBR*. 如果你确实需要 VBR MP3 音频, 那么你不得不使用 MEncoder. 注意 transcode自带的 AVI 工具不能处理包含 VBR MP3 音频的 AVI. 所以你不能用 avisync 工具来修正 MEncoder 产生的 AVI 中的同步问题. 根据文档 MEncoder 应该只用来作 VBR/ABR MP3 的编码. CBR 编码的文件在 Windows 不能正确播放(但是用 MPlayer 播放得很好). * 现在 MEncoder 还没有比较好的 GUI 前端. 这就使得剪切/调整大小非常痛苦 .
4.1. 屏幕纵横比 我们开始之前, 让我先介绍一下你可能遇到的最常见的屏幕纵横比. DVD 总是编码成 720x576(5:4) 但播放的时候可能会拉伸. 通常的视频格式是 TV 4:3 = 1.33, 一般的电影院电影 16:9 = 1.78, 宽屏幕电影 2.35:1.
这里是通常情况的一个列表:
* 4:3 电影充满整个画面(没有加边框 * *): 把 5:4 拉伸到 4:3 16:9 电影充满整个画面(没有加边框): 把 5:4 拉伸到 16:9 * 16:9 电影加了边框: 把 5:4 拉伸到 4:3, 切掉一些黑边. * 2.35 电影加了边框: 把 5:4 拉伸到 16:9, 切掉一些黑边.
如果你不一下子理解所有的, 不要着急. 看一看 dvd::rip 的剪切和拉伸选项, 来获得一个更直观的印象. 4.2. 使用 dvd::rip 使用 dvd::rip 是获得 AVI 最好的也是最简单的方法. 就象前面提到的, 它很大程度上依赖于 transcode 来作它的工作. 启动 dvd:rip 后, 你把想要转换的标题 rip 到硬盘上. 查看 第三章 来获得更详细的说明. 4.2.1. 剪切和大小 到 Clip & Zoom 页. 这里就是你设置确定图像大小和剪切的地方. 首先选定一帧: 只是简单地在 Grab Preview Frame 中输入帧号 (象 200), 然后按下 Grab Frame from ripped VOB 按钮. 几秒钟后下面的三个视图就会现出你要求的帧.
transcode 用三步把图像调整到它最后的大小: 首先它对未拉伸的图像进行剪切, 接着调整大小, 最后再剪切. 每一步都可以为剪切选择 0 以及为大小调整选择原始的宽度和高度而省略. 如果你想看图像到底多大, 只要点击任何一个, 就会弹出一个包含结果的窗口.
你可能已经注意到三个预览窗口下的下拉框. dvd:rip 提供很多预设值可供选择. 简单选择其中的一个就可以开始了. 你仍然可以在选择这样一个预设值之后进行手动修改. 所有的预设值都叫做 "autoadjust...", 可以试着猜猜正确的剪切区域. 选择一个预设值之后, 点击 Apply Preset Values 按钮. 然后调整这些值直到你满意为止.
big frame, medium frame 和 small frame 部分指的是最终得到的图像大小. big 保持完全的 DVD 分辨率, medium 保持宽度在 500 - 600 之间, small 大约在 350 附近.
关于调整大小需要在注意一点: Use fast resizing 对于图像处理有很大的影响, 但要求目标的宽度和高度可被 32 整除. 必要担心, 如果你不能使用快速大小调整, dvd::rip 会告诉你. 也要注意也有可能需要真正放大图像的时候, 我强烈建议不要这样. 因为有一些坏处: 编码器需要更多的位数来得到和小一些图像相同的质量, 并且在播放的时候进行向上拉伸, 你可能得到混乱的图形(Peter Schuller 向我报告了这样的情况). 始终要向下拉伸. 4.2.2. 选择编码参数 这页已经做完了. 打开 Transcode 页. 首先要决定你想要使用的视频编解码器. 如果你已经安装了 Linux 的 DivX5, 那就可以使用, 但我会建议使用 XviD. 如果你是从 CVS 下载了 XviD, 那么要选择的选项是 xvidcvs(很明显). 如果后来 transcode 异常退出了, 你可以试试 xvid.
你还记得我让你检查一下视频是否是隔行的呢? 现在我们就用得着了. 如果你的视频不是隔行的, 那就把 deinterlacing 和 antialias 设为 off. 不然, 选择 3 - Zoom To Full Frame. 这是最慢的但是也是看起来最好的消除拉丝方法. 这里是 Ally McBeal 中的 隔行的例子, 以及使用 3 - Zoo To Full Frame 的结果 - 第一个去除拉丝的图像.
另一个去拉丝的方法是使用以外部插件的形式提供的过滤器(不要担心, transcode 本身已经安装了). 看看右下角, 有一个标签是 transcode options 的输入框, 所有输入到这里的参数都只是简单地传递给 transcode. 我们可以用来去拉丝. 这里是和以上一样的图像 用其他去拉丝器获得的结果. 这个去拉丝器比 3 - Zoom to Full Frame 选项要快. 如果你想使用这个去拉丝器, 只要把 deinterlace 设为 off, 然后在输入行里输入 -J dilyuvmmx.
dvd::rip 尝试自动检测你的帧率. 如果失败了你可以在这里改正. Use YUV internal 始终应该为 yes, 除非用于输出的编解码器不支持 YUV 模式. XviD 支持. 把它打开速度能提高很多. DivX multipass 也应该为 yes, 除非你只想做一个预览. 因为最终结果始终选择两遍编码. 虽然这里标记为 DivX multipass, 对于 XviD 也工作得非常好.
音频选项应该都是很明了的. 你可以选择把音频重新编码为特定比特率的 MP3, 或者使用原始的 AC3 而不重新编码. AC3 音频提供环绕音响, 只有这个好处, 但比 MP3 要大. 这就要看你自己的选择了. 如果你选择了 MP3, 那么确信 MP3 Quality 设置为 2. 根据 lame 的文档(lame 是用来进行 MP3 压缩的), 象 1 或者 0 - 最好但较慢非常慢, 但不能产生明显更好的质量. 音量重置(volumn rescale) 允许对音频进行一般化, 而不需要单独(外部)的程序. dvd::rip 自动检测音频, 提供一个重置的值.
在码率选项的右上方. 你可以通过选择你想使用的 CD 大小和个数来确定 rip 的大小. 修改 Target Size 或者 Video Bitrate 也一样. dvd::rip 自动更新下面计算出来的值, 所以找到最佳的码率非常简单. 4.2.3. 产生一个快速预览 大多数时间, 你应该让 dvd::rip 产生一个小的预览. 你可以通过提供一个 帧范围(Frame Range) 来做到. 我通常选择一个 30 秒的样品, 大概 750 帧, 25fps (<秒数> * = <要编码的帧数>), 开始于电影中的某个时间(象 200, 300 帧). 比较好的值大概在 200 - 950. 你该给 transcode 一个比较高的 nice 级别(结果是一个较低的进程优先级), 这样它就只使用空闲时间. 如果你想马上看到预览, 你可以暂时关闭 DivX Multipass. 千万记住以后要把它改回来!
当你按了 Transcode 之后, 最多几分钟以后, 你的 AVI/MPEG 就好了. 看一看吧(象 mplayer my-new-file.avi). 这个时候就该看看是否去拉丝良好, 检查一下视频音频是否同步得很好. 如果很好的话, 就行了. 如果不行, 那么请接着阅读: 4.2.4. 避免视频音频不同步 如果你的视频音频在预览中不同步(或者在你播放 DVD 本身的时候), 你可以给 transcode 一个 Frame Offset 来调整 a/v 同步. 你可以在 Transcode 页中 transcode options 输入框中输入参数 -D nr. nr 是音频延迟的帧数. 这个数字可以是负数. 在 25fps 下, 一帧是 40ms 长. 通常情况下帧长是 (1000 / fps)ms. 我的 Ally McBeal DVD 需要 -2, 是 -80 ms: -D -2. 现在重新生成你的预览视频(其他参数应该一样), 再次检查音频. 需要的时候再做, 直到满意为止. 4.2.5. 做整个事情 当预览很好的时候, 你可以开始你的转码过程了. 再次确信你的 DivX Multipass 打开了, 如果你在作预览的时候关闭过. 或者点击 Transcode 或者点击 Transcode + Split 按钮, 如果你想根据 Video Bitrate Calculation 的设置来自动分割的话. 现在就是进行社会活动的好时间了. :-) 4.2.6. 对于高级用户: transcode 命令行参数 这一节解释一下 dvd::rip 使用的一些 transcode 命令行选项. 对于转码过程来说不是特别重要, 所以你可以略过. 这是为那些想进一步了解 dvd::rip 和 transcode 是如何工作的人的.
在 dvd::rip 中按 CTRL-t 来看 dvd::rip 运行的命令是什么样的. 现在我们把注意力集中在命令的最后部分, Transcode Command. 这里是我 Star Trek: The Next Generation DVD 的一个例子, 没有 mkdir 和 cd 之类的命令:
1. transcode -i /space/tng-biggoodbye/vob/004 -w 4357,250,100 -a 1 -b 128,0,0 -s 3.311 -V -f 25 -B 12,10,8 -R 1 -x vob,null -o /dev/null -y xvidcvs,null 2. transcode -i /space/tng-biggoodbye/vob/004 -w 4357,250,100 -a 1 -b 128,0,0 -s 3.311 -V -f 25 -B 12,10,8 -R 2 -x vob -o /space/tng-biggoodbye/avi/004/tng-biggoodbye-004.avi -y xvidcvs
让我们看看第一个命令和它的参数吧:
* -i /space/tng-biggoodbye/vob/004 很明显, 要告诉 transcode 哪里能找到需要的文件. 可能是一个文件, 一个设备, 或者一个包含所需文件的目录. * -w 4357,250,100 设定视频编码参数: 比特率, 最大关键帧间隔以及匀边. * -a 1 选择音轨号 1 (从 0 开始). * -b 128,0,0 设置 lame音频编码参数: 码率, VBR 和质量. 看看 lame 文档中有关 -V 和 -q 的解释. * -s 3.311 让 lame to 调整音量大小, 这样就能实时地进行一般化(normalize). * -V 让 transcode 在 YUV 颜色空间中作图像处理. 没有 -V 图像将会转换到 RGB 颜色空间. 注意一些外部的过滤器只能处理其中的一种. YUV 处理对速度有一个很大的提高. * -f 25 设定帧率. * -B 12,10,8 设定快速拉伸选项: 图像会被缩小到 height - 12 * 8 行, width - 10 * 8 列. * -R 1 第一遍(一共两遍)编码的标志. * -x vob,null - 视频输入来自于 VOB 文件, 音频输入忽略掉(在第一遍中不需要). * -o /dev/null - 我们也不需要视频输出, 所以丢弃它. * -y xvidcvs,null - 视频输出使用 XviD, 放弃音频.
第二个命令没有什么不同. 只是跳过那些可能丢弃输出(象 -o real-filename 和 -y xvidcvs) 的选项. 完整的参考可以看看 transcode 和 lame 的 man 文档.
需要注意的最后一点是, 你可能看到 0.6.0pre6-20020529 版本的 transcode 包含了一个我写的实验性的外部模块, 来支持 libavcodec. 你可以通过 -y ffmepg4 激活它(记住: libavcodec 是 ffmpeg 的一部分)而取代你前面设置的编解码器. dvd::rip 现在还不支持(也就是说, 它不在可选的编解码器中). 4.3. 使用 MEncoder 前面已经提到 MEncoder 现在还没有 GUI 前端. 所以我不能提供抓图, 你必须手工来做所有的事情. 这是一个叫做"三遍编码"过程. 4.3.1. 对音频进行编码 第一步是只对音频进行编码. 确信你知道哪种语言是你想要的 - 你需要音频 ID (第一个流是 128, 第二个是 129等等) 或者两个字母的国家编号(英语是 en, 德语是 de 等等). 你可以在 verbose 模式下运行: mplayer -dvd 1 -v 来找出这些编码. 它可能输出很多行. 找出一些类似于下面的行: [open] audio stream: 0 audio format: ac3 language: en aid: 128 [open] audio stream: 1 audio format: ac3 language: de aid: 129 [open] audio stream: 2 audio format: ac3 language: es aid: 130 这里我找出三个音频流: 英语, 德语, 西班牙语以及他们的 ID.
现在调用 MEncoder 来对音频进行编码: nice -+19 cat /space/*vob | nice-+19 mencoder -ovc frameno -o frameno.avi -oac mp3lame -lameopts abr:br=128 -alang de - 下面是对一些命令中用到的参数的解释:
* nice -+19 - 给 MEncoder 最低的进程优先级, 这样它不会打断你的通常工作. * -ovc frameno - 视频输出编解码器是 frameno, 表示完全没有视频数据写出或者处理. * -o frameno.avi 把输出写入到叫做 frameno.avi 的文件中. 音频数据必须写入到一个 文件中, 名字必须是那个指定的名字. 因为下一步 MEncoder 会从叫这个名字的文件中读取音频 数据. * -oac mp3lame - 音频输出编解码器是 lame 编码器. * -lameopts abr:br=128 - lame 的选项. 它告诉 lame 产生平均码率为 128kbit/s 的 ABR(平均码率, 是由用户提供平均值的可变码率). * -alang de - 使用德语音轨. 另一种方法是使用 -aid 129.
等一会就得到了你的音频了. MEncoder 也输出一些对视频码率的建议: Recommended video bitrate for 650MB CD: 1845 Recommended video bitrate for 700MB CD: 1992 Recommended video bitrate for 800MB CD: 2287 可以看到这些值都很高 - 但这是因为一幕 Ally McBeal 只有 41 分钟. 我将在每张 CD 上放两幕, 把视频码率设为大概 1000. 4.3.2. 产生预览 (第一遍) 现在是决定将要使用哪种视频编解码器的时候了. 我假设 AVI 是各种不同 DivX 编码器的结果. MEncoder 支持 DivX 4 或者 DivX 5(Windows 下实际上是一样的, 你运行的是 v4 或者 v5) 以及 XviD 或者 lavc. 可能你们大多数都没有听说过 libavcodec 或者 ffmpeg-project, 我的看法是 lavc 比 DivX 4/5 要好很多, 至少和 XviD 一样好. 所以我只提供 lavc 的例子, 但你在播放的时候不需要其他它特殊的编解码器: MPlayer 播放得很好(本来就是), 在 Windows 上, 你只需要 DivX 5 (免费版本就完全足够了). 那么我们开始吧.
让我们把命令行选项一个一个地连起来.
* -oac copy - MEncoder 需要从第一遍中获取音频信息, 以保证音频/视频同步. 这里一定不要 用 -nosound, 虽然我在本指南的以前版本中是这样建议的. 如果你需要技术细节, 看看 * MPlayer 的邮件列表. -o /dev/null - 第一遍的输出也不需要, 直接跳过. * -ovc lavc - 选择 lavc 作为视频输出的编解码器. * -lavcopts vcodec=mpeg4:vbitrate=1000:vhq:vqmin=2:vqmax=31:vpass=1 - libavcodec 实际上支持一大把 不同的编解码器. 使用 vcodec=mepg4 我们就选择了 MPEG4 兼容的编解码器. vbitrate=1000 是 希望的码率. vhq(Very High Quality) 告诉编码器要花费大把时间来优化结果. 这很值得. vpass=1 最后告诉编码器这只是第一遍. 使用 vqmin 和 vqmax 告诉编解码器视频压缩的最少和最大 到什么程度. 保持缺省值(查看 man mencoder)很大程度地限制了输出码率, 所以我建议把范围设大点. 注意我没有进行量化比较. 如果我错了, 请告诉我. * -vop scale=640:480 - 把图像向下拉伸到 640x480 象素. 我阅读了邮件列表说已经有了一个新的选项, 来自动根据宽度计算高度, 或者其他方法来保持屏幕纵横比. 我自己没有试过, 不过看起来应该是这样: vop scale -xy 640. 注意虽然有可能需要真正地放大图像, 但我强烈建议不要这样. 有几点坏处: 编码器需要更多的位数 来得到和小一些图像相同的质量, 并且在播放的时候进行向上拉伸, 你可能得到混乱的图形( Peter Schuller 向 我报告了这样的情况). 始终要向下拉伸. * 如果你的图像是隔行的, 你可以用 -npp lb 来去拉丝. * 我们只需要一个预览, 所以提供了起始位置和长度: -ss 0:20 指定电影中的第 20 秒作为我们的 开始, -endpos 0:30 是说我们需要处理 30 秒的数据. 这个参数的名字很糟糕, 因为它实际上不是结束 位置, 而是持续时间.
所有的参数放在一起, 整个命令就是: nice -+19 mencoder -oac copy -o /dev/null -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=1000:vhq:vpass=1 -vop scale=640:480 -npp lb -ss 0:20 -endpos 0:30 /space/first.vob 4.3.3. 产生预览(第二遍) 这一步中我们保留前一个命令的大部分. 当然要把 vpass=1 改为 vpass=2 来告诉编码器这次是第二遍. 当然这次我们应该把最后的输出保留, 把 -o /dev/null替换为有用的东西, 比如: -o ally-preview.avi.
下面就是所用的命令行: nice -+19 mencoder -oac copy -o ally-preview.avi -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=1000:vhq:vpass=2 -vop scale=640:480 -npp lb -ss 0:20 -endpos 0:30 /space/first.vob MEncoder 做完之后, 看看产生的预览. 需要的时候调整参数, 重新再做一个预览, 直到你满意为止. 4.3.4. 产生最后的 AVI (两遍都有) 最终的选项只是简单地把 -ss 和 -endpos 去掉. 不幸的是 MEncoder 不能处理多个输入文件. 这就是 cat 要做的. 只要输入: cat /space/*vob | nice -+19 mencoder -oac copy -o /dev/null -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=1000:vhq:vpass=1:vqmin=2:vqmax=31 -vop scale=640:480 -npp lb - cat /space/*vob | nice -+19 mencoder -oac copy -o ally.avi -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=1000:vhq:vpass=2:vqmin=2:vqmax=31 -vop scale=640:480 -npp lb - 注意 -ss 似乎不能与 cat *vob | mencoder... 等协同工作. 所以为了产生预览, 只指定第一个 vob 作为命令行的最后一个参数(请往上查看).
现在拿杯啤酒, 好好看看书吧. |
|