AVI 电影播放器和捕获

作者:Robin Rowe

上个月我们尝试了一些 MPEG 播放器,包括 aKtion、gmpeg、gxanim、MPlayer、plaympeg、XAnim、xine 和 Xtheater。我们还研究了 Be 操作系统,以便将其视频功能与 Linux 进行比较。

我们本月的目标是研究 AVI 播放器 aKtion、Aviplay、MPlayer 和 XAnim。我们还将使用 Video4Linux 和 XawTV 或 QtVidcap 捕获一些 AVI 文件。

AVI(音频视频交错)是 PC 上最常见的视频文件格式之一。AVI 文件格式和 RIFF 格式(资源交换文件格式)通常是由微软和 IBM 在他们还是朋友的时候定义的。微软的音频 WAV 格式是 RIFF 文件的另一种变体。RIFF 格式是基于 IFF,一种 Amiga 上的格式标准。当寻求关于 AVI 格式的信息时,一个好的起点是 John McGowan 的 “AVI Overview”,可在 www.jmcgowan.com/avi.htmlwww.faqs.org 上找到。

在内部,视频文件是交错的图片和音频块。要播放视频,视频播放器会按顺序一个接一个地读取这些块,并将它们混合在一起,使它们看起来无缝衔接。通常,音频播放是参考,视频画面与之同步。音频播放速率的变化会被察觉为抖晃,但视频播放帧速率的轻微变化并不明显。

视频文件格式依赖于两个容易混淆的概念:传输和编解码器。传输是描述后续音频和视频块的结构。AVI、MPEG 和 QuickTime 都是传输的例子。在传输内部,每个压缩的视频或音频块必须使用理解该块特定方案的编解码器读取。视频编解码器的例子包括 Cinepak 和 Indeo。AVI 声音编解码器可能是 PCM、ADPCM、GSM 或其他许多。如果您有一个看起来非常好的视频文件,但您的视频播放器只播放视频或音频部分,这可能是因为您缺少编解码器。播放器被设计为跳过传输中它们不理解的内容。

WMP(Windows Media Player)是 Windows 中包含的电影播放器。它使用可安装的编解码器,作为插件工作,称为 dlls(动态链接库)。如果您开发了一个新的 Windows 编解码器,您的视频或音频可以在 WMP 中播放。对于 Linux 编解码器开发者来说,这意味着将您的代码移植到 Windows 作为插件是可行的,这样在 Linux 中使用开放格式创建的文件可以在专有的 Windows 播放器中查看。相反,一些 Linux 视频播放器能够使用 Windows 插件,并在原本开放的 Linux 播放器中播放专有的 Windows 格式。因此,至少在 Intel 上,交付一个适用于 Linux 和 Windows 的单一插件是可能的。

AVI Movie Players and Capture

Windows Media Player

AVI 文件使用一个称为 FOURCC 代码的魔数来识别其嵌入的编解码器。这个四字节 ID 是 AVI 传输如何知道要加载哪个编解码器来播放流的方式。为了保证唯一性,FOURCC 必须在微软注册。非官方但“几乎权威”的 FOURCC 定义列表保存在 http://www.webartz.com/fourcc/,并提供了许多有用的信息。

人们普遍认为 AVI 文件不能大于 2GB 或用于专业视频应用,但这并非完全正确。文件大小限制的主要原因是 RIFF 块使用 32 位整数来描述其大小。您可能会听到交替提到 1GB 限制,因为早期 Microsoft Video for Windows 代码中的一个错误使这个(在当时是巨大的)成为限制。由于一个无符号 32 位整数也可以包含 4GB,您可能会看到这个数字也被建议作为最大值——4GB 也恰好是 FAT16 文件系统的限制。

最初的 AVI 文件规范只允许每个文件一个 RIFF 块。解决大小限制的明显方法是允许在一个文件中包含多个 RIFF。在 Matrox 的敦促下,开放数字媒体 (OpenDML) 联盟在创建 OpenDML AVI 文件格式扩展时就是这样做的。该规范可以从 McGowan 的 AVI Overview 中的链接获得。据报道,OpenDML AVI 支持包含在 Matrox 的 DigiSuite 软件和自 5.1 版本以来的微软 WMP 中。

最近,AVI 正在输给微软提供的新格式;高级流媒体格式 (ASF) 和后来的 Windows Media Format (WMF) 在 WMP 7 中被添加。微软已经测试了高达 30GB 的 WMF 文件,但理论上它们可以容纳 1700 万 TB。

Linux 的一些视频播放器

XawTV 是一个流行的应用程序,用于在 Video4Linux 设备上观看视频。Video4Linux (V4L) 使许多不同的视频捕获卡可以在应用程序中互换使用。Hauppauge WinTV 是最流行的廉价电视卡之一(低于 70 美元)。其他相当的卡基于相同的 Conexant 芯片组(以前的 Rockwell Brooktree)。

AVI Movie Players and Capture

XawTV 视频播放器

AVI Movie Players and Capture

XawTV 配置屏幕

Ralph 和 Marcus Metzler 创建了第一个 bttv Linux 驱动代码,用于与基于 Brooktree BT848 的电视卡一起工作。Gerd Knorr 最终接手了开发,创建了 bttv-0.7.x 系列驱动。他还创建并继续维护 XawTV。Alan Cox 开发了一个通用的视频架构,称为 Video4Linux,它受到 OSS 声音驱动中思想的影响。他围绕 bttv 驱动开发了 V4L,并将其带入 Linux 内核。最初的 bttv 驱动不再被支持,已经被 Justin Schoeman 维护的 V4L 版本取代。

V4L2 是 Linux 的 bttv 驱动的重大重写。根据 Justin Schoeman 的网页 (http://sourceforge.net/projects/bttv-v4l2/),bttv-v4l2 的目标是在基于 Bt848/878 的视频捕获卡上支持高性能视频捕获。Bill Dirks 负责当前 V4L 版本 2 架构 (V4L2) 的开发。他开发了捕获 API,并进行了架构更改,以更好地适应各种硬件设备。他的网页,http://www.thedirks.org/v4l2/,有更多信息。

在构建和安装 bttv 驱动程序(正如我们在 2001 年 4 月份的 LJ 专栏中所做的那样)时,我们遇到了一个称为 i2c 驱动程序的东西。这在当时让我们感到困惑,因为我们无法让它工作,而且没有一个 V4L 网页说明它是做什么的。更仔细地查看 Gerd Knorr 的网站,我们注意到我们需要 2.3 或更新的内核才能使用 i2c,因此不得不对 Debian Potato 的 2.2 内核进行小的补丁。我们有修复程序,但不理解它。

与 Bill Dirks 的谈话最终为我们解开了 i2c 驱动程序的作用之谜。电视卡有调谐器,它们有自己的通信总线,称为 i2c(或 iic),由制造商 Phillips 定义。它是一个三线同步串行总线(时钟、数据、地线),在调谐器和卡上的其他组件之间进行通信。PCI 总线与 i2c 通信。i2c 总线的另一个用途是在 PC 主板上,以便它可以与 CPU 的温度传感器通信。

尽管它仍然是实验性的,但 Bill Dirks 建议使用 V4L2,除非这样做会导致问题。V4L 更以 bttv 为中心,但应用程序可以透明地使用任何一个 Video4Linux 版本。videodev 驱动程序在 V4L 中加载设备特定的驱动程序。在 V4L2 中,驱动程序加载器可能是 videodev 或 videodevx。V4L2 videodev 包仅适用于 2.2.x 内核,并且仅支持 V4L2 驱动程序。新的 V4L2 videodevx 驱动程序适用于 2.2.x 和 2.4.x 内核,并支持 V4L2 和 V4L 设备驱动程序。

V4L 包含在内核中。要获得 V4L2,您需要安装一些额外的组件。因为 Potato 中的 V4L 版本太旧了,所以我们无论如何都做了。然而,我们最终选择了 V4L,因为我们被 V4L2 的新颖性吓到了。我们还没有遵循 Bill 的建议切换到 V4L2,这可能与我们在测试视频捕获时遇到的一些困难有关。

我们从源代码构建了 AVI 播放器,要么是因为我们想要最新版本,要么是因为没有 deb 包可用。步骤是在 freshmeat.net 上搜索项目,使用 tar xvfzxvfI 解压它(取决于文件是 gzipped 还是 bzipped),然后构建它。构建通常以 GNU 方式完成:./configure,然后 makemake install

MPlayer 在我们上个月的评估中被认为是​​最稳定的 MPEG 播放器,尽管我们拥有的 0.11 版本无法播放 AVI 文件。新版本可以了。它做得相当不错,但很明显 AVI 支持还不够成熟。有些文件无法播放,有些没有视频,甚至有一个倒过来播放。

理论上,MPlayer 可以播放任何 Microsoft WMP 可以播放的视频,因为它尝试使用复制到 Linux /usr/lib/win32 目录中的 WMP 编解码器插件。但是,欺骗 WMP 插件在 Linux 中工作还没有完全完善,并且 MPlayer 继续遭受简陋的命令行控制界面的困扰。

您无法调整播放器窗口的大小,这会让大多数习惯于以双倍大小观看小型视频的人感到恼火。您也无法让视频重复播放,并且退出似乎反应不是很迅速。

MPlayer 没有版本号了;您只能下载每日 CVS 快照。由于我们的 gcc 编译器的问题,我们在构建它时遇到了严重的麻烦。我们收到了来自 gcc 的一条有些神秘的消息,关于安装问题,并且它无法执行 cc1plus,g++ 前端。但是,g++ 似乎已正确安装。当我们安装了更新版本的 gcc (2.95.3-5) 后,问题消失了。

XAnim 在查看 MPEG 和 AVI 时都很受欢迎。它使用插件,但不是 Win32 dll 插件。它为 H.261、H.263、Indeo 和 Cinepak 提供了自己的跨平台插件。虽然提供的插件不多,但文档说这些插件可以在 Intel、Alpha、PowerPC、Sun 和 SGI 硬件上运行。根据 XAnim 网页,这些插件是专有的,根据 NDA 开发。

AVI Movie Players and Capture

XAnim 播放器

XAnim 工作正常,但无法播放像 MPlayer 那样多的 AVI 文件。然而,XAnim 中的用户界面更好。我们想尝试最新版本的 XAnim,但我们在构建它时遇到了麻烦。构建 XAnim 需要首先安装 Imake 生成器 xmkmf。它应该包含在 X Window System 开发库中,但我们找不到。后来我们注意到 MPlayer 网页上说这些库在 Debian 中被称为 lib6g-dev。

AVI Movie Players and Capture

XAnim 用户界面

我们没有构建成功的另外两个播放器是 aKtion 和 Kmpg。我们正在运行旧版本的 aKtion,但它在播放 AVI 文件时存在一些问题。我们无法构建 Kmpg 0.5.4,因为它不喜欢我们系统太新版本的 libqt(2.2.4 而不是 1.x)。没有 KDE 标头是 aKtion 0.4.1 报告的构建错误。Xtheater 0.9.1 构建成功,但无法播放任何 AVI。

Avifile 0.53.5 是一个用于播放 AVI 文件的库。它带有两个示例应用程序,Aviplay 和 QtVidcap。使用 Aviplay 提供了与 XAnim 有些不同的界面,但体验类似。XAnim 似乎没有使用 Avifile。MPlayer 没有使用 Avifile,但它们确实有共同的 Win32 DLL 加载器。两者似乎都比 Aviplay 更可靠。

AVI Movie Players and Capture

Aviplay

QtVidcap 捕获程序看起来很诱人,但我们无法让它工作。当它开始捕获文件时,它会失败。我们希望在安装 XFree86 4.x 和 V4L2 后它会做得更好。

XawTV 成功捕获了 AVI 文件,但与 Windows 中使用 Windows Media Encoder 完成相同任务相比,它的功能似乎很弱。XawTV 仅编码 15 位和 24 位 RGB 或 MJPEG 编解码器。XAnim 是唯一可以播放所有三种 XawTV 格式的播放器。其他播放器往往会拒绝,除了 MJPEG。Aviplay 不喜欢它们中的任何一个。我们在 Windows 中播放文件时遇到了麻烦,并怀疑故障是否出在捕获中。Linux 播放器在播放 Windows 捕获的视频时表现更好,前提是编解码器不是太新。

AVI Movie Players and Capture

QtVidcap 程序

AVI Movie Players and Capture

XawTV 选项窗口

在操作 XawTV 时,有两件事让我们感到困惑:调整图片大小和声音。您必须将窗口调整到您想要捕获视频的大小。任何大于 320 x 240 像素,15fps 的设置都给我们带来了问题。我们没有声音,直到我们突然想到在 gmixer 中选择“录音线路输入”。

下个月我们将把我们的 Debian Linux 安装从 Potato 升级到 Woody,这将为我们提供更多多媒体功能的 2.4 内核和 XFree86 4.0 GUI。我们还将把我们的设备驱动程序升级到 V4L2。

AVI Movie Players and Capture
Robin Rowe 是 MovieEditor.com 的合伙人,这是一家创建互联网和广播视频技术公司。他曾为 Dr. Dobb's JournalC++ ReportC/C++ Users JournalData Based Advisor 撰稿。他的软件设计包括一个客户端/服务器视频编辑系统,该系统在曼哈顿 24 小时广播电视台 Time Warner New York One 和相关网站 http://www.ny1.com/ 中使用。您可以通过 robin.rowe@movieeditor.com 联系他。
加载 Disqus 评论