『漫游』酷论坛>『DVDRip技术研修室』>[转贴]在 Linux 下进行 D ..

[转贴]在 Linux 下进行 DVD ripping 和转码

hiei@2004-02-28 07:26

原文可以在这里找到: http://supermmx.dhs.org/linux/dvdrip/zh/separate/

1. 介绍
你已经买了一个新的闪闪发光的 DVD. 你可能会想它最终可能会坏, 想在任何情况下都确信仍然能有一份电影的拷贝. 但怎么才能把它从一张巨大的 DVD 弄到一个小小的 CD 中呢? 当然质量还要不错, 对吗? 只要接着阅读就行了

注意! 这份指南不是写给懒人的, 包括许多需要编译源码, 安装软件, 在命令行下做事情的工作. 如果你不知道如何 configure; make; make install, 那么请阅读其他文档学习. 如果你不想学的话, 请安装 Widnows, 使用那些 Windows 上强大的 DVD Rip 工具. 我可不想引起一场 "Linux vs Windows" 的论战. 事实就是这个过程(DVD Rip)在 Linux 上确实困难一些. 你仍跟着我吗? 很好! 你正要踏上通往一个非常美丽的土地的旅途...

这份指南的作者是 Moritz Bunkus 翻译: SuperMMX
引用

hiei@2004-02-28 07:27

2. 需要的软件
首先让我介绍一下你将用到的一些工具.

* MPlayer 是一个多媒体播放器, 支持很多种文件格式和媒体编码解码器: MPEG1, AVI(包括所有 Windows 编码解码器, 所有 DivX 编解码器), DVD, VCD, SVCD 等等. 我用它观看所有类型的文件.
* MEncoder 是 MPlayer包的一部分, 用来对视频和音频进行编码. 它也能对 DVD 进行转码.
* transcode是一个工具集, 可以从许多格式转换到需多种其他格式, 包括从 DVD 转到 AVI 或者 (S)VCD.
* 你知道大多数 DVD 都是加过密的. libdvdcss 是用来对 DVD 内容解密的一个库
* DVD 包含有关标题(title) / 章节(chapter) / 角度(angle) 和声音语言的信息. 这些信息保存 在 .IFO 文件中. libdvdread 用来解析这些文件, 提取出所需要的信息.
* lame (Lame Ain't an MP3 Encoder) 把 MP2/WAV 音频编码成 MP3 格式.
* vobcopy 可以用来拷贝 DVD 上的 VOB 文件. 解密是实时进行的.
* dvd::rip是一个 transcode 的图形界面前端.

我会给你演示两种 DVD 转码的方法: 使用 MEncoder 和使用 transcode. 然而两种方法都可能需要一些文件.

2.1. 有关编解码器
在理想世界中, 只会有一种编解码器 - 最好的一个. 但这个世界还远远不够理想. 结果就是有一大堆视频和音频的编解码器可以选择. 首先我要解释一下不同类型的编解码器.

* 本地编解码器 是一般的 Linux 二进制文件(通常是共享的对象, libCODECNANE.so). 对它们的支持正在试验中.
* Windows 编解码器 是原始的或者是稍微修改了的 Windows 动态连接库(DLL, AX 或者其他). 这些编解码器不会在 Linux 上直接工作 - 你需要一个特殊的库才能使用这些编解码器. 这个库 叫做 avifile. 几个月前这还是在 Linux 下看 AVI 的唯一方法.

现在大多数编解码器都会带一个 Linux 版的本地版本(象 XviD, DivX 4/5 以及其他).

这里是支持的视频编解码器的一个列表: 

* MPEG4 是一个官方的视频压缩标准. 没有一个编解码器的名字简单地叫做 MPEG4. 你如果说 MPEG4, 你不是在说某一种编解码器 - 你是在说视频压缩的一套技术. MPEG4 兼容(compliant) 指的是一个编解码器产生的文件可以被其他 MPEG4 兼容的编解码器播放
* DivX ;-) 是"原始"破解出的 Microsoft MPEG4 编解码器, 引起来 rip 狂潮. 它没有全部支持 MPEG4 所有特性, 象 b-frame
* * 或者全局运动补偿(GMC *). 仍有人在 Windows 下配合非常好的工具 Nandub 使用它. 在 Linux 下很少使用, 因为还有其他的编解码器能提供更好的质量. 它是以 Windows 动态链接库 (divx.dll 以及其他)而给出的, 需要 avifile. DivX 4 和 5 是官方的成功者. DivX 5 取代了 DivX 4. 这就是为什么你不能同时安装他们的原因(当然技术上来说可以, 由于明显的原因, 你不应该). 这些都是 Linux 本地共享库, 叫做 libdivxdecore.so 和 libdivxencore.so. 这是封闭源码的. 对 Windows, 有各种版本可用, 只有商业版本支持所有的编码选项, 象 b-frame*, GMC* 或者 1/4 PEL*. 免费的版本也可以看所有的文件, 甚至是使用商业版本创建的. 不幸的是, 只有 Linux 下的免费版本不支持所有这些很好的选项. DivXNetworks 正在考虑也给 Linux 提供一个商业的解决方案. 但不要期望很快就能得到.
* XviD (它来自于 DivX 从后往前的读法) 是一个开放源码的 MPEG4 的实现, 很好地考虑了压缩和图像质量. 对 MPEG4 的高级特性 (b-frames*, GMC*) 正在做或者已经实现了.
* libavcodec 或者缩写 lavc 是另一个开放源码的 MPEG4 兼容的视频编解码器, 在性能和质量上优于 DivX 5 甚至 XviD. 这个编解码器支持 b-frames*. 是 ffmpeg 项目的一部分.
* 当然还有用于 VCD 的 MPEG1 兼容的编解码器, 和用于 SVCD 或者 DVD 的 MPEG2 兼容的编解码器. 这个时候这份指南定位在产生 AVI, 所以我不会说太多有关这些太细节的东西
* 多数其他的编码器要么过时了(象 Intel Indeo 5) 要么是 Mircrosoft 的 MPEG4 编解码器的其他破解版本 (象 AngelPotion). 也有一些编解码器正在紧张开发中(象 VP4), 暂时还不能给我们一个可用的方案.

