回顾高清视频的发展之路,可以说GPU高清解码完全是随着高清视频的发展而发展的。早在Geforce 6时代,GPU就集成了专门的高清视频解码模块,当时高清视频在国内才刚刚萌芽。随着高清视频的发展,GPU的高清解码技术也随之向前推进,现在的显卡已经完全可以实现硬件解码任何高清视频。
但是,对于绝大部分普通用户来说,使用显卡进行高清视频解码时,解码器的复杂设置仍然是一大难题,在很多时候我们都可能遇到对于不同编码格式的视频进行解码,需要反复的对解码器进行调校设置,有时候对于专业用户来说都是一大难题,更不说普通用户。难道,就没有办法改变这个局势吗?答案显然是否定的!
日前,CUDA解码技术正式推出,GPU高清视频解码步入了流处理器解码时代,和以往任何解码技术都不同,CUDA解码技术直接调用GPU中的流处理器进行解码运算,而之前一直是调用GPU中相应的专用视频解码模块。看起来,这样的说法非常拗口,而且非常难以理解,不用着急,下文我们就将深入浅出的来为你解释这一切!
大家知道,在早期视频的解码工作一直都是依靠CPU来完成,显卡只是负责解码后视频数据的输出。而高清视频开始出现之后,NVIDIA和ATI都纷纷推出了利用GPU进行高清视频解码的技术。想必对这方面比较了解的朋友来说,PureVIDEo-HD和AVIVO-HD这两个词都不会感到陌生。GPU视频解码的诞生就是为了解决因为高清视频运算量大,中低端CPU根本跑不动的问题,而且显卡的价格相对于CPU来说也更加便宜,用户投资更小。
在Geforce 6时代、Geforce7以及Geforce 8800时代,NVIDIA第一代高清视频解码技术出现,从那时开始,GPU内集成了专门用于视频解码的模块——VIDEo Processor,一直到现在为止,GPU内都还有这个模块。NVIDIA第一代高清视频解码可以执行视频解码过程中的后面两个步骤,由于运算量最大的步骤依然是CPU在进行处理,故虽然从一定程度上分担了CPU的任务,但CPU占有率依然很高,并不成熟。
PureVIDEo HD第一代(Geforce 7)只能执行解码过程中的后两步,到了Geforce8600,8500&8400时代,H.264视频已经可以为完全硬解,VC-1视频可以执行前三个步骤;G98之后的GPU均可实现H.264、VC-1完全硬解码
到了G8x(不包括G80)时代之后,NVIDIA在GPU中加入了VP2(第二代VIDEo Processor)模块,实现了H.264视频的完全硬件解码。但是,对于VC-1视频却无法完全硬解,视频解码的第一个步骤——Bitstream Processing(比特流处理)仍然必须由CPU来处理,而这个步骤恰好是最消耗资源的一步;所以,NVIDIA在G98之后改进了BSP(专门用于执行比特流处理运算)引擎,使其能够完全硬件解码VC-1,至此,N卡高清视频解码看似已经完美了。
然而在实际的使用过程中,使用GPU进行高清视频解码却经常会出现这样那样的问题,特别是由于解码器设置不当,导致播放视频的时候出现不能硬解、或者视频明显不正常的情况出现,特别是一些比较老的高清视频,非常容易出现这样的问题;另外,H.。所以,对于高清视频解码时解码器的设置就成了很多用户非常头疼的一件事情。不管是NVIDIA的显卡,还是ATI的显卡,都有可能出现这些问题。
为什么会出现如上一页中描述的那些问题呢?要回答这个问题,我们还得从一个叫做DXVA的东西谈起。因为,DXVA工作与否正是决定当前视频是否在使用硬件解码的标志。
“DXVA”全称是DirectX VIDEo AccelerATIon(硬件视频加速接口),它是一个由微软和图形芯片厂商联合定义的一个硬件接口规范,就好象DirectX 3D是游戏开发的应用程序接口一样,DXVA就是视频硬件解码的程序接口,显卡的视频单元必须满足DXVA的规范和要求才能实现相应的功能。
DXVA_ModeH264_A | H264_A |
DXVA_ModeH264_B | H264_B |
DXVA_ModeH264_C | H264_C |
DXVA_ModeH264_D | H264_D |
DXVA_ModeH264_E | H264_E |
DXVA_ModeH264_F | H264_F |
DXVA_ModeVC1_A | VC1_A |
DXVA_ModeVC1_B | VC1_B |
DXVA_ModeVC1_C | VC1_C |
DXVA_ModeVC1_D | VC1_D |
不过需要注意的是,DXVA是一个具有“分级”特性的标准。简单的理解就是硬件支持DXVA的级别,而不仅仅只有“支持”与“不支持”两个档次。从上面的表中我们可以看出,DXVA对H.264视频硬件加速有6种级别,而对于VC-1视频有四种级别。
DXVA不仅仅对显卡的支持度进行了分级,而且对解码器的支持度也进行了分级,也就是说解码器即使支持DXVA,也不一定能够实现DXVA中所有的功能。而由于目前视频封装格式非常混乱,就极容易出现一些不可预知的问题。如果对DXVA这个标准进行评价的话,既有好评也有坏评,好评是微软直接提供了硬件加速与解码器之间的桥梁,而坏评就是其要求十分严格,导致我们前面所说的一些问题
前面我们说到,DXVA是导致使用GPU硬解码出现问题的根本原因,如果要解决这个问题,最好的办法是脱离DXVA,比如CPU解码就不会出现什么问题,而且画质也非常好,这就是因为CPU软解码不需要DXVA(DXVA是硬件加速标准)。那么,有没有办法利用显卡模拟CPU进行解码呢?——CUDA做到了这一点。
对于CUDA这个名词相信各位都不会陌生,简单的说就是NVIDIA显卡的通用计算技术,CUDA可以直接使用GPU来进行CPU很难完成的复杂运算,理论上来说可以运行任意CPU运算的程序。而且由于CUDA编程语言和C语言基本没有区别,所以CUDA很快就被全世界各个行业所接受。
在视频领域,我们之前经常都说到了利用CUDA进行视频编码,比如我们之前测试过的Cyberlink MediaShow,vReveal MotionDSP,ArcSoft TotalMedia Theatre以及MediaCoder等。但是视频解码一直由于GPU内有专门的运算模块,导致这一领域几乎无人问津。而日前,CoreAVC推出了1.9.x版本的解码器,正式加入了CUDA视频解码的功能。
CoreAVC官方网站上1.9.5版本的广告已经赫然出现了CUDA标志
CoreAVC是非常流行的H.264解码器之一,几乎所有集多种解码器于一身的播放器都带有CoreAVC解码器。今年2月份,CoreAVC率先发布了1.9.0版本的解码器,首次支持CUDA解码H.264视频,不过由于当时存在一些播放色块的问题,很快CoreAVC就推出了1.9.5版本的解码器,从此H.264高清视频解码正式迈入CUDA时代。
我们知道,CUDA是一个完整的NVIDIA GPGPU解决方案,它直接提供了硬件的访问接口,而不必通过图形API来实现GPU硬件的访问。也就是说,CUDA从某种意义上模拟了CPU的计算。而使用CUDA进行高清视频解码的原理也就不难理解了!实际上,使用CUDA进行高清视频解码,就是通过调用GPU中庞大的流处理器资源,进行视频解码运算,并不是调用GPU中专门的视频处理单元。
视频解码的运算量虽然不高,但是对处理器的并行处理效率有很高的要求,这就是为什么多核心CPU高清视频解码的效率比单核高很多的原因。而使用CUDA进行解码,GPU中有很多的流处理器资源可以调用,所以使用CUDA进行视频解码运算,简直是轻而易举。而且由于运算量不高,解码计算基本不可能让GPU全速工作,所以在功耗方面也能得到有效的控制。
另外,由于采用CUDA架构,GPU视频解码不再需要通过DXVA进行硬件加速,所以可以彻底脱离DXVA的各种限制,从某种意义上模拟CPU进行运算,不仅可以获得非常完美的兼容性,而且画质也和CPU软解没有什么区别,设置起来也更加方便。
MediaCoder也只有编码过程采用CUDA技术
再来我们还可以谈到CUDA视频转码这件事情上,我们知道视频的转码过程实际上就是解码——编码的过程,而之前部分即使采用CUDA进行视频转码,但解码过程仍然是CPU来完成,只有编码过程由CUDA来完成,这样实际上还是没有完全利用到GPU的优势。
对于国内的高清视频用户来说,终极解码和完美解码是最受欢迎的两大播放器,均已超强的视频格式兼容度而闻名。但是,在使用CUDA进行解码的时候,我们还必须在播放软件的解码设置中专门开启才能够使用。下面我们首先来看看终极解码中如何开启CUDA高清视频(H.264)解码。
目前,终极解码的最新版本为2009春节版,遗憾的是终极解码已经很久没有更新,其内置的CoreAVC解码器为1.85版,而不是最新支持CUDA解码的1.95版,所以我们必须通过Hack的手段,让CoreAVC 1.95进入终极解码的怀抱。
首先,在CoreAVC官方网站下载CoreAVC 1.95版解码器,普通用户可直接下载14天的试用版本,有需求的用户也可以花费14.95美元购买正式版。然后安装CoreAVC 1.95(如上图)。
点击查看大图
安装完毕之后,进入CoreAVC的安装目录,笔者这里是C:\Program Files\CoreCodec\CoreAVC 14 Day Trial Edition,找到文件CoreAVCDecoder.ax,将其复制一份到桌面;然后,将桌面上的CoreAVCDecoder.ax文件更改名为CoreAVC.ax,并覆盖完美解码安装目录下\Codecs文件夹下,如笔者这里为C:\Program Files\Final Codecs\Codecs,提示同名文件请选择覆盖(如上图)。
此时,我们已经通过Hack的方法将终极解码内置的CoreAVC 1.8.5解码器替换成1.9.5解码器了,不过我们还需要在播放器里设置才能正确使用CoreAVC 1.9.5解码器。
正确覆盖文件之后,打开终极解码的“解码中心”,在H.264视频解码器下面的CoreAVC上点右键,然后选择CoreAVC 1.8.5,因为我们刚刚已经将1.8.5的CoreAVC文件替换成CoreAVC 1.9.5的文件了,所以这里勾选CoreAVC 1.8.5实际上也就是采用了CoreAVC 1.9.5解码器,只是终极解码无法识别罢了。
在这里设置完毕之后,播放器就会自动调用1.9.5版本的CoreAVC解码器,不过我们还需要在播放器里开启CUDA硬件解码。
点击放大
打开“我的播放器”(KMPlayer)并随便播放一段H.264格式视频,在播放窗口中点击右键——滤镜——CoreAVC VIDEo Decoder(如上图),进入CoreAVC设置界面。
上图才是CoreAVC的设置界面,这里我们要勾选右下角的Prefer CUDA accelerATIon才能够完整开启CUDA解码功能。该选项上面的Use Tray Icon可以让CoreAVC的状态出现在系统托盘处。
如上图所示,如果使用CUDA进行视频解码的话,系统托盘处的CoreAVC状态会显示为绿色(反之会显示为蓝色),鼠标移动过去会提示CUDA in use字样,表示正在使用CUDA进行视频解码运算。
由于终极解码目前还没有正式支持CoreAVC 1.9.5解码器,必须通过Hack的方法才能够实现,对于普通用户来说难免有些麻烦,故暂不推荐使用终极解码进行CUDA硬解H.264视频。
前面我们介绍了使用终极解码进行CUDA硬解H.264视频的方法,相对来说完美解码就要方便多了,软件本身就已经采用了CoreAVC 1.9.5版本的解码器,下面我们还是来简单的讲述一下。
安装完美解码最新版本之后,首先打开“完美解码设置中心”程序,找到H.264视频解码器,将解码器设置为CoreAVC(如上图),这样就调用了CoreAVC 1.9.5版本的解码器。
应用之后,点击H.264视频解码器右边的配置,和前面介绍的终极解码一样,勾选Prefer CUDA accelerATIon和Use Tray Icon,开启CUDA硬件解码和系统托盘提示。
如果没有问题的话,此时应该已经可以使用完美解码进行CUDA视频解码了。
● 测试平台
首先,我们应该明确本次测试目的何在。通过前面的介绍,我们已经了解了目前H.264视频不仅仅可以通过CPU硬扛、PureVIDE硬解,还可以通过CUDA硬件解码,我们本次的测试的目的也就是要看看CUDA解码的优劣何在,到底是否实用。
本次我们将主要围绕CUDA解码H.264视频时的CPU占用率和使用CUDA进行视频解码对电脑功耗的影响以及CUDA是否与显卡的游戏性能有关三个方面进行测试,为了更加方便,本次直接采用支持CUDA硬件解码的播放器完美解码进行测试。
部分读者可能会提到前文我们所说的兼容性和画质方面的问题,由于笔者手里都是一些较新的高清视频,不管是使用GPU解码还是CUDA解码,都没有兼容性问题,所以没有办法测试。不过前面笔者给大家分析过,CUDA解码H.264视频实际上是模拟CPU进行“软”解码,从理论上讲完全不会有任何兼容性问题,画质方面也不会有任何影响,和CPU理论上完全一样。所以这方面大可不必担心。
本次测试影片选择的是《007大破量子危机》1080P H.264版本,采用TS封装,CPU占用率测试场景为固定的1分钟视频(1小时08分——1小时09分),可以非常准确的体现出各种解码模式下CPU的占用率。
首先,我们来看看使用CPU软件解码时,播放这个视频的平均CPU占用率(测试截取其中一分钟的平均CPU占用率)。
● 解码器设置
解码器设置方面,视频渲染器我们选择VMR9无渲染(修正黑边)模式,H.264视频解码器选择默认的System,该选项默认为CPU软件解码。
点击查看大图
从测试结果来看,使用CPU软件解码该H.264视频,平均CPU占用率为40.96%,双核心E8200的性能还是不容忽视的,播放高清视频基本没有什么问题
使用CPU软件解码时,CPU平均占用率为40.96%,下面我们在看看通过GPU中的PureVIDEo HD单元解码相同的高清视频,CPU占用率为多少。
● 解码器设置
由于硬件解码渲染器必须为EVR增强渲染,所以在这里我们选择了EVR增强渲染(C/A)模式,H.264解码器选择的是CyberLink(DXVA),该解码器是从PowerDVD 8中提取出来的GPU硬件解码器,非常好用。
点击放大
测试结果很明显,使用GPU中的PureVIDEo单元解码这段高清视频,平均CPU占用率仅为2.28%,可以看出此时CPU仅仅在处理一些程序本省运行的计算,视频解码完全没有参与。
最重要的是看看使用CUDA进行硬件解码H.264视频时,CPU的占用率情况。
● 解码器设置
如我们前面所介绍,由于CUDA解码不需要DXVA,所以渲染器我们也不需要必须选择EVR增强视频渲染,这里选择兼容性很好的VRM9无渲染(修正黑边),和CPU软解时的选择一样。H.264解码器选择CoreAVC,并打开CUDA视频解码。
点击放大
经过测试,使用CUDA进行视频解码时,CPU的平均占用率为4.88%,相比CPU软解码时CPU占用率低了很多,但是表现不如PureVIDEo解码。
为了更加彻底的了解CUDA视频解码时对整机功耗的影响,我们还特地对三种解码方式时的系统功耗进行了测试,以得出最省电的高清视频解决方案。和之前我们测试功耗的方法一样,本次仍然采用的是一款功耗测试仪,记录整机功耗。
采用功耗表进行测试
测试结果和我们预料的差不多,使用CPU软件解码时的功耗最大,而使用显卡PureVIDEo视频处理单元解码的功耗最小,使用CUDA调用流处理器解码虽然功耗也比较低,但是相对于PureVIDEo解码来说,还是要高一些。
前面我们已经看过了使用CUDA进行高清视频解码的方方面面,但对于很多用户来说,CUDA高清视频解码的性能会不会受到显卡游戏性能的影响也很重要,笔者专门找来了几款主流显卡进行测试。
这部分测试所采用的视频为《购物狂的异想世界》,分辨率仍然为1080P,采用TS封装格式。下面是当今热门显卡的测试成绩:
由于笔者手里没有比9600GSO更低的显卡,所以未能加入如9400GT、9500GT等的测试成绩。从上面的柱状图可以看出,不管是高端的GTX275,还是主流级的9600GSO,在使用CUDA进行视频解码时,CPU占用率百分比都没有什么区别,数字上的差异完全在误差范围之内,可以看出GPU游戏性能(流处理器数量)基本不会影响CUDA解码H.264视频的性能表现。
不过,根据国外一些媒体的测试,9400GT等这些采用16个流处理器的显卡,在使用CUDA解码H.264视频的时候,CPU占用率会高一些。实际上,由于计算量并不庞大,CoreAVC在工作的时候也仅仅是利用了GPU中的一小部分流处理器资源,所以主流以上级别显卡都没什么差距。
看完前面长篇大论的介绍,相信各位对CUDA高清视频解码已经有了一个比较深刻的认识和了解。从本次的测试部分结果来看,使用CUDA进行高清视频解码无疑是目前最好的折中方案,由于不受DXVA的限制,使用CUDA解码在兼容性、画质方面要明显好于传统的GPU硬解码——PureVIDEo HD,另一方面在效能和功耗方面领先CPU很多倍。
前面我们已经介绍过使用CUDA进行视频解码的优势,然而实际上,使用CUDA进行高清解码的好处还远不止这些。首先,我们再也不必频繁的在解码器设置中频繁的改变设置来解决兼容性问题,使用CoreAVC几乎可以完美解码所有H.264视频。就拿“完美解码”这款软件来举例,我们只需要将H.264的解码设置成CoreAVC并开启CUDA加速、VC1的解码开启微软WMV硬件加速、MPEG2视频使用CyberLink DXVA硬件加速,就可以实现一劳永逸的解码器设置方案,几乎可以完美播放所有高清视频。
完美解码的解码器一劳永逸设置方案
另一方面,CUDA解码还有一大好处就是能获得视频数据流,从而在此基础上进行后处理或者转码运算,比如 TotalMedia Theatre倍线,MotionDSP运动补偿,Badaboom转码都直接采用了CUDA解码以及CUDA编码的方案,所以转换效率非常高。而PureVIDEo解码无法获得视频数据流,其输出的数据只能输出到屏幕上,没有办法再进行后期处理。
第三,虽然目前中高端CPU软解高清视频已经不费吹灰之力了,但这是在正常速度下播放高清视频时才能实现这么好的效果,但如果用高倍速播放高清视频呢呢,CPU照样不堪重负。比如,视频转码的时候,其实就是高倍速处理视频,此时即便四核也忙得不可开交,如果能将这部分运算交给GPU CUDA处理,速度自然更快,效率更高,消除了转码瓶颈。
照这样来看,如果第三方播放软件能进一步优化的话,相信基于CUDA解码器的倍线等一系列技术都能在终极解码或完美解码上实现。
如果要说CUDA解码视频的缺点的话,想必目前最大的缺点就是无法支持VC-1以及MPEG2编码格式的视频,这与CoreAVC解码器本身只是针对H.264解码的根本特性有关。不过笔者相信,在未来肯定会有解码器厂商推出基于CUDA的VC-1视频解码器。另一方面,由于CUDA仅仅支持G8x之后的NVIDIA DX10显卡架构,所以该解码方法Geforce 6、Geforce 7以及A卡用户均没有办法享受。
总体来看,使用CUDA进行高清视频解码在原有的PureVIDEo HD解码方式基础上,给了用户另一个非常好的选择,而其能直接获得视频数据流的特性想必也会被更多厂商所利用。如果说GPU完全硬解高清视频是视频解码的一次革命的话,那么使用CUDA进行高清视频解码绝对可以算得上是又一次革命。