16.4. 视频回放

贡献者Ross Lippert.

视频回放是个很新并且迅速发展中的应用领域。一定要有耐心,因为不是所有的事情都象处音频那么顺利。

在开始之前,你要了解显卡的类型以及它所用的芯片的类型。虽然XFree86 支持大量的显卡,但能达到好的回放效果的却寥寥无几。在X11运行时,你可以使用命令 xdpyinfo(1),获得使用你的显卡的X服务器(X server)所支持的扩展列表。

为了评估各种播放器和设置,你须要有一小段用作测试的MPEG文件。由于一些DVD播放器会默认地在 /dev/dvd里去找DVD文件,因此,你会发样建立符号链接到恰当的设备会很有用:

# ln -sf /dev/acd0c /dev/dvd
# ln -sf /dev/racd0c /dev/rdvd

在使用了devfs(5)的FreeBSD 5.X里, 有一个略微不同的推荐链接集:

# ln -sf /dev/acd0c /dev/dvd
# ln -sf /dev/acd0c /dev/rdvd

注意:由于devfs(5)本身的原因,象这样手工建立的链接在重启后将不会存在。想要无论什么时候你启动系统都能自动建立符号链接,那就把下边这行加到/etc/devfs.conf里边:

link acd0 dvd
link acd0 rdvd

另外,DVD解密要求调用专用的DVD-ROM函数,要求把许可定到DVD设备里。

一些未定的ports(ports discussed)要正确地建立(build)有赖于下列内核的选项设置。在试图建立之前,把这些选项增加到内核配置文件中去,建立新的内核,重启系统:

option CPU_ENABLE_SSE
option USER_LDT

Note: option USER_LDT 在FreeBSD 5.X里并不存在。

为了增强用于共享内存的X11接口,推荐增加一些sysctl(8) 参数的值:

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

16.4.1. 测定视频的性能

在X11下有几种可以显示图像的方式。倒底哪个能工作很大程序上依赖于硬件。首先,下边描述的每一种方法在不同的硬件上都会有不同的品质。其次,在X11里的图像显示近来引起普遍的关注,随着 XFree86 的每一个版本,都会有很大的突破。

常见图像接口列表:

  1. X11: 一般性的使用共享内存的X11输出。

  2. XVideo: 一种X11接口扩展,支持任何X11图像的可拖拉。

  3. SDL: 简单直接媒体层。

  4. DGA: 直接图片存取。

  5. SVGAlib: 低层次掌控图片层。

16.4.1.1. XVideo

XFree86 4.X有种扩展叫做XVideo (或称Xvideo, Xv, xv) ,它可以通过一个特殊的加速器直接把图像显示在可拖拉的对象里。即使在底端机器里(例如我的PIII 400 Mhz膝上电脑),这个扩展也提供了很好的播放质量。可惜的是支持这种功能的卡中找去找来就只有目前的几种:

  1. 3DFX Voodoo 3

  2. Intel® i810 and i815

  3. 部份 S3 芯片组(such as Savage/IX and Savage/MX)

即使你的显卡不在其中,你也不要失望。XFree86 4.X 每一次出品都会增加新的xv能力 [1]. 要检查扩展功能是否在运行,可以使用命令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, 等等)并不总是随着XVdieo的每一次执行而存在。没有它们可能或迷惑有些人。

如果结果看起来是这样:

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

那么你的显卡可以就不支持XVideo功能。

如果你的卡不支持XVideo,则只是说明你的显示器在满足刷新图像的计算要求上存在更大的因难。尽管显卡和处理器很重要,你仍然会有个不错的显示效果。 You should probably read about ways of improving performance in the advanced reading Section 16.4.3.

16.4.1.2. 简单直接媒体层

简单直接媒体层(SDL),原意是做为Microsoft® Windows®, BeOS, 和 UNIX®之间的端口层,允许跨平台应用发展,更高效地利用声卡和图形卡。SDL层可以在低层访问硬件,有时这样做就比X11接口层更为高效。

关于SDL可以参考devel/sdl12

16.4.1.3. 直接图形存取

“直接图形存取”是XFree86的扩展,它允许一个程序迂回X server和直接改变帖缓冲(framebuffer)。因为它依靠一个底层的交换存储器来影响这种共享,程序必须以root来执行。

DGA扩展可以能过dga(1)来测试和衡量。在dga执行时,一当有按键被按到,它就会改变显示的颜色。按q退出。

16.4.2. Ports 和 包(Packages) 对视频的解决

这部份主要讨论在FreeBSD Ports集中提供的可用于视频回放的软件。视频回放在软件发展中是个很活跃的领域,并且各种不同程序的功能可能与这里的描述不尽相同。

