M$制订的接口规范DirectX Video Acceleration是一个具有“分级”的标准,不仅包括了影响CPU占用率的解码视频, 还有各种后期处理运算,比如图像缩放,色彩空间转换,反交错等。DXVA 1.0规范里最早定义了MPEG2和WMV硬件解码能力,在DXVA 2.0里又增加了H.264和VC-1硬件解码能力。
DXVA并不是只有“支持”、“不支持”两个档次,显卡硬件支持DXVA规范,不代表就实现了里面所有的功能。DXVA强制规定:无论什么功能,显卡驱动的DXVA部分代码要通知系统,这项功能它实现了还是没有实现,不需要系统自己去测试。DXVA 2.0标准为显卡的解码加速能力分出了不同的档次(能力级别)。比如解码H.264的能力被分为了A~F共6个等级,其中A为最低,F为最高。
列表——DXVA2_ModeH264_A (DXVA2_ModeH264_MoComp_NoFGT)
DXVA2_ModeH264_B (DXVA2_ModeH264_MoComp_FGT)
DXVA2_ModeH264_C (DXVA2_ModeH264_IDCT_NoFGT)
DXVA2_ModeH264_D (DXVA2_ModeH264_IDCT_FGT)
DXVA2_ModeH264_E (DXVA2_ModeH264_VLD_NoFGT)
DXVA2_ModeH264_F (DXVA2_ModeH264_VLD_FGT)
DXVA2_ModeMPEG2_IDCT
DXVA2_ModeMPEG2_MoComp
DXVA2_ModeMPEG2_VLD
DXVA2_ModeVC1_A (DXVA2_ModeVC1_PostProc)
DXVA2_ModeVC1_B (DXVA2_ModeVC1_MoComp)
DXVA2_ModeVC1_C (DXVA2_ModeVC1_IDCT)
DXVA2_ModeVC1_D (DXVA2_ModeVC1_VLD)
DXVA2_ModeWMV8_A (DXVA2_ModeWMV8_PostProc)
DXVA2_ModeWMV8_B (DXVA2_ModeWMV8_MoComp)
DXVA2_ModeWMV9_A (DXVA2_ModeWMV9_PostProc)
DXVA2_ModeWMV9_B (DXVA2_ModeWMV9_MoComp)
DXVA2_ModeWMV9_C (DXVA2_ModeWMV9_IDCT)
硬件解码的加速能力的级别基本上分为4个,从高到底分别为:
VLD(Variable Length Decoding / 变字长解码):用于处理视频比特流(BitStream)
IDCT(Inverse Discrete Cosine Transform / 逆离散余弦变换):用于处理帧内压缩(Intraframe compression)
MoComp(Motion Compensatiom / 运动补尝):MC处理帧间压缩(Interframe Compression)
PostProc:显示后处理,比如Deblocking去码滤波操作。早期的GeForce 6/7或Radeon X1000显卡在开启显卡硬件加速的状态下就会关闭解码去块滤波操作Deblocking,这时播放一些影片会看到较明显的马赛克现象
VLD级别的解码包含IDCT, MoComp和PostProc;IDCT级别的解码包含MoComp和PostProc;MoComp级别的解码包含PostProc。显卡能够支持越高级的加速能力,就能更大幅度地减轻对 CPU 资源的占用。
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的限制,所使用的渲染器必須遵守以下規則:
Windows XP用戶,必須使用覆蓋合成器(Overlay Mixer),VMR 7或VMR9作為視頻渲染器(Video Renderer)
Windows Vista/7用戶,必須使用增強型視頻渲染器(Enhanced Video Renderer/EVR)或EVR custom renderer
对于H.264,还有一个FGT(电影胶片质感技术)的额外技术,所谓胶片感,在不牺牲压缩能力的同时保持视频源特有的颗粒信息。未来的H.264编码器将会有FGT的开关选项,比如针对录像摄影素材则将FGT关闭,而对于胶卷摄影,出于胶卷的特性则将FGT打开,以保持特有的颗粒信息。而在影碟机一方,其解码器将识别颗粒信息,并在噪音滤波器中应用到H.264的视频流上。对 WMV9 的支持当中,有一个级别是“PostProc(Post Processing)”,中文是“显示后处理”,它是最低级的 DXVA。
如果想详细了解自己显卡的DXVA能力靠厂家的宣传是靠不住的,我们需要一个小工具
dxva checker 它的最新版是2011-1-9发布的Version 2.4
System Requirements:Windows 7/Vista/XP,必须安装64位或者32的
Runtime:Microsoft .NET Framework 2.0
Microsoft Visual C++ 2008 SP1 Runtime
运行它就可以显示你的DXVA档次
第一列:硬件加速的类型,大部分UUID都由DXVA2.0规范所定义,但显示长长一串数字的是DXVA2.0未定义的,可能是厂商自定义的专用API
第二列:新版的dxva checker只显示加速版本。
以前还列出了硬件加速使用的color space。“NV12”是指视频输出的色系(其它的颜色系还有 YUV12、YUY 等)NV12 是用于 DirectX VA 的首选 4:2:0 像素格式,Media SDK的decoder、vpp、encoder对输入输出格式有着严格的限制,现在仅仅支持NV12,其它的如YV12格式要转化为NV12格式。
第三列是指硬件加速支持的分辨率,分别测试480P(720*480), 720P(1280*720)和1080P(1920*1080), 测试成功,就显示相关分辨率。不成功就不显示。
官方文档 http://msdn.microsoft.com/en-us/library/cc307941(VS.85).aspx
有人说,啥年代了还折腾硬解?软解画质好、方便……其实很多人是人云亦云的,你看看人家“精研事务所”(发布平均码率80Mbps、峰值码率高达100Mbps以上《阿里山》片段的有名网站)推荐硬解的玩家,啥态度?他自曝配置:4核、9800GT、4G ram
运动画面一直以来都是软解的弱处,能开的滤镜都开了,画质是能够得到改善,但看起来终究是没有硬解流畅,我说的会晃,可能很多人无法意会,就像把29.97 FPS的影片删祯转成23.976 FPS,两者看起来依旧是有差别性的,这就是有点类似我说的晃。
同样一段运动画面的影片分别以软硬解播放,并将其用播放器的功能全数录下,将影片丢进影像处理软体,你可以看到每一祯的画面,差别就在这裡!
一直以来我也用了软解很长一段时间,但是有一天无意间让我发现到这些差异,我才开始少用软解,而不是硬解被网友炒热起来而跟流行用硬解。
当初我是发现软解的运动画面流畅度不佳,开始怀疑过去的认知,不断地比较、测试、实验,看到眼睛不知道花了几回,甚至把家裏的大尺寸显示器与桌用显示器全数更换。
后来在处理影像,处理每一祯画面的图,又发现到软硬解录下的影片裡面每一祯的画面确实有差别,如此一来便肯定了自己后来新的认知!
以PotPlayer/KMPlayer为例子,先找段运动画面大约10~20秒即可。(可用 [ ] \,划出AB段落重复播放)
软解&硬解来回切换(PotPlayer=Ctrl+X 、KMP=Ctrl+Alt+F)观看,不管是BD/HD电影或HDTV歌舞节目,都能很明显的看出差别很大
软解看到运动画面时整体会很模糊,就算硬体配备是顶级的(6核),看起来是没有模糊或拉丝,但是你还是能看到整个画面有点顿。
一般软解时边缘都会模糊或拉丝(例:人体是主体,人体以外是背景,背景与人体的接缝就是边缘),也就是当你软解在看少女们的9双腿/Rainbow的7双腿时,当他们踢腿/脚动作较大时,你看到的是『糊糊』的大腿,硬体配备高的,看到的是会『晃晃』的大腿!
切换到硬解时,这些全都不见了,您看到的是白皙雪净的大腿!
至于影像的 对比、饱和、明暗,这些软硬解都能调整,别再拿这些来比较软硬解,没意义。
……对软硬解孰优孰劣存在疑惑者,可依照上面说的看几遍,自己去做判断,相信自己的眼睛就好。
附录:NV的PureVideo资料(Feature Set C是最好的)
http://en.wikipedia.org/wiki/Nvidia_PureVideo#Table_of_PureVideo_.28HD.29_GPUs
ATI:http://en.wikipedia.org/wiki/Unified_Video_Decoder#UVD_2.2