7.4.视频播放

在配置视频播放之前,要确定显卡的型号及芯片组。虽然 Xorg 支持各种各样的显卡,但并非所有的显卡都能提供良好的播放性能。在运行 Xorg 时执行命令 xdpyinfo,即可获得当前显卡的 Xorg 服务器扩展支持列表。

使用一个简短的 MPEG 测试文件来评估各种播放器和选项是个好主意。由于一些 DVD 应用程序默认在 /dev/dvd 中寻找 DVD 介质,或者在它们对这个设备名称做了硬编码,所以做一个符号链接到正确的设备可能是有用的:

# ln -sf /dev/cd0 /dev/dvd

由于 devfs(5)open in new window 的特性,手动创建的符号链接在系统重启后不会继续存在。为了在系统启动时自动重新创建符号链接,在 /etc/devfs.conf 中添加以下一行:

link cd0 dvd

DVD 解密会调用某些功能,这些功能需要对 DVD 设备的写入权限。

为了增强共享内存 Xorg 接口,建议增加这些 sysctl(8)open in new window 变量的值:

kern.ipc.shmmax=67108864
kern.ipc.shmall=32768

7.4.1. 确定视频处理能力

在 Xorg 下有几种可行的方法来播放视频,而其中何种是有效的主要取决于硬件。下面说明的每种方法在不同的硬件上会有不同的表现。

常见的视频接口包括:

  1. Xorg:使用共享内存的正常输出。
  2. XVideo:Xorg 接口的扩展,它允许视频通过一个特殊的加速器直接显示在可绘制对象中。这种扩展即使在低端机器上也能提供良好的播放质量。下一节将介绍如何确定这个扩展是否正在运行。
  3. SDL:简单直接媒体层(Simple Directmedia Layer)是许多操作系统的移植层,允许开发有效利用声音和图形的跨平台应用程序。SDL 为硬件提供了一个低层次的抽象层,有时比 Xorg 接口更有效。在 FreeBSD 上,可以使用软件包或 port devel/sdl20open in new window 来安装 SDL。
  4. DGA:直接图形访问(Direct Graphics Access)是 Xorg 的扩展,它允许程序绕过 Xorg 服务器,直接改变帧缓冲区。由于它依赖于一个低级别的内存映射,使用它的程序必须以 root 身份运行。可以使用 dga(1)open in new window 对 DGA 扩展进行测试和基准测试。当运行 dga 时,每当按下一个键,它就会改变显示的颜色。要退出,请按 q
  5. SVGAlib:一个低级别的控制台图形层。

7.4.1.1. XVideo

要检查这个扩展是否正在运行,请使用 xvinfo

% xvinfo

该卡支持 XVideo,如果结果类似于:

X-Video Extension version 2.2
  screen #0
  Adaptor #0: "Savage Streams Engine"
    number of ports: 1
    port base: 43
    operations supported: PutImage
    supported visuals:
      depth 16, visualID 0x22
      depth 16, visualID 0x23
    number of attributes: 5
      "XV_COLORKEY" (range 0 to 16777215)
              client settable attribute
              client gettable attribute (current value is 2110)
      "XV_BRIGHTNESS" (range -128 to 127)
              client settable attribute
              client gettable attribute (current value is 0)
      "XV_CONTRAST" (range 0 to 255)
              client settable attribute
              client gettable attribute (current value is 128)
      "XV_SATURATION" (range 0 to 255)
              client settable attribute
              client gettable attribute (current value is 128)
      "XV_HUE" (range -180 to 180)
              client settable attribute
              client gettable attribute (current value is 0)
    maximum XvImage size: 1024 x 1024
    Number of image formats: 7
      id: 0x32595559 (YUY2)
        guid: 59555932-0000-0010-8000-00aa00389b71
        bits per pixel: 16
        number of planes: 1
        type: YUV (packed)
      id: 0x32315659 (YV12)
        guid: 59563132-0000-0010-8000-00aa00389b71
        bits per pixel: 12
        number of planes: 3
        type: YUV (planar)
      id: 0x30323449 (I420)
        guid: 49343230-0000-0010-8000-00aa00389b71
        bits per pixel: 12
        number of planes: 3
        type: YUV (planar)
      id: 0x36315652 (RV16)
        guid: 52563135-0000-0000-0000-000000000000
        bits per pixel: 16
        number of planes: 1
        type: RGB (packed)
        depth: 0
        red, green, blue masks: 0x1f, 0x3e0, 0x7c00
      id: 0x35315652 (RV15)
        guid: 52563136-0000-0000-0000-000000000000
        bits per pixel: 16
        number of planes: 1
        type: RGB (packed)
        depth: 0
        red, green, blue masks: 0x1f, 0x7e0, 0xf800
      id: 0x31313259 (Y211)
        guid: 59323131-0000-0010-8000-00aa00389b71
        bits per pixel: 6
        number of planes: 3
        type: YUV (packed)
      id: 0x0
        guid: 00000000-0000-0000-0000-000000000000
        bits per pixel: 0
        number of planes: 0
        type: RGB (packed)
        depth: 1
        red, green, blue masks: 0x0, 0x0, 0x0

所列的格式,如 YUV2 和 YUV12,并不存在于 XVideo 的每个实现中,它们的缺失可能会妨碍一些播放器正常运行。

如果结果是这样的:

X-Video Extension version 2.2
screen #0
no adaptors present

该卡可能不支持 XVideo。这意味着显示器将更难满足渲染视频的计算要求,而这依赖于显卡和处理器。

7.4.2. 可处理视频的 port 和软件包

这一节介绍了一些可用于视频播放的在 FreeBSD ports 中的软件。

7.4.2.1. MPlayer 和 MEncoder

MPlayer 是一个命令行的视频播放器,它有一个可选的图形界面,旨在提供速度和灵活性。其他 MPlayer 的图形化前端可以从 FreeBSD ports 中获得。

MPlayer 可以通过软件包或 port 来安装 multimedia/mplayeropen in new window。有几个编译选项可用,并且在编译过程中会有各种硬件检查。由于这些原因,一些用户喜欢编译 port 而不是安装软件包。

在编译 ports 时,应查看菜单选项,以确定要编译到 port 中的支持类型。如果没有选择某个参数,MPlayer 将不能显示该类型的视频格式。使用方向键和空格键来选择所需的格式。完成后,按回车键继续进行 port 的编译和安装。

默认情况下,该软件包或 port 将编译 mplayer 命令行工具和 gmplayer 图形工具。要对视频进行编码,请编译 multimedia/mencoderopen in new window 这个 port。由于许可证限制,MEncoder 的软件包不可用。

首次运行 MPlayer 时,它将在用户的主目录下创建 ~/.mplayer。这个子目录包含了用户特定配置文件的默认版本。

本节只介绍了一些常见的用法。请参考 mplayer(1) 以了解其众多选项的完整说明。

要播放文件 testfile.avi,用 -vo 指定视频接口,如以下例子所示:

% mplayer -vo xv testfile.avi
% mplayer -vo sdl testfile.avi
% mplayer -vo x11 testfile.avi
# mplayer -vo dga testfile.avi
# mplayer -vo 'sdl:dga' testfile.avi

所有这些选项都值得尝试,因为它们的相对性能取决于许多因素,并且会因硬件不同而有很大差异。

要播放 DVD,用 dvd://N -dvd-device DEVICE 替换 testfile.avi,其中 N 是要播放的标题编号,DEVICE 是 DVD 的设备节点。例如,要从 /dev/dvd 播放标题 3:

# mplayer -vo xv dvd://3 -dvd-device /dev/dvd

注意

可以在编译 MPlayer port 时通过加入参数 WITH_DVD_DEVICE=/path/to/desired/device 来定义默认的 DVD 设备。默认情况下,该设备是 /dev/cd0。更多细节可以在 port 的 Makefile.options 中找到。

要停止、暂停、快进,等等,请使用快捷键。要查看快捷键的列表,请运行 mplayer -h 或阅读 mplayer(1)。

额外的播放选项包括 -fs -zoom 可用于全屏模式,以及 -framedrop 可用于帮助提高性能。

每个用户都可以在他们的 ~/.mplayer/config 中添加常用的选项,比如说:

vo=xv
fs=yes
zoom=yes

可以用 mplayer 将 DVD 标题翻录成 .vob。要从 DVD 中转存第二个标题:

# mplayer -dumpstream -dumpfile out.vob dvd://2 -dvd-device /dev/dvd

输出文件 out.vob 将是 MPEG 格式。

任何希望获得 UNIX® 视频高水平专业知识的人都应该查阅 mplayerhq.hu/DOCSopen in new window,因为它在技术上是很丰富的。在提交任何错误报告之前,应将该文件视为必读文件。

在使用 mencoder 之前,最好先熟悉一下 mplayerhq.hu/DOCS/HTML/en/mencoder.htmlopen in new window 中介绍的选项。有无数种方法可以提高质量、降低比特率和改变格式,其中一些选项可能决定了性能的好坏。错误的命令行选项组合可以产生即使是 mplayer 也无法播放的输出文件。

下面是一个简单复制的例子:

% mencoder input.avi -oac copy -ovc copy -o output.avi

要翻录到一个文件,使用 mplayer-dumpfile 参数。

要将 input.avi 转换为带有 MPEG3 音频编码的 MPEG4 编解码器,首先安装 port audio/lameopen in new window。由于许可证的限制,无法提供软件包。安装后,键入:

% mencoder input.avi -oac mp3lame -lameopts br=192 \
	 -ovc lavc -lavcopts vcodec=mpeg4:vhq -o output.avi

这将产生可由 mplayerxine 等应用程序播放的输出。

可以用 dvd:/1 -dvd-device /dev/dvd 来代替 input.avi ,并以 root 身份运行,以直接重新编码一个 DVD 标题。由于可能需要尝试多次才能得到理想的结果,因此建议将标题转存到一个文件中,然后在该文件中工作。

7.4.2.2. xine 视频播放器

xine 是一个视频播放器,它有一个可重用的基础库和一个模块化的可执行文件,可用插件扩展。它可以使用软件或 ports multimedia/xineopen in new window 来安装。

在实践中,xine 需要高性能的 CPU 以及显卡,或者其支持 XVideo 扩展。在 XVideo 接口上,xine 视频播放器表现最佳。

默认情况下,xine 播放器会启动一个图形化的用户界面。然后可以用菜单来打开一个特定的文件。

另外,可以通过指定要播放的文件的名称从命令行中调用 xine:

% xine -g -p mymovie.avi

参考 xine-project.org/faqopen in new window 以了解更多信息和故障排除技巧。

7.4.2.3. 实用转码工具

Transcode 提供了一套用于视频和音频文件重新编码的工具。Transcode 可以用来合并视频文件或使用带有 stdin/stdout 流接口的命令行工具来修复破损的文件。

在 FreeBSD 中,Transcode 可以使软件包或 port 来安装 multimedia/transcodeopen in new window 。许多用户喜欢编译 port,因为它提供了一个编译选项菜单,用于指定要编译的支持和编解码器。如果没有选择某个选项,Transcode 将不能对该格式进行编码。使用方向键和空格键来选择所需的格式。完成后,按回车继续进行 port 的编译和安装。

这个例子演示了如何将 DivX 文件转换为 PAL 的 MPEG-1 文件(PAL VCD):

% transcode -i input.avi -V --export_prof vcd-pal -o output_vcd
% mplex -f 1 -o output_vcd.mpg output_vcd.m1v output_vcd.mpa

已经准备好用 MPlayer 播放得到的 MPEG 文件 output_vcd.mpg 了。可以用 multimedia/vcdimageropen in new windowsysutils/cdrdaoopen in new window 等工具将该文件刻录在 CD 介质上以创建视频 CD。

除了 transcode 的手册页,可参考 transcoding.org/cgi-bin/transcodeopen in new window 以获得更多信息和例子。