7.4.视频回放

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

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

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

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

link cd0 dvd

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

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

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 上,SDL 可以使用二进制包或 ports devel/sdl20open in new window 来安装。
  4. DGA:直接图形访问是一个 Xorg 扩展,它允许程序绕过 Xorg 服务器,直接改变帧缓冲区。由于它依赖于一个低级别的内存映射,使用它的程序必须以 root 身份运行。DGA 扩展可以使用 dga(1) 进行测试和基准测试。当 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. 处理视频的 ports 和包

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

7.4.2.1. MPlayer 和 MEncoder

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

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

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

默认情况下,该软件包或 ports 将构建 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

注意:默认的 DVD 设备可以在构建 MPlayer ports 时通过加入 WITH_DVD_DEVICE=/path/to/desired/device 选项来定义。默认情况下,该设备是 /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/DOCS,因为它在技术上是很丰富的。在提交任何错误报告之前,应将该文件视为必读文件。

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

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

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

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

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

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

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

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

7.4.2.2. xine 视频播放器

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

在实践中,xine 需要一个快速的 CPU 和一个快速的显卡,或者支持 XVideo 扩展。xine 视频播放器在 XVideo 接口上表现最好。

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

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

% xine -g -p mymovie.avi

参考 xine-project.org/faq 了解更多信息和故障排除技巧。

7.4.2.3. 实用转码工具

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

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

这个例子演示了如何将 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 以获得更多信息和例子。