DXVA和psp

来自NMM Doc
跳转至: 导航搜索

硬件加速介绍篇

DirectX视频加速简介:

  DirectX视频加速(DirectX Video Acceleration/DXVA)是微软在Windows以及Xbox 360平台上的一种API技术规范,它允许通过硬件加速视频解码。以管线方式,将CPU疲于处理的运算,诸如反余弦变换(iDCT)、运动补偿(Motion Compensation)和反交错(Deinterlacing)等,交给GPU完成。DXVA 2.0能让更多的运算实现硬件加速,包括视频捕捉和处理。DXVA在显卡(Video Card)的视频渲染模块中工作。在Windows 2000中,DXVA 1.0作为一个标准的API被引入,并且在Windows 98以及之后的Windows中依然可用。DXVA 1.0可在覆盖合成器(Overlay Mixer)或VMR 7/9运行。DXVA 2.0,仅在Windows Vista、Windows 7以及之后的微软操作系统中可用,与Media Foundation合并,并且在MF(Media Foundation)中使用的是增强型视频渲染器(Enhanced Video Renderer/EVR)。 视频解码器为硬件加速解码和渲染特别定义了一条特殊的解码管线以使用DXVA。CPU分析流媒体并转换成DXVA兼容的数据结构。DXVA定义了一组可硬件加速的运算。除此之外,还定义了一组可以让图形驱动实现运算加速的硬件驱动接口(Device Driver Interfaces/DDIs)。如果解码器需要用到任何DXVA已支持的运算,那么通过调用这些接口,它便可实现运算的硬件加速。如果图形驱动未能调用这些接口,它将会返回给解码器进行软解码。然后已解码的视频输出给视频渲染设备。

DXVA的实现

DXVA有三种视频加速级别

  • MC加速
  • MC加速+iDCT加速
  • MC加速+iDCT加速+VLD[1]加速

[1]VLD: Variable-Length Decoding,即可变长度解码

几种常见的支持DXVA的播放器或解码器

  • PowerDVD(CyberLink): 著名的商业播放器
  • Nvidia PureVideo: 从名字就可以看出,Nvidia公司出品的视频解码器
  • MPC-HC: 继承了历史悠久的开源播放器MPC的衣襟,并在其基础上增加了许多实用功能
  • PotPlayer: 原Kmplayer作者开发的另一款播放器
  • ffdshow: 著名的开源编解码器,功能强大,内置了许多实用滤镜,在最近的版本中加入了DXVA模块

  在目前,虽然有许多播放器支持DXVA解码,但综合考虑MPC-HC是最为实用并且方便实用的。首先MPC-HC是开源软件,其次MPC-HC是绿色软件,无需安装即可使用,再则MPC-HC内置的字幕滤镜比起其他播放器,对ASS/SSA的支持度最高。因此接下来着重介绍MPC-HC


MPC-HC的DXVA对显卡的限制:

  • nVidia 8(9)xxx系列,仅支持H.264
  • ATI Radeon HD系列,支持H.264和VC-1
  • Intel G45,仅支持H.264

在未来,MPC-HC可能会增加对运动补偿模式的支持,以兼容更多古老的显卡。但在目前,还不支持MPEG2和WMV的硬件加速。


由于DXVA的限制,所使用的渲染器必须遵守以下规则:

Windows XP用户,必须使用覆盖合成器(Overlay Mixer),VMR 7或VMR9作为视频渲染器(Video Renderer)

Windows Vista/7用户,必须使用增强型视频渲染器(Enhanced Video Renderer/EVR)或EVR custom renderer


MPC-HC视频解码器必须直接连接视频渲染器,因此中间无法插入DirectVobSub或ffdshow之类的滤镜。 在DXVA模式中,外挂字幕可以通过MPC-HC内置的字幕滤镜来显示,但是对渲染器的要求更苛刻

Windows XP用户,必须使用VMR9

Windows Vista/7用户,必须使用EVR custom renderer


在 选项(Options)/播放(Playback) 中,勾上 自动装载字幕(Auto-load subtitles)


