编解码器 -- MPlayer -- Linux下的电影播放器

## 2.2 支持的编解码器

### 2.2.1 视频编解码器

检查codec status table来获得完整的，每日更新的 列表。大部分的编解码器可以从我们的主页下载，在我们的编解码器页可以找到他们。

所有之中最重要的：

- MPEG1(VCD)和MPEG2(DVD)视频
- DivX ;-), OpenDivX, DivX4, DivX5, M$ MPEG4 v1, v2和其它MPEG4格式的变种的本地解码器。
- Windows Media Video 7/8(WMV1/WMV2)的本地解码器，以 及Windows Media Video 9(WMV3)的Win32 DLL解码，.wmv文件使用这两种格式
- 本地的Sorenson 1 (SVQ1)解码器r
- Win32/QT的Sorenson 3 (SVQ3)解码器
- 3ivx v1, v2解码器
- Cinepak和Intel Indeo编解码器(3.1, 3.2, 4.1, 5.0)
- MJPEG, AVID, VCR2, ASV2和其它硬件格式
- VIVO 1.0, 2.0, I263和其它h263(+)格式的变种
- FLI/FLC
- Libavcodec的RealVideo 1.0解码器，和使用RealPlayer库的RealVideo 2.0, 3.0和4.0解码器
- HuffYUV的本地的解码器
- 各种各样的老的简单的类似RLE的格式

如果你有一个Win32解码器没有列出来而且目前没有被支持，请读取解码器导入HOWTO并且帮助我们添加对它的支持。

#### 2.2.1.1 DivX4与DivX5

这部分包含关于Mayo工程的DivX4和DivX5编解码器的信息，他们的第一个可用的alpha版本是 OpenDivX 4.0 alpha 47和48。 对它们的支持以前包括在MPlayer中，并且是默认编译的。 我们也使用其后处理代码来有选择地提高MPEG1/2电影的视觉质量。 现在我们使用我们自己的，对于所有文件类型。

这个解码器的新一代产品称为DivX4，它甚至能解码以声名狼籍的DivX编解码器制作的电影！ 此外，它比本地的Win32 DivX DLL快得多比但是比libavcodec慢。 因此，不鼓励把它当解码器用。 然而，它对编码有用。 这个编解码器的缺点之一是它目前不开放源代码。

DivX4Linux有两种工作方式：

`-vc odivx`
  以OpenDivX方式使用解码器。在这种情况下，它在自己的缓冲中产生YV12图象，然后由MPlayer通过libvo做色彩空间转换。(推荐，快！)
`-vc divx4`
  使用解码器的色彩空间转换。以这种方式你也能使用YUY2与UYVY。(很慢)

`-vc odivx`方式通常更快，因为它以YV12(planar YUV 4:2:0)格式传输图象数据，这样占用少的多的总线带宽。对于packed YUV方式 (YUY2，UYVY)使用`-vc divx4`方式。对于RGB模式两者速度是相同的，差别最多是你当前的色彩深度。

注意：如果你的`-vo`驱动支持直接渲染，那么`-vc divx4`可以是很快甚至最快的解决方案。

Divx4/5的二进制编解码器库可以从avifile或者divx.com下载，解压之后，以root权限运行`./install.sh`， 另外别忘了把`/usr/local/lib`添加到你的`/etc/ld.so.conf`中然后运行`ldconfig`。

想得到老的OpenDivx的核心库的CVS版本可以这样做：

1. `cvs -d:pserver:anonymous@cvs.projectmayo.com:/cvsroot login`
2. `cvs -d:pserver:anonymous@cvs.projectmayo.com:/cvsroot co divxcore`
3. 核心库分为解码库和编码库必须分别编译。对于解码库，直接输入：

           cd divxcore/decore/build/linux
           make
           cp libdivxdecore.so /usr/local/lib
           ln -s libdivxdecore.so /usr/local/lib/libdivxdecore.so.0
           cp ../../src/decore.h /usr/local/include

4. 唉，对于编码库没有可用的Linux的Makefile，而且MMX优化代码只能用于Windows但你仍然可以用这个Makefile来编译它

           cd ../../../encore/build
           mkdir linux
           cd linux
           cp path/Makefile .
           make
           cp libdivxencore.so /usr/local/lib
           ln -s libdivxencore.so /usr/local/lib/libdivxencore.so.0
           cp ../../src/encore.h /usr/local/include

如果正常安装了DivX4/DivX5，MPlayer会自动检测到它，只要正常编译就可以。如果没有检测到，你肯定没有正确安装或者配置它。

#### 2.2.1.2 FFmpeg DivX/libavcodec

FFmpeg包括一组开放源码的解码器包，能够以兼容方式解码以 H263/MJPEG/RV10/DivX3/DivX4/DivX5/MP41/MP42/WMV1/WMV2/HuffYUV编码格式编码的视频流。它不仅能对其中一些进行编码， 同时提供比Win32解码器或DivX.com的DivX4/5库更高的速度！

它包含很多不错的解码器，尤其重要的是MPEG4的几个变种：DivX 3，DivX 4，DivX 5，Windows Media Video 7(WMV1)。另外一个有趣的东西是WMA解码器。

如果你使用MPlayer发行版，在你的源码包里就有libavcodec，正常编译即可。如果你使用CVS的MPlayer 那么你必须从FFmpeg的CVS树中提取libavcodec因为FFmpeg 0.4.5不能用于MPlayer。你应该这样来完成：

1. `cvs -d:pserver:anonymous@cvs.ffmpeg.sourceforge.net:/cvsroot/ffmpeg login`
2. `cvs -d:pserver:anonymous@cvs.ffmpeg.sourceforge.net:/cvsroot/ffmpeg co ffmpeg`
3. 把`libavcodec`目录从FFmpeg的源代码里移到MPlayer的CVS树的根目录下。看起来应该象这样：

   `main/libavcodec`

   符号链接是不够的，你必须复制或移动它！
4. 编译。Configure应该在编译之前发现可能的问题。

用FFmpeg和我的Matrox G400，我甚至能在我的K6/2 500上无掉帧的观看最高分辨率的DivX电影。

#### 2.2.1.3 XAnim解码器

#### 前言

XAnim的二进制的解码器包里面有一份关于合法捆绑软件许可的声明，除其它限制之外，禁止用户用除XAnim外的任何程序使用其解码器。然而， XAnim的作者到目前为止没有就解码器有关的问题对着任何人采取法律行动。

#### 安装和使用

MPlayer可以使用XAnim的解码器解码。按照下列指令来开启它：

1. 从XAnim的站点下载你想要的解码器。3ivx的解码器不在那里，而是在3ivx的站点。
2. 或者从我们的编解码器页下载编解码器包。
3. 使用`--with-xanimlibdir`选项来告诉configure在何处可以找到XAnim的解码器。缺省的话，它在 `/usr/local/lib/xanim/mods, /usr/lib/xanim/mods and /usr/lib/xanim`里寻找。或者你可以把XANIM_MOD_DIR环境变量 设置为XAnim解码器所在的目录。
4. 给文件改名/做符号链接，去掉代表平台构架之类的东西，让他们看起来像这样：`vid_cvid.xa, vid_h263.xa, vid_iv50.xa`。

XAnim属于视频编解码器族`xanim`，所以你可能需要使用`-vfm xanim`。

测试过的解码器包括：Indeo 3.2，4.1，5.0，CVID，3ivX，h263。

#### 2.2.1.4 VIVO视频

MPlayer能播放Vivo(1.0和2.0)视频。对于1.0的文件最适合的解码器是FFmpeg的H263解码器，你可以用`-vc ffh263`选项来 使用它。对于2.0个文件，使用`-vc vivo`命令来调用Win32 DLL。如果你没有添加命令行选项MPlayer将自动选择最好的解码器。

#### 2.2.1.5 MPEG 1/2视频

MPEG1和MPEG2用本地的多平台的libmpeg2库解码，其源代码被包括在MPlayer中。对于buggy的MPEG 1/2视频文件我们 通过截获`Signal 11 (Segmentation fault)`，然后迅速再次初始化解码器，从失败的地方继续的方法来处理。这种 恢复技术会带来无法估量的速度损失。

#### 2.2.1.6 MS Video1

这是微软的又老又差的编码格式。过去它用`msvidc32.dll`的Win32解码器解码，现在我们有我们自己的开放源码的实现(由Mike Melanson提供)。

#### 2.2.1.7 Cinepak CVID

MPlayer默认将使用自己的开源的，多平台的Cinepak解码器(由Dr. Tim Ferguson提供)。它支持YUV输出，所以只要硬件驱动允许它将使用硬件缩放。

#### 2.2.1.8 RealVideo

MPlayer支持所有版本的RealVideo的解码：

- RealVideo 1.0 (fourcc RV10) -- 编/解码由libavcodec支持
- RealVideo 2.0，3.0，4.0(fourcc RV20，RV30，RV40) -- 解码由RealPlayer库支持

推荐下载并安装RealPlayer8或者RealONE，因为MPlayer能使用他们的库来解码RealVideo 2.0或者RealVideo 3.0的视频文件。 MPlayer的配置脚本应该会在一个完全安装的RealPlayer的标准位置找到它的库。如果它没找到，用`--with-reallibdir` 选项告诉configure到哪里去找。

注意：RealPlayer库目前只能用于x86平台上的Linux，FreeBSD，NetBSD和Cygwin，和Alpha以 及PowerPC(经过Linux/Alpha和Linux/PowerPC测试)平台。

#### 2.2.1.9 XviD

XviDOpenDivX编解码器的开发分支。故事发生在Mayo工程把OpenDivX变成封闭 源码的DivX4的时候，那些从事于OpenDivX的非Mayo工程的人们感到愤怒，于是开始了XviD。所以两个项目有相同的起源。

#### 优点

- 开放源码
- 它的API与DivX4相同，所以加入对它的支持很容易
- 支持2-pass编码
- 不错的编码质量，DivX4更快的速度(编译时你能针对你的机器优化它)

#### 缺点

- 目前还不能正确的解码所有的DivX与DivX4文件(这不成问题因为libavcodec能播放他们)
- 编译时你必须选择支持DivX4或者支持XviD
- 还在开发中

#### 安装XVID CVS

XViD目前只能从CVS中得到。这是下载和安装的指令(你至少需要autoconf 2.50, automake和libtool)：

1. `cvs -z3 -d:pserver:anonymous@cvs.xvid.org:/xvid login`
2. `cvs -z3 -d:pserver:anonymous@cvs.xvid.org:/xvid co xvidcore`
3. `cd xvidcore/build/generic`
4. `./bootstrap.sh`
5. `./configure`
   你可以加上一些选项(查看`./configure --help`的输出).
6. `make && make install`
7. 如果你设置了`--enable-divxcompat`，把`xvidcore/src/`里面 的`divx4.h`头文件复制到`/usr/local/include/`。
8. 加上`--with-xvidcore=/path/to/libcore.a`选项重新编译MPlayer。

#### 2.2.1.10 Sorenson

Sorenson是Sorenson Media开发的一个视频编解码器族，授权给苹果公司在它们的QuickTime播放器中使用。 我们目前可以使用下列解码器解码所有的Sorenson视频文件：

- Sorenson 1(fourcc SVQ1) - 由本地编解码器解码。
  实际上有两个SVQ1的(几乎等价的)解码器：一个在MPlayer中，还有一个在libavcodec。你可以通过`-vc svq1` 和`-vc ffsvq1`选项调用它们中的任意一个。有些文件可能只能在其中一个上工作，而另一个就行，所以 两个解码器都试试。这个解码器是由xine的作者编写(完成反向工程)的。
- Sorenson 3(fourcc SVQ3) - 由Win32的QuickTime库解码。

#### 编译支持QUICKTIME库的SUPPORT

注意：目前只支持32位的Intel平台。

1. 下载MPlayer CVS
2. 用下面参数编译MPlayer：
   `$ ./configure --enable-qtx-codecs`
3. 在这里下载QuickTime DLL包http://www.mplayerhq.hu/MPlayer/releases/codecs/
4. 把QuickTime DLL包解压到你的Win32编解码器目录(默认：`/usr/lib/codecs`)

### 2.2.2 音频编解码器

所有音频编码中最重要的是：

- MPEG layer 2(MP2), 和layer 3(MP3)(本地代码，经过MMX/SSE/3DNow!优化)
- MPEG layer 1音频(本地代码，使用libavcodec)
- Windows Media Audio v1, v2 (本地代码，使用libavcodec)
- Windows Media Audio 9(WMAv3)(使用DMO DLL)
- AC3杜比音频(本地代码，经过MMX/SSE/3DNow!优化)
- AC3声卡硬件处理
- Ogg Vorbis音频编解码器(本地库)
- RealAudio: DNET(低比特率的AC3), Cook, Sipro和ATRAC3
- QuickTime: Qualcomm和QDesign音频编解码器
- Voxware音频(使用DirectShow DLL)
- VIVO音频(g723，Vivo Siren)
- alaw和ulaw，各种gsm，adpcm和pcm格式还有别的简单老的编解码器

#### 2.2.2.1 软件AC3解码

这是含有AC3音频的文件的默认解码器。

AC3解码器能为了2，4或者6个扬声器创建音频混合输出。当配置为6个扬声器时，这个解码器向声卡驱动提供所有AC3通道的单独的输出， 允许彻底的“环绕音效”感受而不需要使用需要hwac3解码器的外部AC3解码器。

使用`-channels`选项可以选择输出的通道数。使用`-channels 2`获得立体声的降混频。 对于4通道的降混频(左前，右前，左环绕和右环绕)，使用`-channels 4`。在这种情况下，中心通道的任何输出将与前通道均匀混合。 `-channels 6`将按照编码时的形式输出所有AC3通道-- 依次为左，右，左环绕，右环绕，中间和低频效果。

默认的输出通道数是2。

为使用超过2个通道的输出，你需要使用OSS，和一块能通过SNDCTL_DSP_CHANNELS ioctl支持适当输出通道数的声卡。合适的驱动的一个例子是 2001年8月的或者更新的emu10k1(用于Soundblaster Live!卡)(ALSA的CVS应该也能工作)。

#### 2.2.2.2 硬件AC3解码

你需要一个AC3兼容声卡，加上数字输出(SP/DIF)。声卡的驱动必须正确地支持AFMT_AC3格式(C-Media就支持)。把你的AC3解码器连接到SP/DIF输出， 然后使用`-ac hwac3`选项。这还在试验阶段但已经知道能用于C-Media声卡，使用ALSA驱动(但不能是OSS)的Soundblaster Live! 还有DXR3/Hollywood+ MPEG译码卡。

#### 2.2.2.3 libmad支持

libmad是多平台的MPEG音频解码库。它不能很好的处理损坏的文件，而且有时候搜索也有问题。

为了支持它，加上`--enable-mad`配置选项编译。

#### 2.2.2.4 VIVO音频

VIVO文件的使用的音频编码取决于它是VIVO/1.0还是VIVO/2.0。VIVO/1.0文件使用g.723音频，而VIVO/2.0文件使用Vivo Siren音频。 这两种音频现在都支持。

#### 2.2.2.5 RealAudio

MPlayer支持解码几乎所有版本的RealAudio：

- RealAudio DNET -- 解码由liba52支持
- RealAudioCook/Sipro -- 解码由RealPlayer库支持
- RealAudio atrc -- 解码尚未支持

至于如何安装RealPlayer库，参见RealMedia文件格式部分。

#### 2.2.2.6 QDesign编解码器

QDesign音频流(fourcc: QDMC, QDM2)出现在MOV/QT文件中。两个版本的编码格式都可以用QuickTime的库解码。 安装步骤参见Sorenson视频编解码器部分。

#### 2.2.2.7 Qualcomm编解码器

Qualcomm音频流(fourcc: Qclp)出现在MOV/QT文件中。它可以用QuickTime库解码。 安装步骤参见Sorenson视频编解码器部分。

#### 2.2.2.8 AAC编解码器