这份指南想要集中在两个编解码器上: XviD 和 lavc. 原因是这两个都提供了很优秀的质量, 都很快, 都只需要一个 MPEG4 兼容的解码器(象 DivX 5 或者 XviD) 就能在 Windows 上进行播放. 在 Linux 播放一点问题也没有 - MPlayer 或者 Xine 能很好地播放使用 DivX 4/5, Xvid 以及 lavc 编码的电影.

又是一个列表, 这次是音频编解码器:

* MP3 是 MPEG1 layer 3 的缩写, 是音频压缩的官方标准. 如果你说 MP3, 实际上你是在说一种 压缩技术, 不是某一种编解码器. 有许多 MP3 的编解码器, 我能数上一整天.
* lame 是 "Lame Ain't an MP3 Encoder" 的缩写(实际上它是 ;-)). 它提供了一个可以产生高质量 MP3 文件 的编码器. transcode 和 MEncoder 都使用 lame 来进行音频压缩.
* AC3 是另一种音频压缩的官方标准. 几乎所有的 DVD 都包含 AC3 编码的音频. 现在 Windows 和 Linux 上都有能从 AVI 中播放 AC3 音频的解码器. 优点是不需要重新压缩(重新压缩通常会损失质量), 和多声道音频(杜比环绕或者类似)仍然会保留. 缺点是 AC3 音频比 MP3 编码的音频占用更多空间
* Vorbis 是一种新的开源的音频压缩标准. Windows 和 Linux 上都能得到. 它的优点是更好的质量: 相对 于 MP3 的压缩比和多声道的支持. 不幸的是你不能安全地在 AVI 文件中包含 Vorbis 音频 - 但是我现在 正在做一个工具, 能够在一个 OGG 容器中把视频和 Vorbis 音频结合起来. 一旦准备好了, 我就会在这份指南中包含.

我希望这能使事情更清晰一些.
2.2. 通用库 / 编解码器
我不会在这节中讲太细, 有更多的文档来说明怎么安装这些包. 如果你有问题可以参考那些文档. 也要注意: MPlayer 对于 gcc, binutils 以及其他系统核心部分的版本有更严格一些的要求. 请参考 MPlayer 安装文档.

注意: 在下载软件之前, 检查一下你的发行版是否已经包含了这些软件. 我用的是 Debian Woody (tesing), 发现有许多软件已经是可用的.