首先,要弄清楚的重要一点是在FreeBSD上使用的视频程序其发展与在Linux里使用的是一样的。大部份程序都还处在β阶段。使用FreeBSD的包可能面对的问题:

  1. 一个应用程序不能播放其它程序制作的文件。

  2. 一个应用程序不能播放其自已制作的文件。

  3. 不同机上的同样的程序,各自重新建立(rebuild)了一次,播放同一个文件结果也会有不同。

  4. 一个看起来没什么的过滤器,如图像尺寸的调整,也有可能因为一个调整例程的问题变得很不象样。

  5. 应用程序频繁地留下垃圾(dumps core)。

  6. 文档如没有随着port一起安装,实际上也可以上网找到,或者去port的work目录下找。

这些程序中许多也体现了``Linux主义''。即,有些问题来自于(程序)使用的标准库存在于Linux的发行版中,或者有些是Linux内核的功能,而该程序的作者事先所假定了的是Linux内核。这些问题并不总是被prot编护人员注意到或处理过,这也就可能导致如下问题:

  1. 使用/proc/cpuinfo去检测处理器的特性。

  2. 滥用线程可能导致一个程序悬挂完成,而不是完全中止。

  3. 软件还不属于FreeBSD Ports集,而又与其它程序经常地一起使用。

现在,这些程序的开发人员也已同port的维护人员进行了联合,以减少制作port(port-ing)时出错。

16.4.2.1. MPlayer

MPlayer是近来开发的同时也正迅速发展着的一个视频播放器。MPlayer团队的目标是在Linux和其它UNIX系统中的速度和机动性能。在团队的创始人实在受不了当时可用的播放器的性能时,这个计划就开始了。有人也许会说图形接口已经成为新型设计的牺牲品。但是一但你习惯了命令行选项和按键控制方式,它就能表现得很好。

16.4.2.1.1. 创建MPlayer

MPlayer存放在multimedia/mplayer中。在创建的过程中 MPlayer要完成很多的硬件检测,最后得到一个二进制文件,这个文件不能移支其它系统里使用。 因此,要从ports里边创建时,而不要使用“包”,这点很重要。另外,还有几个选项要在make的命令行里指定。在正式创建(build)之前,要说的就这些。

# cd /usr/ports/multimedia/mplayer
# make
You can enable additional compilation optimizations
by defining WITH_OPTIMIZED_CFLAGS
You can enable GTK GUI by defining WITH_GUI.
You can enable DVD support by defining WITH_DVD.
You can enable SVGALIB support by defining WITH_SVGALIB.
You can enable VORBIS sound support by defining WITH_VORBIS.
You can enable XAnim DLL support by defining WITH_XANIM.

如果你已经安装了x11-toolkits/gtk12,那么你就可以选用GUI了。否则,就不用这样做了。如果你想用MPlayer来播放DVD文件(很可能是CSS编码),你就必须在此处[2]的选项里选用“DVD支持”。一些可用的选项:

# make WITH_DVD=yes WITH_SVGALIB=yes

在写这章时,MPlayer port已会创建自已的HTML文档和一个可执行的mplayer。当然也可以创建一个编码器--mencoder,它是一个可以对视频再编码的工具。修改一下Make文件(Makefile)就可以得到。这在随后的port版本中是默认的。

MPlayer的HTML文档信息很丰富。如果你发现本章关于视频硬件和接口的信息还不全面的话,MPlayer的文档会是个充分的补充。你要认真地花上一定的时间去读读MPlayer的文档,如果你正找寻关于UNIX里支持视频的信息的话。

16.4.2.1.2. 使用MPlayer

任何MPlayer用户必须在它的主目录下建立一个叫.mplayer的子目录。输入下边的内容来建立这个必须的子目录:

% cd /usr/ports/multimedia/mplayer
% make install-user

mplayer的手册里列出了它的命令选项。HTML文档里有更为详细的信息。这部份里,我们只是描述了很少的常见应用。

要播放一个文件,如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,须要把testfile.avi替换成-dvd <N> DEVICE(设备名),这里<N> 指要播放的主题号,DEVICE 指的是的DVD光驱(DVD-ROM)的设备结点。例如:要从/dev/dvd播放主题3:

# mplayer -vo dga -dvd 2 /dev/dvd

要停止、暂停、前进等等,可以参考设定的按键---这些可以执行mplayer -h得到或查看手册。

另外,回放的重要选项是:用于全屏模式的-fs -zoom和起辅助完成作用的-framedrop

为了让mplayer的命令行不是太长,使用者可以通过建立一个文件.mplayer/config来设定如下默认选项:

vo=xv
fs=yes
zoom=yes

最后,mplayer可以把DVD题目(title)抓取成为.vob文件。为了从DVD中导出第二个题目,请输入:

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

输出文件out.vob将是MPEG并且可以被这部份描述的其它“包”利用。

16.4.2.1.3. mencoder

如果你在创建选择MPlayer里选择安装mencoder的话,你就会得到警告--它还是处于实验阶段。在使用mencoder之前,你最好还是要去HTML的文档里熟悉一下那些选项。这里有页指南,如果没有HTML文档它也没什么用。有不计其数的方式去提高质量、降底位率、改变格式和一些可能产生不同效果的技巧。这里有两个实例指导你。第一个是:

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

不正确的命令选项组合可能使生成的文件不能被mplayer播放。因此,如果你只是想抓取文件,一定在mplayer里使用“-dumpfile”。

转换input.avi成为带有MPEG3音频编码 (要求audio/lame )的MPEG4编码:

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

这样就产生了可被mplayerxine播放的输出。

input.avi可以换成-dvd 1 /dev/dvd ,以root用户直接运行重新编码一个DVD题目。可能不对第一次的表现并不满意,推荐你把这个主题导成文件,然后以这个文件进行处理。

16.4.2.2. xine视频播放器

xine视频播放器是一个关注范围很广的项目,它不仅看准多合一的视频解决,而且出品了一个可再用的基本库和一个可扩展插件的可执行模块。发行有“包”和port版本-- multimedia/xine

xine播放器仍然很粗糙,但这很显然与好开头无关。实际上xine 即需要一个快速的带有快速显卡的CPU,也支持XVideo的扩展。图形界面(GUI)可以使用,但很勉强。

到写这章里,还没有可用于播放CSS编码的DVD文件的输入模块随同xine一起发行。第三方的建造(builds)里内建有这样的模块,但都不属于FreeBSD Ports 集。

MPlayer相比,xine 为用户考虑得更多,但同时,对用户来说也少了很多有条理的控制方式。xine 播放器在XVideo接口上做得不错。

默认情况下,播放器xine启动的时后会使用图形界面。那么就可以使用菜单打开指定的文件:

% xine

另外,没有图形界面也可以使用如下命令立即打开播放文件:

% xine -g -p mymovie.avi

16.4.2.3. 使用transcode

软件transcode不是一个播放器,而是一套再编码.avi.mpg 文件的工具。使用transcode,借助标准输入输出(stdin/stdout)流接口,利用命令行工具,可以合并视频文件、修复坏文件。

MPlayer一样, transcode是个实验性软件,必须通过portmultimedia/transcode来建立。make使用了大量的选项。我推荐:

# make WITH_LIBMPEG2=yes

如果你计划安装multimedia/avifile,那么就把选项WITH_AVIFILE加到你的make命令行里,如下所示:

# make WITH_AVIFILE=yes WITH_LIBMPEG2=yes

这里有两个使用transcode进行可调整视频输出的转换实例。第一个把输出编码成openDIVX AVI文件,第二个是编码成更为小巧的MPEG格式。

% transcode -i input.vob -x vob -V -Z 320x240 \
-y opendivx -N 0x55 -o output.avi
% transcode -i input.vob -x vob -V -Z 320x240 \
-y mpeg -N 0x55 -o output.tmp
% tcmplex -o output.mpg -i output.tmp.m1v -p output.tmp.mpa -m 1

有个关于transcode的参考页,仅有很少的关于各种tc*(如 tcmplex)应用的文档,这也是安装了的。命令行选项 -h 有时也可以给出简单的使用格式的说明。

相比之下,transcodemencoder运行起来要慢许多,但它可以制作出更多可播放的文件。例如,用transcode创建的MPEG文件众所周知可以在Windows Media® Player 和 Apple's Quicktime®里播放。

16.4.3. 进一步了解

FreeBSD里不同的视频软件包正迅速发展中。很可能在不久的将来,这里所谈到的问题都将得到解决。同时,有些人想超越FreeBSD的声/像(A/V)能力,那他们就不得不从一些FAQ和指南里学知识,并使用一些不同的应用程序。这里就给这些读者指出一些补充信息。

The MPlayer 文档是很技术性的。这些文档可以给那些希望获得关于UNIX视频高级技术的人们提供参考。MPlayer邮件列表很不喜欢没耐心阅读文档的人,如果你发现什么问题,想报告给他们--RTFM的话。

The xine HOWTO里边有一章是关于提高性能的,对所有的播放器都很适应。

最后是一些很有前途的程序,读者可以试一下:

Notes

[1]

有个非常流行的带有很棒XFree86性能的图形卡---nVidia, 也不得不向XFree86团队公布他们对XVideo支持的规范书。不久的将来,XFree86就可以在这些卡上完全支持XVideo。

[2]

在有些国家,播放没授权的DVD是犯法的。请在使用这个选项的时候检查当地的法律。