Linux与视频文件的硬解播放

硬解还是软解,这是个问题。但关键是,你能硬解么?视频文件要播放得先拆包分离,然后对分离出的数据解码,解码后才是可播放的raw视频直接输出到显示器播放。其中使用cpu进行解码,就是软解,使用GPU(显卡)进行解码,就是硬解。

那么为什么需要硬解。一般来说,windows下,默认的解码方式一般是软解,硬解是相对有点麻烦的。cpu的运算能力足够,一般使用软解也非硬解,因为软解现在更成熟,对应的编码更广,也更稳定。但,前提是你的cpu足够劲。我认为拥有移动版i3以上的cpu,硬解就毫无必要了。但我用来装linux的小贝壳是c-60的cpu,频率只有坑爹的双核1G,还不如我的手机,但是它内置有一颗不错的显卡,HD6290,可以达到i3级别,这种情况下硬解就是唯一出路。但是linux硬解却是很麻烦的。

Linxu显卡驱动

现在显卡制造商分为三大家:intel,ati和nvidia,一般来说,n卡是最稳定支持也最多的,但是n卡只有闭源驱动,这也是林纳斯对nvidia竖起中指的原因之一,intel次之,intel只有一种驱动,但这玩意是开源的,配合intel强大的技术力,让intel成为至少是我认为的linux最好选择,最后是ati,广大linuxer认为最坑爹的厂商。ati有2种驱动,开源的一种,只能发挥出显卡一半的性能而且耗能极大,闭源的一种,相对好一点但比n卡稳定性差很多。我的就是a卡,至今为止不曾悲剧。

但是光有显卡驱动还不够.这在windows上也是一样的。显卡驱动本身不提供硬解所用的编程接口,你还需要驱动和播放器中间的api接口,从windows上这个叫DXVA,是自带的,由微软定义。从linux上由于没有了厂家,所以只能由显卡制造商来定义,n卡的名为vadpu,a卡和intel的名为vaapi,是由intel开发的。

我的猜测,可能不对(我经常犯错).在windows上编写一段代码,计算1+1=?,很简单就得出了,但是这个结果是由cpu计算的,如果要由gpu计算1+1=?,就得安装相应厂家的sdk,道理是一样的。相应显卡驱动可能提供了把某条线显示在某个位置的函数,但是不一定提供计算的函数,所以需要sdk把计算翻译成驱动能理解的语言。直接和驱动对话,如果播放器自身具备翻译的能力应该也是可以的,但是不现实,要每个播放器都去实现这些复杂又相互重复的任务。所以厂家就站出来,提供了这段代码。所以:

1.你需要正确安装显卡(闭源)驱动
2.你需要正确的安装vaapi(或vadpu)
3.你需要一个能正确调用vaapi接口的播放器

看起来是很艰巨的任务啊。

首先cat /var/log/Xorg.0.log | grep UVD。如果[ 2785.567] (II) fglrx(0): UVD feature is enabled(II) fglrx(0): 或者类似,说明硬件支持。我参照http://taoofye.appspot.com/?p=204001(需那啥,否则打不开) 和 http://taoofye.appspot.com/?p=204001 进行设置。但这两篇都太老了,跟不上时代的发展,前者虽然是最近的但是介绍的方法不奏效,我来总结一下,唯有原理是永不过时的。首先你需要正确安装闭源驱动,我的ati显卡,直接安装了ubuntu附加驱动里提供的版本,实测OK。接下来是vaapi,我单纯的也是从源里安装:

sudo apt-get install i965-va-driver
sudo apt-get install libva1 vainfo
sudo apt-get install xvba-va-driver
sudo apt-get install libva-glx1 libva-dev

会安装一些依赖包:

libva:也就是传说中的VAAPI,是一个开放源代码的提供硬件解码功能的模块;
va-i965-driver:Intel显卡的VAAPI后端,负责连接Intel显示卡驱动与VAAPI。
xvba-video:AMD/ATi显卡的VAAPI后端,负责连接AMD/ATi显示卡驱动与VAAPI。
vdpau:NV显卡的VAAPI后端,负责连接NV显示卡驱动与VAAPI。

然后vainfo一下,如果最下面有vaapi且没有什么错误,就成功了。

vaapi接口播放器

linux上可用硬解的播放器,据我调查,分为御三家。XBMC可调用xvba硬解,大名鼎鼎的mplayer,可调用vaapi,和花见花开的vlc,这好像是最好的。

XBMC我不是太熟,之前都没听说过,有兴趣的可以看看http://forum.xbmc.org/showthread.php?tid=116996,有详细的说明,需要注意的是它也要添加第三方源来安装,不过有现成编译好的版本

Mplayer本身的代码不含任何vaapi支持,气人的是它内置了vaapu支持,团队老大大约是nvidia的人。支持vaapi的是mplayer的一个分支,叫mplayer-vaapi,你可以在gitorious.org/vaapi/mplayer 使用git获得源代码,可是这货是需要自己编译的,我花了整整一个晚上编译它,最后碰了一鼻子灰。和网上说的完全不一样。make失败,我怎么知道vo_vaapi.c里为什么他妹的少个变量,这又不像少个文件那么简单。需要注意的是这货在pacman里有一个预编译的包,所以假如你使用arch的话,可以试试。而且这货即使安装成功也没有出色的图形前端,公认最好的前端smplayer在vaapi解码下各种死机。但如果能忍受这一切并且编译成功的话,据我所知它是性能最好的。

最后是vlc,最傻瓜的选择。最新的vlc 已经预先内置了vaapi支持,所以你直接在vlc里输入与解码器选项卡,打开硬件加速,就可以硬解了。如果是从命令行启动vlc可以看到using va-api 0.32 version等等类似的信息就行了。需要注意的是vlc的wiki里有两篇谈到硬解如何如何费事,还要重新编译vlc云云那都是三年前的,现在不那样了。

那么硬解有什么效果?我的华硕1015BX之前播放720p偶尔会卡,现在完全不卡了,下载了《我是传奇》的1080P 官方宣传片,也不卡,但是不是所有1080P都不卡,放了放思路压得拯救大兵瑞恩,每隔5秒会卡一下,但起码不是完全不能放,证明解码能力的确大大提高,与此同时,cpu占用大概只下降了10%还不到,但是解码能力提高是关键。

我很希望在买这小白贝壳机之前有人能告诉我这些,但是事实证明,世上没有什么救世主,一切还是得靠自己。

One thought on “Linux与视频文件的硬解播放

发表评论

电子邮件地址不会被公开。 必填项已用*标注