* libdvdcss - 去 the Ogle project page 并下载 libdvdcss-0.0.3.ogle3.tar.gz (注意版本号可能会不同, 因为软件总在开发中 解压, 编译, 安装到 /usr/local
* . 请注意这个库有很多版本(0.0.3, 1.0.1). MPlayer 仍建议使用 0.0.3. libdvdread - 象 libdvdcss 一样在同一网页得到. 注意 Debian Woody 已经包含了 libdvdread. 简单的命令 apt-get install libdvdread2 libdvdread2-dev 应该就可以了.
* XviD 编解码器 - 如果你想使用 transcode 就需要. 从 MPlayer 文档中摘出的简短介绍:
o cvs -z3 -d:pserver:anonymous@cvs.xvid.org:/xvid login 当要求输密码时敲回车.
o cvs -z3 -d:pserver:anonymous@cvs.xvid.org:/xvid co xvidcore
o cd xvidcore/build/generic
o 修改 Makefile.linux 来适合自己的需要.
o make -f Makefile.linux
o 把xvidcore/src/divx4.h 文件拷贝到 /usr/local/include/decore.h 以及 /usr/local/include/encore2.h 中. 记着要对你要改写的文件作备份.
o 把libxvidcore.so 和 libcore.a 拷贝到 /usr/local/lib/
编译的时候你可能需要 nasm 的特殊版本, 你可以在 这里得到.
* vobcopy - 可以在它的 主页得到.
* avifile - 就象以前解释的, 需要它来访问那些没有 Linux 本地版本的 Windows 编解码器, 可以去它的 主页. 做之前再检查一次, 你的 Linux 发行版是否已经提供了 avifile (Debian Woody 是这样). 你也需要 Windows 编解码器, 可以在 avifile主页或者直接在 MPlayer 的主页得到.
* DivX 5 - 虽然这份指南不关注于 DivX 5, 你可以在 http://www.divx.com/ 得到. 如果你还有空余时间, 你可以比较一下 DivX 5 和 XviD 或者 lavc, 自己看看它比不上后两个编解码器.

2.3. MPlayer
你需要 MPlayer. 你以后是否使用 MEncoder 或者 transcode 不重要 - 你仍然还需要. 所以从 http://www.mplayerhq.hu/ 获得 MPlayer. 我更喜欢 CVS 版本, 因为它经常会有一些正式发布中没有的特性! 实际上我的这份指南就是基于前几天(今天是 2002 年 4 月 30 号)刚刚提交到 CVS 的一些特性之上的. 照着做吧 - 勇敢地获取 CVS 版本. 如果你想使用 MEncoder 编码, 我建议也得到 libavcode 的一个版本来作编码. 如果你使用 MPlayer 的 CVS 版本, 就直接下载吧. 已经包含了打好包的 libavcodec. 一些从 MPlayer 文档中摘取的介绍:

* 从 CVS 中倒出 ffmpeg 项目: cvs -d:pserver:anonymous@cvs.ffmpeg.sourceforge.net:/cvsroot/ffmpeg login. 当要求输入密码的时候敲回车.
* cvs -d:pserver:anonymous@cvs.ffmpeg.sourceforge.net:/cvsroot/ffmpeg co ffmpeg
* 把 Ffmpeg 源码中的 libavcodec 目录移到 MPlayer CVS 树中的根目录. 符号链接不够, 你必须拷贝/移动它!!!

编译时候注意一点: 确信 没有包含 XviD 的支持. 而要包含 libavcodec 的支持. 安装指南在 MPlayer 文档中有提供. 要阅读正确: 编译 transcode 支持 XviD 以及 MPlayer 不支持 XviD 但 支持 libavcodec. 原因是 MPlayer 不能同时支持具有相同变量名的两种编解码器
2.4. transcode
从 它的主页上可以得到 transcode. 确信编译的时候支持 XviD, 以及对 MPlayer 后处理功能的支持. 我再一次建议选择 CVS 版本

另外, 你应该想要下载 dvd::rip, 一个基于 Gtk+ 的 transcode 的前端. 从 这里可以得到. 也包含了安装文档.
2.5. 获取 RPM
我知道至少有两个地方你可以得到这里提到的软件的 RPM 包:

*
* Penguin Liberation Front lair - RPMs for Mandrake http://www.piorunek.pl/~dominik/linux/pkgs/mplayer/ - RPMs for Redhat 7.2
引用

hiei@2004-02-28 07:28

3. 对 VOB 文件进行 Rip
这步相当简单. 所有你需要的就是一些空余空间(实际上是许多空余空间), 根据你需要转什么样的码, 你应该有 10G 的空余空间可用. 如果你不想花钱买个新硬盘的话, 它们现在可是非常便宜的(一个 80G 的硬盘大概 150€).

在做任何事之前考虑一下区码. 现在所有的驱动器都有 RPC 模式 2 的保护 - 意味着你的区码在锁住之前只能换 5 次. 你可以在 数字文摘上得到一些如何去除区码的信息. 为什么我要提到这些? 下面提到的 Rip 方法依赖于你的区码(也就是和放进去的 DVD 一样)或者完全没有区码. 所有的错误信息都很诡异, 当你 Rip 失败的时候错误信息常常不太明白地表示是与区码相关的. 所以要注意.

首先测试一下 DVD. 启动 MPlayer, 观看第一个标题: mplayer -dvd 1. 喜欢吗? Cool. 确信你记得视频是否是 隔行 的(看下面). 关闭 MPlayer.

3.1. 隔行的视频
你在电视中看到的并不是每秒 25 帧. 实际上你看到的是每秒 50 个半帧(我这里指的是 PAL - NTSC 帧率是 29.97 或者差不多每秒 60 个半帧). 一帧包含奇数行, 一帧包含偶数行. 这样你就得到了 25 fps. 问题就是那些半帧是从不同的时间拿到的. 如果水平运动比较快, 你会看到一个物体(或者人)偶数行在一个位置, 奇数行在另一个位置. 这些垃圾你可不想在最后的视频中看到吧. 现在看看从我的 Ally McBeal DVD 中截到的隔行的照片. 使用合适的过滤器, 就可以消除掉隔行的影响(叫做去拉丝 de-interlacing, 是不是很有意思?). 还有一张 去除拉丝的相同照片.

现在你已经知道了隔行到底看起来什么样, 你就应该能自己判断你的 DVD 中是否包含隔行的东西了.

在指南的剩余部分, 我作如下假设:

* DVD 驱动器是 /dvd. 在 /etc/fstab 中有 /dvd 的一项.
* 在 /space 中有许多空余空间.
* 你的 DVD 中的标题 1 是你所需要的 (Robos, vobcopy 的创作者, 告诉我大多数 DVD 的主标题号 都是 2 . 你的可能不一样.).

用你自己系统中的路径代替这些路径. 有许多方法可以 rip VOB. 我会给出两种: 用一个命令行工具 (vobcopy) 以及使用 transcode 的 GUI dvd::rip. 你不必两个都做.
3.2. ...使用命令行界面
现在运行 vobcopy. 它会自动把属于有最多内容的标题的 VOB 文件拷贝到你的硬盘上.

* 首先, 挂载你的 DVD: mount /dvd
* 让 vobcopy 抓取这些 VOB: vobcopy -i /dvd -m

这就把 VOB 从 DVD 上拷贝出来, 进行解密(这就是需要 libdvdcss 的地方), 把它们写到当前目录(你可以使用例如 -o /space 来指定). 它们的名字由 DVD 的标题来命名.(例如, 我得到了 ALLY_MCBEAL_DISC21-1.vob, ALLY_MCBEAL_DISC21-2.vob 等等). -m 选项让 vobcopy完全镜像 DVD 的所有内容, 包括 .IFO 文件 - 非常有用, 因为你能用这些本地拷贝, 让 MPlayer 或者 transcode 觉得它就是一个真正的 DVD. 这会花很长时间. 只需要耐心.

作者(Robos)的提醒: 当处理角度的时候, vobcopy 可能会有问题. 你可能会得到重复的场景, 例如 "The Matrix". 我正在做.

Robos 的另一个提醒: 现在有了新的工具, 叫做 dvdbackup 也能拷贝 DVD.
3.3. ...使用 dvd::rip
dvd::rip 也可以做相同的工作.
敲入 dvdrip 启动 dvd::rip. 你就能看到主窗口. 选择 Edit / Preferences, dvd:rip 会弹出设置对话框. 这里你需要输入你的路径. 第一个是 DVD 设备的路径, 而不是挂载点的路径. 通常是 /dev/dvd, 符号链接到真正的设备上, 比如 /dev/hdc.

关闭对话框. 开始一个新项目 (File / New Project). 会弹出 storage tab. 再一次输入正确的路径. 注意当你改变项目题目的时候其他名字框是如何改变的.

切换到 Rip Title tab, 按下 Read DVD Table of Contents 按钮. 一两秒钟以后, 下面的列表就会列出 DVD 里存储的所有标题. 选择你想要 rip 的标题(你可以按住 CTRL 点击来同时选择多个标题). 选择语言和角度. 让 Specify Chapter Mode 为 No. 最后一步: 按下 Rip selected Title(s)/Chapter(s). 再一次需要耐心. 喝点牛奶. 和你的女朋友好好聊聊天.

dvd::rip 的剩余部分会在 第 4 章 中说明.
引用

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 作为命令行的最后一个参数(请往上查看).

现在拿杯啤酒, 好好看看书吧.
引用

hiei@2004-02-28 07:30

5. 字幕
在 DVD 中, 字幕以图片格式存储, 播放的时候由你的播放器把它在电影前面显示. 这样作者就有很多选择来决定字幕到底什么样(这也就使亚洲语言更容易实现一些). 对于我们, 这种方法可能会是一个问题, 也可能不是 - 依赖于我们要把字幕包含在图像中或者是作为单独文件/流.
5.1. 把字幕转换为文本格式
很多时候你并不想被强迫看到字幕. 如果编码时把字幕包含在图像中那就不可能了. 你必须把字幕从 DVD 释放到一个外部文件/流中, 我们就能激活它(或者不). 我将描述一下广泛使用的把 DVD 字幕转换成文本格式的过程. 文本字幕可以很容易地由播放器拉伸(通过选择合适的字体), 它们也非常小(通常小于 100 KB).

要做这些, 你必须要有 transcode 和它的源码. 你需要 transcode 中的 tccat 和 tcextract, 以及 transcode 源码中 transcode/contrib/subrip 下的一些文件.
5.1.1. 编译需要的工具
不幸的是, 我所知道的二进制包(RPM, deb)都不包含 subrip, 所有我们不得不自己编译和安装它. 不过确实相当简单.

1. 确信你的系统中安装有 gocr 和 ispell. 大多数现代的发行版上都有. 如果你的发行版没有包含 gocr, 就去
2. 它的主页吧. 进入 subrip 的源码目录(cd transcode/contrib/subrip), 调用 make.
3. 把 srttool, subtitle2pgm 以及 pgm2txt 拷贝到你的 PATH 的一个 目录中.
4. 如果你的 gocr 不支持 -p 选项, 你可能需要修改 pgm2txt 脚本: 在最后, 有 两行包含 -p ${DBPATH}. 只要去掉就可以了(在查阅 gocr 的 manpage 之后).

5.1.2. 提取出字幕流
这里我假设你已经用 vobcopy -m 把 DVD 拷贝到硬盘上了, 意味着它已经被完全镜像, 包括 .IFO 文件. 如果没有的话, 你必须调整你的原始资料.

首先让我们看看有哪些可用的字幕. 我们可以使用 mplayer 来完成这个任务:
mplayer -dvd-device /space/st-tng/disc1/ -dvd 1 -vo null -ao null -frames 0 -v 2>&1 | grep sid
这就使 mplayer 只输出有关原始资料的许多信息, 而完全不播放. 它应该给出一个字幕的列表:
[open] subtitle ( sid ): 0 language: da
[open] subtitle ( sid ): 1 language: de
[open] subtitle ( sid ): 2 language: en
[open] subtitle ( sid ): 3 language: es
[open] subtitle ( sid ): 4 language: fr
[open] subtitle ( sid ): 5 language: it
[open] subtitle ( sid ): 6 language: nl
[open] subtitle ( sid ): 7 language: no
[open] subtitle ( sid ): 8 language: sv
[open] subtitle ( sid ): 9 language: en

现在我们有了我们想要的那种语言的 sid (subtitle ID), 就可以启动 transcode 工具, 让它们提取出原始的字幕流:
tccat -i /space/st-tng/dic1/ -T 1 -L | tcextract -x ps1 -t vob -a 0x22 > subs-en
-a 0x21是字幕流的十六进制数字: 0x20 + sid. 这里我用的是英语字幕.
5.1.3. 转换原始字幕流
Ok, 我们已经有了原始的字幕流 - 但我们能做什么呢? 首先要把每个字幕条目转换为一张图片. 可以通过
subtitle2pgm -o english -c 255,255,0,255 < subs-en
来简单做到. 使用 -c 你可以指定在转换中所用的灰度级. 目的是让 gocr 要做的工作尽可能的简单. 可能你不得不对这些参数做些试验, 不过也很简单. 我拿我的 Star Trek - The Next Generation DVD 做了下面的一些例子:

*
* -c 0,255,255,255 - 这个显然是错误的. -c 255,0,255,255 - 这个看起来不错.
* -c 255,255,0,255 - 我们不能要这个.
* -c 255,255,255,0 - 也不能要这个.

就象你看到的, 我们需要一张不好汉字符轮廓的图像.

subtitle2pgm 创建了很多图像 - 每个字幕一个, 以及一个控制文件, 我的例子叫做叫做 english.srtx, 包含了每个字幕的持续时间. 下一步是让 gocr 识别出文本:
pgm2txt english
警告 - gocr 会经常问你那些它不能识别出的字符. 这是通常情况. 一旦做完了, 你应该对所有新产生的文本文件运行 ispell :
ispell -d american english*txt
当然要根据你的需要调整语言.

最后一步是让 srttool 把实际的文本包含进.srtx 文件:
srttool -s -w < english.srtx > english.srt

好了, 你已经拿到一个字幕. 你可以看看:
mplayer -sub english.srt mymovie.avi
引用

hiei@2004-02-28 07:30

6. 额外的技巧
在视频产生时候还有更多的话题.
6.1. 修正不同步的音频
这个方法不能处理使用 VBR/ABR MP3 的 AVI. 这一步使用 avisync, 是 transcode 包的一部分. avisync 很容易使用: 只要提供一个输入文件(-i name.avi), 一个输出文件 (-o newname.avi), 以及同步的帧偏移(-n count). 从 avisync 的帮助中看到: count>0: 音频开始于第 'count' 帧. count<0: 音频提前 'count' 帧. 一个例子:
avisync -i ally-not-synched.avi -o ally-synched.avi -n -2
6.2. 分割 AVI
这也不能处理使用 VBR/ABR MP3 的 AVI. 这一步使用 avisplit, 是 transcode 包的一部分. 只能用它处理由 transcode 产生的 AVI. avisplit 很容易使用: 只要提供一个输入文件(-i name.avi), 以及在什么位置分割. 你可以在一个固定的大小处分割(-s size_in_megs), 在一定数目的帧之后分割(-f f1-f2), 或者是多少秒之后分割(-t s1-s2). 一个例子:
avisplit -i ally-big-file.avi -o ally -s 700
会产生叫做 ally-0000.avi, ally-001.avi等等的文件, 每个最多 100M.

6.3. 从 VOB/MPEG/AVI 中提取音频
MPlayer 能用来很简单地提取音频. -vo null 选项告诉 MPlayer 不要显示视频.

* VOB -> AC3: mplayer -vo null -nogui -alang de -dumpaudio -dumpfile lang-de.ac3 *vob
这就会把德语音频提渠道一个叫做 lang-de.ac3 的文件中.
* VOB -> WAV: mplayer -vo null -nogui -aid 128 -ao pcm -aofile lang-de.wav *vob
这会提取出 no.128 音轨, 把 AC3 转换成 PCM, 把结果写入 lang-de.wav 文件.
* MPG -> MP2: mplayer -vo null -nogui -dumpaudio -dumpfile audio.mp2 myvideo.mpg
这会把音频提取到一个叫做 audio.mp2 的文件中.
* AVI -> WAV: mplayer -vo null -nogui -ao pcm -aofile audio.wav myvideo.avi
这会把音频提取出来, 转换成 PCM, 把产生的 .WAV 结果写出到 audio.wav 中.

我不会列出所有可能的选项. 如果你想提取出音频而不处理的话, 通常使用 -dumpaudio -dumpfile newaudio.extension, 如果你需要 WAV 本身的话, 使用 -ao pcm -aofile newaudio.wav.
6.4. 使用分离的音频文件
有时候你需要把一个单独的音频文件和你的视频一起播放. MPlayer 可以很容易地做到: mplayer -audiofile anotherlang.mp3 myvideo.avi, 从 myvideo.avi 中播放视频, anotherlang.mp3 中播放音频. 许多 Windows 上的媒体播放器也都支持外部的音频文件. 用这种方法, 你可以用分离的音频文件来提供几种语言版本. 一种常用的组合是 AVI 中包含英语音轨, 以分离的文件提供额外的音轨.
6.5. 一个可视的 AVI 编辑器: avidemux
如果你以前做过视频编辑, 你可能知道优秀的开放源码的编辑器 VirtualDub. Linux 下一个开源的工具 avidemux, 目标是给用户提供一个类似的特性集合. 你可以用它从一部电影中切割出某一个部分, 应用过滤器, 重新对电影进行编码, 还可以做更多. 我建议你看看, 甚至命令行对你跟对我一样是与生俱来的.
引用

hiei@2004-02-28 07:31

7 链接
7.1. 库, 编解码器

* libdvdread 和 libdvdcss:
* http://www.dtek.chalmers.se/groups/dvd/downloads.shtml DivX 5: http://www.divx.com/
* XviD: http://www.xvid.org/
* ffmpeg (libavcodec 的老家): http://ffmpeg.sourceforge.net/

7.2. 媒体播放器

* MPlayer:
* http://www.mplayerhq.hu/ Xine: http://xine.sourceforge.net/
* Ogle: http://www.dtek.chalmers.se/groups/dvd/index.shtml

7.3. 媒体编码器

* MEncoder (MPlayer 的一部分):
* http://www.mplayerhq.hu/ transcode: http://www.theorie.physik.uni-goettingen.de/~ostreich/transcode/
* dvd::rip (transcode GUI 前端): http://www.exit1.org/dvdrip/
* 为 transcode 写的一些 Perl 脚本: http://www9.informatik.uni-erlangen.de/~Vogelgsang/bp/tctools.html

7.4. 其他文档
MPlayer 和 transcode 都带有标准的 Unix man 帮助: man mplayer, man mencoder 以及 man transcode 就会显示这些帮助页面. 额外提供的 -h 或者 --help, 作为唯一的命令行参数, 也会给你列出一些命令行选项(可能不完全).

* MPlayer 的文档:
* http://www.mplayerhq.hu/DOCS/ transcode 的文档及例子 : http://www.theorie.physik.uni-goettingen.de/~ostreich/transcode/examples.html#top
* 网络中最好的关于 DVD Rip 及转换的地方就是 doom9. 虽然它集中于 Windows, 但它仍然提供了很多有关 DVD, 编解码器的一般知识. 它的论坛也是非常好的. 如果 你确实对视频处理有兴趣, 这就是你需要的地方.

7.5. 邮件列表
我强烈建议你 搜索/浏览 邮件列表来寻找信息, 并且订阅. 许多信息在那里可以找到但是并没有放入主要文档或者是命令行的参考中.

* MPlayer 用户邮件列表:
* http://mplayerhq.hu/mailman/listinfo/mplayer-users MPlayer 开发者邮件列表: http://mplayerhq.hu/mailman/listinfo/mplayer-dev-eng
* transcode 用户邮件列表: http://www.theorie.physik.uni-goettingen.de/pipermail/transcode-users/
* dvd::rip 邮件列表: http://www.exit1.org/dvdrip/list.cipp
引用

hiei@2004-02-28 07:31

8. 术语字典
8.1. CBR, VBR and ABR
这三个缩写代表: Constant Bit Rate, Variable Bit Rate 和 Average Bit Rate.

使用 CBR 编码器在每一帧中使用相同数量的位数, 而不管实际需要多少. 它有一个缺点, 举个例子, 全黑的图片或者一个静音的音频帧可能会浪费很多位, 但包含很多元素的图像或者音频帧可能得益于这点.

VBR 是使用它需要的位数. 所以全黑图像占用非常少的位数, 复杂的图像占用它们所需要的位数. 虽然这提供了最好的质量, 但是最终大小完全不能预测.

这就是 ABR 到来的原因. 你指定你想要获得的平均码率, 编码器来分配可用的位. 它从黑色图像中节省下来的位可以加到复杂图像中. 它是质量和大小预测的一个折衷.

8.2. 全局运动补偿(GMC Global Motion Compensation)
全局运动补偿 (GMC)对于放大(镜头移近)和漫游(镜头旋转)有帮助, 要求物体在形状上不变, 只是大小和在图像中的位置改变. 如果要压缩自然类的电影或者风景类的, 建议使用 GMC.

8.3. 加边框(Letterboxing)
可能你已经注意到了, 有时候视频在编码之前被一些黑框包围着. 这过程叫做加边框. 对于一些播放器它可以帮助保持正确的屏幕纵横比. 其他的把黑框用于字幕显示. 缺点是这些边框增大了图像, 就需要更多的带宽来编码, 虽然全黑的部分不需要很多的空间 - 但是从图像到黑框的过渡确实需要很多本来可以用到其他的地方的位.
8.4. P/I/B-帧, GOP
这是从 doom9的论坛中摘取出来的:

This is a quick explanation of an MPEG "GOP", or, "Group Of Pictures".

这是一个有关 MPEG "GOP", 也就是 "Group Of Pictures" 的快速介绍:
GOP:

* 以一个 "I" 帧开始, 通常下面跟一些 "P" 帧和 "B" 帧.
* 每个 GOP 都是独立的: 所有需要预测的帧都包含在每个 GOP 中.
* GOP 最小可以是一个单独的 I 帧, 最大是想要多大就有多大, 但通常对于 MPEG2 长度上不超过 15 帧. MPEG4 的 GOP 最大可以和最大关键帧间隔(通常是 200 - 300 帧)一样大. 大多数编解码器都允许 GOP 无限长.
* GOP 越长, 越有效, 编码就越不健壮.

I 帧:

* "Intra-coded" 帧: 平均 7:1 压缩率.
* 跟 JPEG 一样, 每个视频帧分成 8x8 象素的块: Y, R-Y, B-Y.
* 这些块组成 16x16 的 "宏块(macroblock)".
* 标准上提到: 宏块水平组成片(slice), 具有相近的平均块级(average block level), 但是真正的编解码器不需要 遵循这个规则.
* 标准又提到: 多个片组成一个帧, 这些帧就是结果的 "I" 帧, 同样编解码器也会真正地遵循.

P 帧:

* P 帧基于前面的 I 或者 P 帧来预测, 再加上变化了的宏块的增加部分.
* 平均大约 20:1 的压缩率, 或者是 I 帧的一半.

B 帧:

* 双向预测帧是基于前面或者后面的帧宏块的出现及其位置的.
* B 帧需要的数据空间比 P 帧更小, 平均大约 50:1.
* B 帧需要更多的解码器缓冲内存, 因为在重建过程中要比较两帧.
* B 帧也需要按编码的顺序来处理: 从编码到解码过程中的帧不是按照播放的顺序的.

对于一个 P 帧中的每一个宏块, 编码器要决定它是否知道这个块是从来自前面的帧或者完全是新的. 在前种情况下, 它只对于不同部分(INTER 模式)进行编码. 后种情况它对整个宏块编码(INTRA 模式).

B 帧的情况类似这样: "我不知道这个块" (INTRA 模式), "我知道这块是来自以前的 I 或者 P 帧(backward 模式)", "这个块看起来好象是后面的帧(forward 模式)" 或者 "这块看起来象是前面帧和后面帧的混合(双向模式)".

MPEG1 GOP 始终是 "IBBPBBPBBPBB" (这是这些帧显示的顺序, 而不是它们编码/保存的顺序). MPEG2 GOP 也一样. 它们可能包含 3 个 B 帧. DivX5 MPEG4 编解码器只使用 "IBPBPBPBPB", 因为这很容易实现, 也因为 MPEG4 编解码器对于 B 帧的支持非常新. 期待着在将来看到更多的 B 帧吧.

8.5. 1/4 象素 Quarter Pixel (QP)
1/4 pel 或者 1/4 pixel 在处理宏块的时候对精度有影响. DivX 4 使用半象素 (1.5, 1.5); 1.25, 1.75 等等开始在 DivX 5 中出现. 把一个图形分割成宏块的传统方法是基于整数的 - 16x16 或者 8x8 - 使用来自叫做虚拟块的追加信息. 这就使图像中对象的运动重现更真实.
引用

hiei@2004-02-28 07:32

9. Changelog
TODO list:

* Add chapter about subtitles and letterboxing
* Add chapter about DVD -> (S)VCD transcoding
* Add more documentation about what to clip when you have letterboxed material
* Add information about using DivX5 despite its inferior quality because a lot of people want to use it :)
* Add chapter about including multiple audio tracks in an AVI

August 23, 2002:

* Changed the mencoder command line from -nosound to -oac copy.
* Added a hint about avidemux in the 'tricks' chapter.
* Added -m to vobcopy's command line.
* Finally changed my recommendation from vqmin=1 to vqmin=2 as lavc might produce buggy files with 1.
* Fixed a lot spelling mistakes (thanks to ispell :)).

June 3, 2002:

* First translation of this guide into German by
Nicolai Lissner

June 3, 2002:

* Changed mencoder ... /space/*vob to cat /space/*vob | mencoder ... - for the audio processing (thanks to E. Kevin Hall).
* Added a note about region codes as they are a source for cryptic error messages during the ripping process (thanks to Bradley Alexander).
* Added a note about transcode's new export module for libavcodec, export_ffmpeg4.

May 5, 2002:

* Fixed the glossary entry about P/I/B frames and GOPs (thanks to Christoph Lampert)
* Added a subchapter about aspect ratios (thanks to Christoph Lampert)
* Fixed some typos (VBR -> ABR and others, thanks to various readers who reported them)
* Fixed mencoder command lines for multiple vob files (thanks to Christoph Terhechte and Frank Otto)

May 3, 2002:

* Fixed vpass=1 which should be vpass=2 in several places (thanks to Markus Liebl)

May 2, 2002:

* Added explanations for transcode's command line options
* Added warnings about scaling pictures up (thanks to Peter Schuller)
* Added vqmin and vqmax to the recommended options for libavcodec (thanks to Peter Schuller)
* Added some links, fixed some typos

May 1, 2002:

* Added explanations about audio and video codecs
* Fixed a lot of grammatical errors (thanks to Doug Shea)
* Added this changelog ;)
* Made two versions available - one big file or or file per chapter
* Guide available as one tar ball for download
* Provided an explanation and some sample images for interlaced video (thanks to Jason Smith)
* Started a glossary (thanks to Robos, creator of vobcopy)
* Added some links, fixed some errors

April 30, 2002:

* Initial release
引用

hiei@2004-02-28 07:32

10 About
This guide was written by Moritz Bunkus. I'm a 24 year old student of computer science at the Technical University Braunschweig, Germany. Obviously I have too much spare time to waste :-)

This is the first release of this guide. Please provide feedback - what did you like? What did you dislike? Where should I provide more information? Please also correct mistakes that I have made. And please tell me about programs / tools / scripts / documentation that I've missed. I can be reached via email: moritz@bunkus.org

Copyright (c) 2002 Moritz Bunkus.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation.
引用

lady@2004-02-29 02:23

太长了...
就想知道个关键
LINUX下RIP DVD是不是会快?
如果一样的话,似乎就只有只能用LIUNIX的人才有用了...
>_<
引用

暴鲁千腾@2015-10-31 00:23

原来...发神经是这样的啊...
引用

| TOP