支持DXVA的视频

可以通过软件来检测:DXVAChecker


  说了那么多,其实只是想说视频加速解码真是个复杂的东西。需要硬件,解码器,视频本身等多方面的支持方可促成视频硬解。虽然复杂,但这是值得的。通过视频加速解码,我们可以将CPU从繁重又重复的工作中解放出来,让它在别的地方发挥自己的性能,以及让那些由于CPU性能孱弱但有一块还不错的显卡的电脑同样可以享受高清视频。

压制篇(x264版)

接下来将介绍如何压制一个能使绝大多数硬件加速解码方案都支持的视频 使用的编码器是x264,它是一个效率非常高的开源编码器,基于H.264标准设计。

H.264的规格分类

首先H.264的视频按照标准被分为几个规格

Profile在x264中被分为baseline/main/high (Profile越高级,支持越多的高级特性,成品的压缩率越高)

x264相关参数:--profile 可强制指定Profile,一般情况下可不选,x264将会根据其他参数自行设定此项。如果设置此项,x264将会自动无视所设Profile无法支持的高级特性。

特性支持表:http://en.wikipedia.org/wiki/H.264/MPEG-4_AVC#Profiles

Level被分为1/1.1/1.2/1.3/2/2.1/2.2/3/3.1/3.2/4/4.1/4.2/5/5.1 (Level越高,对分辨率/参考帧/码率的限制越小)

x264相关参数:--level 可强制指定Level,一般情况下可不选,x264将会根据实际情况自行设定此项,但自动设定并不一定准确。如果设置此项,x264将会自动限制DBP[2]。

具体规格详见:http://en.wikipedia.org/wiki/H.264/MPEG-4_AVC#Levels

[2]DPB,即Decoded Picture Buffer。

兼容性

目前,随着软硬件的发展,播放硬件加速播放高清视频对视频本身的限制越来越小,有些甚至已经宣称支持 High Profile @ Level 5.1。但这些毕竟只有少数软硬件支持,为考虑支持更普遍的硬件加速方案。推荐压制视频不超过 High Profile @ Level 4.1。此规格被绝大多数主流硬件加速播放方案支持。


相关参数

因为大多数方案已经支持 High Profile。因此我们只需着重考虑Level对硬件加速的兼容。 Level与DPB以及码率息息相关。而DPB与分辨率(resolution)、参考帧(ref)相关。

DPB的参考帧限制公式: ref=Min(Floor(MaxDpbMbs / (PicWidthInMbs * FrameHeightInMbs)), 16)

MaxDpbMbs:

Level 1 1b 1.1 1.2 1.3 2 2.1 2.2 3 3.1 3.2 4 4.1 4.2 5 5.1
MaxDpbMbs 396 396 900 2,376 2,376 2,376 4,752 8,100 8,100 18,000 20,480 32,768 32,768 34,816 110,400 184,320

PicWidthInMbs * FrameHeightInMbs(分辨率) 举个例子:宽为1920时,PicWidthInMbs=120;高为1080时,FrameHeightInMbs=68。其它分辨率按比例计算即可。

常见高清视频视频分辨率参考帧限制:

Level 4.1
1920x1080:  4
1440x1080:  5
1280x960 :  6
1280x720 :  9
960x720  : 12

关于码率,BD原盘都是Level 4.1,那压出来的东西一般不会超过原盘吧。

如果你有特别需求需要限制的话,可用 --vbv-maxrate 和 --vbv-bufsize 。


另外有些视频虽然标注 High Profile @ Level 5.1,但实际上这些视频也同样满足Level 4.1的限制。但由于一些解码方案直接读取视频的中压制者强制写入的Level信息,而导致无法播放。这时,我们不必重新压制,可以使用roozhou所修改的ffmpeg来简单的更改视频中的Level信息。

地址:ffmpeg

使用范例(命令行):

>ffmpeg -i input.mkv -vcodec copy -acodec copy -vbsf h264_changesps=level=41 output.mkv


参考文献: