原文地址:http://www.5i01.cn/newsdetail.php?id=4481
作者:G.F.
我还记得我装第一台电脑时,为了看VCD的....好看影片(羞),还特别去买一张VCD加速卡来看一些夜市买来的片子,因为当时的烂电脑连放MPEG-1的影片都没力。玩电脑够久的人可能有买过这些VCD/DVD的影片加速卡,但显示卡往3D快速发展之后,这种专门看影片的附加卡就销声匿迹了,除了VCD和DVD,也没再看过HD高画质影片加速卡了,因为现在出去买一张显示卡,就有MPEG-1、MPEG-2(DVD)、WMV、VC-1、H.264加速,两大蓝光阵营Blu-Ray和HD DVD在还没有普及前,新的显示卡就已经100%支援了。
影片加速是近年显示卡最热门的附加功能,但为什么显示卡3D发展也顺便带动影片加速功能?一个3D一个2D感觉没啥关连,其实除了厂商想要增加显示卡的附加价值之外,显示卡的3D运算其实和影片加速脱离不了关系,虽然乍看之下根本连不起来。
本篇要讲的就是ATI和NVIDIA现在狂炒的AVIVO HD与PureVideo HD,他们到底是什么?而最常被问的就是“要才样启动显示卡的硬件加速?”,最大的混淆就是NVIDIA PureVideo技术与PureVideo Decoder的错误命名,以下我们将重头详细解说,让大家彻底了解!
NVIDIA PureVideo HD与ATI AVIVO HD是目前两大硬件加速技术。
影片压缩
首先,影片是什么?想都不用想,影片就是一连串的静态图片连续播放,一些影片格式会讲24p、30p、60i,指的就是每秒有24、30、60张图片。但影片至少都有好几秒,电影甚至是以小时来计算,大家做点算术就知道一小时的影片就要十万张的图片,那是非常大的资料,因此所有的影片格式都必须透过破坏性压缩,删掉部分图片的资讯让档案缩小,而影片播放就是一种“解压缩”的动作,把档案还原成一张一张的画面,硬件加速就是加快解压缩的动作,为了彻底了解,一定要来聊一下影片是如何压缩的。
[注:我这里就不提色彩空间转换的步骤,有兴趣的人自行查询“RGB转YUV”。]
1.动态补偿
大家都看过影片,让我点出一个你早已知道的事实:在一小段时间内,影片的画面大多是类似的。,比如上面两张火车的图片是从大约3秒钟的影片段落中随意截出来的,在这3秒内,摄影机就固定这个角度拍火车通过,而我们知道一般影片每秒都有24~60张,换句话说,这简单的火车段落可能高达有100张的图片,而每一张看起来都差不多。
当连续图片的内容都差不多时,要怎么压缩?很简单,就是取一张图片做标准,之后类似的图片就不存图片内容了,而只存“跟原来那张标准图片的差异点”。比如上面的火车图,第一张做为标准图,第二张就只存火车头的位置往左下角移动了XX像素,反正画面的其他部分几乎都一样。而这个参照的动作就叫“动态补偿”(Motion Compensation),在影片压缩的领域,它是把画面切成一块块小区域(16x16~4x4的像素),然后每个区域去比对前后张画面的相同位置,看有没有改变,有的话就只纪录画面的变化,这样连续的图片就只剩下几张标准画面和一堆参照的资讯而已,这是第一步压缩。
影片的连续画面会分成I、B、P三种,I画面就是原始参照画面,也就是画面出现大便....嗯,出现大变换、无法参照之前画面的时候,就会被列为I画面。P画面则是参照前一张I画面,纪录相异点,B画面则是双向参照I或P画面(最新的H.264是特例,它的B画面可以参照别的B画面)。所以P画面是出现小变换时用的,而B画面则是出现微小变换时用的。一般影片压缩后就是像图中这样IBBBPBBI,事实上真正有图片内容的只有I画面,其他都是参照纪录而已。
2.正余弦转换
正余弦转换(Discrete Cosine Transform,简称DCT),哇靠!听起来超专业,多念几次就觉得自己像数学家了。这里不讨论DCT的傅立叶转换公式,反正Google一下就有,就算写出来也没几个人看的懂,这篇是简单教学,而不是帮助入睡的。
DCT是把空间的资讯转换成频率。一张画面原本记录X、Y轴上某一点是什么颜色,XY轴就是一种空间资讯,对一张图片做DCT转换之后,会变成以频率来纪录。图片的“频率”是什么鬼?你一定会这样问,声音的高频是尖锐,图片的高频则是颜色快速转换的地方,低频就是...呃...颜色转换不快速的地方,也就是较为柔和的渐层。
上面的黑白图经过DCT转换后,就只剩下座标轴上一个短暂的突起。
比如上面这张黑白图,经过DCT转换之后就变成座标轴剩一个突起(黑白转换的交界),其余就是平缓的低频讯号(黑色和白色连续处),看到这里大家应该知道DCT的用意了,它就是把后面的低频去掉,只留下前面的高频,以图片的语言来说,就是让画面只留下重要的边缘,而细微的渐层拿掉,这牵涉到人脑的感知方式,人脑只要有一个大约的轮廓就能辨识,一张怀旧而模糊的照片仍然可以看出是谁,再糊的RVMB日剧(主角五官都快看不清楚了)大家都看的下去。所以影片压缩就照这个方式,把低频讯号删掉,保留大致的样子,做成第二步压缩。
3.Entropy Encoding
“熵”...哇塞!听起来超厉害,多念几次就觉得自己变物理学家了。物理上的Entropy跟电脑的Entropy有没有关系我不确定,所以我通常不会翻成中文,保留原来的Entropy Encoding比较好。
影片压缩到这一步已经不需要再删东西了,Entropy Encoding是一种无失真压缩的技术,资料可以完整的还原,这广泛用在档案压缩上(Zip、RAR...你举的出来的都有用到)。它是一种用机率来压缩的技巧,出现机率越高的字串资料,就用越短的代码来代取它。比如Mobile01里最常出现的词是“劝败”,那就把“劝败”用“0”来代替,这样一句话就可以写成“Nokia N95真赞,值得0”,是不是就缩短了?而当这个词出现机率超高时,就会看到资料变成一堆0,这时再把一堆0写成“几个0”的资讯(000000 = 6,0),压缩率就相当高了。
Entropy Encoding的算法很多,比如VLC、CABAL、CAVLC,愈新的影片格式(比如H.264),Entropying Encoding的算法就愈复杂,可以压的更小,当然也需要愈操的压缩/解压缩运算。
影片播放与加速
呼!终于讲完压缩的部分了,接下来是两万字的影片播放步骤解说,哈!吓大家的,其实影片播放就是上面三个步骤倒过来,先把Entropy Encoding的资料还原,再做iDCT(inverse DCT)把频率资讯变回空间资讯,最后用动态补偿加上参照的资讯,还原成每一张画面,就是大家看到的影片了。原本这些解码工作是CPU要做,硬件加速就是把这些工作转到显示卡上,降低CPU占用率,或是让更低阶的CPU可以播放。
显示卡最早加入硬件加速的步骤是“动态补偿”,因为这跟3D运算的方式很像,事实上,目前最新的影片硬件加速都还有部分用到3D运算核心。“动态补偿”是把画面切割成小区域做比对,还原时就是用影片档里那些参照纪录,对照标准画面来算出每一张画面,由于画面是切成一块块区域,每个区域都是独立的,正好可独立送到显示芯片里多个平行化单元(也就是Shader)一起做运算,但并非所有解码的步骤都能由Shader来处理,iDCT和Entropy Decoding就和显示芯片的运作方式相反(这两步无法平行化运算,用CPU比较快),GPU要支援这些,就得实实在在地内建一个解码单元,专做iDCT和Entropy Decoding。
硬件加速的几大步骤,两家都有自己惯用的宣传名词,图中Bitstream Processing就是Entropy Decoding,Inverse Transform就是iDCT,再来是动态补偿,最后一个Deblocking是“去区块”,因为动态补偿是以区块来还原画面,如果没有Deblocking的动作,整个影片画面就会裂成像棋盘状,这一步并不操,但是是必须的。
如何启动硬件加速?
而显示芯片是怎么做硬件加速的?或更直接一点:“如何启动硬件加速?”,其实对于显示卡来说,“硬件加速”一直都在启动状态,只是有没有去用而已。在3D游戏里,我们已经知道DirectX与OpenGL是游戏和显示卡之间沟通的语言,游戏用DirectX写,显示卡支援DirectX,显示卡就能运算游戏里的3D画面。完全同样的道理也能放在影片播放上,只是DirectX换成DXVA(DirectX Video Acceleration),而所谓的PureVideo和AVIVO,其实就是显示卡执行这些DXVA指令的技术
硬件加速的步骤,只要解码器读到正确的影片格式,解码器本身也支援DXVA的话,就会把解码的工作丢给显示卡,解码结束之后再把结果传给解码器,输出最后的画面。
前端的解码器最重要,支援硬件加速的解码器遇到特定影片格式时,就能把解码的动作改用DXVA的指令来写,送给显示卡去加速运算,再把运算结果回传变成画面。很多人以为要启动PureVideo就一定要装NVIDIA PureVideo Decoder,事实上这是名称上的误解,NVIDIA PureVideo Decoder只是支援PureVideo技术的解码器“之一”,许多著名的播放软件都已经支援PureVideo或AVIVO,像台湾之光PowerDVD、WinDVD、Nero ShowTime、Windows Media Player等等。
而且那个NVIDIA PureVideo Decoder只是DVD播放软件(MPEG-2解码器),它不能...也永远不可能播放其他新格式,比如H.264、WMV、VC-1等等,要硬件加速这些新格式,只有上述几个市售的播放软件有支援,装NVIDIA PureVideo Decoder是完全无用的。
另外,其实DXVA只是一个泛称,微软所订的DXVA 1.0只支援到MPEG-2,现在播放软件支援VC-1或H.264硬件加速都是显示芯片厂与播放软件厂合作,用DXVA的延伸指令所做,两家所用的专属指令并不一样。所以现在事情演变有点复杂,要真的确定有硬件加速,播放软件得明确地说有支援PureVideo HD和AVIVO HD才行,而且NVIDIA和ATI的硬件加速一直在改,驱动程式和播放软件也得一直升级才能支援最新的技术。
[注:新的DXVA 2.0支援所有新格式,但很不幸的,它跟DX10一样是Vista Only,所以厂商可能还是会继续用专属指令,让播放软件可以同时支援XP和Vista。]
播放软件通常只会简短的写“启用硬件加速(NVIDIA PureVideo)”,但PureVideo和AVIVO改来改去,搞一堆专属指令,为了避免麻烦,一律使用最新版的播放软件最没问题。
这是未开硬件加速前,播放“黄金罗盘”的1080p Quicktime预告片(H.264格式),CPU是C2D E4300,占用率整个飙高。
开启GeForce 8600GT的硬件加速后,CPU占用瞬间掉到只剩不到10%。
总而言之,要使用这些显示卡的硬件加速,必须要有:1.支援硬件加速的显示卡、2.最新的驱动程式、3.特定的解码器(PowerDVD或WinDVD)并勾选硬件加速选项、4.软硬件都有支援加速的影片格式(如MPEG-2、WMV、VC-1、H.264),缺一不可。像XviD、DivX、RMVB这种非业界标准的格式是不太可能会有厂商支援的,因为他们首要着眼点是像DVD、Blu-Ray、HD-DVD这种光盘媒体所用的影片格式。
[注:有人会问硬件加速支不支援.avi影片档,这是另一个常见的误解,影片附档名跟压缩格式可以是完全无关的,所有的影片压缩格式都能变成.avi档,要真正看出它的压缩格式,可以抓GSpot来看。]
PureVideo HD与AVIVO HD
现在PureVideo HD与AVIVO HD的发展已经到100%硬件加速了,ATI在Radeon HD 2000之后,几乎全系列(除了2900XT)都可以对MPEG-2、VC-1、H.264、WMV做完整硬件加速,这包括动态补偿、iDCT和Entropy Decoding三大步骤;NVIDIA目前仍然缺少VC-1的Entropy Decoding,其他则跟ATI相同,不过在新版8400GS(D9M/G98)推出之后NVIDIA会追上ATI的水准。其实,现在两边的硬件加速技术都远超过一般人所需,因为大流量的H.264与VC-1影片并不常见,只有Blu-Ray和HD DVD会用到,不过总有一天这些新世代电影光盘一定会普及。
虽然NVIDIA一直号称PureVideo HD只少了一步,差不了多少,但少的Entropy Decoding事实上是三大步骤里最操的。
硬件加速除了减轻CPU的负担之外,也能让影片画质提高,最常见的就是“去交错”(De-interlace),由于种种我已经没力再写的历史包袱,很多影片的画面并非完整的,而是用一条条奇数或偶数扫瞄线交替组成,“去交错”就是把它们重新运算成完整画面。而这不只是前后两张黏在一起而已,事实上,去交错比单纯降低播放时的CPU占用率更复杂,因为去交错很多是By case,同一种算法不能套用在所有影片上,幸好交错影片只有在DVD时代比较常见,现在新的影片大多是完整画面了,谢天谢地!
硬件加速除了降低CPU使用率,也能提高影片画质,图中“Post-Processing”的部分都是加强画质用的。
去交错的效果,可以把影片中的边缘锯齿去除。
最终...还是要看片
网络影片播放+硬件加速可以搞到很复杂,因为商用解码器通常只支援特定几种常见档案,有时候你明知道这档案的影片压缩格式是可以加速的,但却可能由于解码器的限制而无法启动。比如mkv就是网络上专用的档案包装格式,它可以包进H.264的影片,但支援H.264硬件加速的PowerDVD没办法拨mkv,所以才有把一堆解码器打包抽离,让它与其他splitter(分离影音档中的影片和音讯的软件)连结合作,支援更多影片的特殊玩法,比如对岸的“终极解码”,或是这篇