显示卡影片播放硬件加速,作法原理完全解说

转载 2013年12月03日 10:51:10

原文地址: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(分离影音档中的影片和音讯的软件)连结合作,支援更多影片的特殊玩法,比如对岸的“终极解码”,或是这篇

Android硬件加速原理与实现简介

在手机客户端尤其是Android应用的开发过程中,我们经常会接触到“硬件加速”这个词。由于操作系统对底层软硬件封装非常完善,上层软件开发者往往对硬件加速的底层原理了解很少,也不清楚了解底层原理的意义,...

Android硬件加速原理与实现简介

在手机客户端尤其是Android应用的开发过程中,我们经常会接触到“硬件加速”这个词。由于操作系统对底层软硬件封装非常完善,上层软件开发者往往对硬件加速的底层原理了解很少,也不清楚了解底层原理的意义,...

Android硬件加速原理与实现简介

在手机客户端尤其是Android应用的开发过程中,我们经常会接触到“硬件加速”这个词。由于操作系统对底层软硬件封装非常完善,上层软件开发者往往对硬件加速的底层原理了解很少,也不清楚了解底层原理的意义,...

GStreamer播放教程08——视频解码的硬件加速

视频的硬件解码近来发展非常快速,尤其是在低功耗的设备上。本教程会讲述一些硬件加速的背景知识并解释一下GStreamer是怎么做的。...

HW Video Acceleration in Chrome/Chromium HTML5 video 视频播放硬件加速

Introduction Video decode (e.g. YouTube playback) and encode (e.g. video chat applications) are s...

开显卡硬件加速和不开的区别

简而言之,硬件加速就是利用硬件模块来替代软件算法以充分利用硬件所固有的快速特性。 硬件解码生效的时候,系统是怎么运转的呢?现在我们有两个处理器,CPU和GPU。他们通过PCI/AGP/PCIE总...

GStreamer播放教程08——视频解码的硬件加速

目标 视频的硬件解码近来发展非常快速,尤其是在低功耗的设备上。本教程会讲述一些硬件加速的背景知识并解释一下GStreamer是怎么做的。 悄悄告诉你,如果设置正确地话,我们什么...

Chrome/Chromium HTML5 video 视频播放硬件加速

Chromium网站上有个大致的框图,描述了Chromium的video

Android WebView 总结 —— 硬件加速使用HTML5播放视频及全屏方案

转自https://www.cnblogs.com/renhui/p/5893593.html 在APP开发的过程中,会碰到需要在WebView中播放视频的需求,下面讲解一下如何在Web...

【显示技术 - 视频编码】硬件加速 - 对接FFMPEG框架的H.265编码

FFMPEG框架+硬件加速实现H.265编码
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:显示卡影片播放硬件加速,作法原理完全解说
举报原因:
原因补充:

(最多只允许输入30个字)