AAC(Advanced Audio Coding)是MOV和MP4文件有时使用的编码格式，AudioCoding.com有一个叫FAAD的开放源代码的解码器提供下载，你可以 在他们的下载页找到第二代解码器FAAD2，不幸的 是FAAD2 1.1在Linux下面无法编译，所以你必须使用CVS版本，这样做：

1. cvs -d:pserver:anonymous@cvs.audiocoding.com:/cvsroot/faac login
2. cvs -z3 -d:pserver:anonymous@cvs.audiocoding.com:/cvsroot/faac co faad2
3. cd faad2/
4. chmod +x bootstrap
5. ./bootstrap
6. ./configure
7. make
8. make install

audiocoding.com不提供二进制版本，但你可以用apt-get从Christian Marillat的主页下载Debian的安装包或者从P.L.F下载Mandrake的RPM。

### 2.2.3 Win32解码器导入HOWTO

#### 2.2.3.1 VFW编解码器

VFW(Video for Windows)是Windows的老的视频API。它的解码器以.DLL或者(很少的).DRV为扩展名。 如果MPlayer无法播放你的AVI并显示这种信息：

`UNKNOWN video codec: HFYU (0x55594648)`

它意味着你的AVI在编码时使用了HFYU fourcc(HFYU = HuffYUV codec，DIV3 = DivX Low Motion，等等...) 的编码格式。现在你知道了，你必须查明Windows为了播放这个文件装载了哪一个DLL。在我们的情况下， `system.ini`在这样的一行上包含这个信息：

`VIDC.HFYU=huffyuv.dll`

因此，你需要`huffyuv.dll`文件。注意，音频解码器通过MSACM前缀指定：

`msacm.l3acm=L3codeca.acm`

这是MP3编码格式。现在你有了所有必要的信息(fourcc，解码器文件，AVI样本)，把你的解码器支持要求通过邮件提交， 并把相关文件上载到我们的FTP站点：

`ftp://upload.mplayerhq.hu/MPlayer/incoming/[codecname]/`

#### 2.2.3.2 DirectShow codecs

DirectShow是较新的视频API，比它的前辈更恶劣。对于DirectShow事情变的困难了，

- `system.ini`不再包含需要的信息，它们被储存在注册表里，此外。
- 我们需要解码器的的GUID。

新方法：使用微软的GraphEdit(快速)

1. 从DirecX SDK或者Doom9中取得GraphEdit。
2. 运行`graphedit.exe`。
3. 从菜单中选择Graph -> Insert Filters。
4. 展开`DirectShow Filters`项目。
5. 选择正确的解码器名称然后展开项目。/LI>
6. 在`DisplayName`一项中看反斜杠后面花括号里面的文字并把它记下来(小短横分隔开的五块，就是GUID)。
7. 解码器的二进制文件是`Filename`项里指定的文件。

注意：如果没有`Filename`项而`DisplayName`中包含类似`device:dmo`的东西， 那么这是一个DMO-Codec。

老方法：做个深呼吸然后开始搜索注册表...

1. 运行`regedit`。
2. 按`Ctrl-f`，禁用头两个复选框，填写解码器的fourcc(例如TM20)。
3. 你应该看见一个包含路径和文件名的域(例如`C:\WINDOWS\SYSTEM\TM20DEC.AX`)。
4. 现在你找到了文件，我们需要GUID。尝试再次搜索，但现在搜索解码器的名称，fourcc。用媒体播放器播放文件时， 察看File -> Properties -> Advanced可以获得解码器名。如果没有，你真不走运。猜猜看吧(例如搜索TrueMotion)。
5. 如果找到GUID你将看见FriendlyName和CLSID域。写出16字节CLSID，这就是我们需要的GUID。

注意：如果搜索失败，试试选上所有的复选框。你可能找到错误的内容，不过说不定你会走运...

现在你有所有必要的信息(fourcc，GUID，解码器文件，AVI样本)，把你的解码器支持要求通过邮件提交，并把相关文件上载到我们的FTP站点

`ftp://upload.mplayerhq.hu/MPlayer/incoming/[codecname]/`