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

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

  1. 黑苹果开启核显加速_如何开启无核显的N卡黑苹果的硬件加速

    之前写了我一篇如何开启无核显+A卡的硬件加速,有朋友问那N卡怎么办,能不能也开启硬件加速,说实话,我手上没有N卡的机器,没法测试,但是方法是有的,大家可以按照这个方法自己去测试一下,记得先备份一下你的 ...

  2. Android 系统(175)---Android硬件加速原理与实现简介

    Android硬件加速原理与实现简介 在手机客户端尤其是Android应用的开发过程中,我们经常会接触到"硬件加速"这个词.由于操作系统对底层软硬件封装非常完善,上层软件开发者往往 ...

  3. Android硬件加速原理与实现

    一 概述 在手机客户端尤其是 Android 应用开发过程中,我们经常会接触到"硬件加速"这个概念.由于操作系统对底层软硬件封装非常完善,上层软件开发者往往对硬件加速的底层原理了解 ...

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

    转载自:https://tech.meituan.com/hardware-accelerate.html 在手机客户端尤其是Android应用的开发过程中,我们经常会接触到"硬件加速&qu ...

  5. Android硬件加速原理与实现简介-美团技术团队 ​

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

  6. “一文读懂“系列:Android中的硬件加速

    浅谈 前几天有个朋友问我"了不了解关于手机硬件加速方面的知识?",嗯?其实我也想知道... 于是笔者就去网上搜罗了文章再结合自己对源码的理解,总结了这篇关于硬件加速的理解. 关于屏 ...

  7. [学习记录]浅谈Android硬件加速

    最近看了一些Android硬件加速的文章,因此做个记录与总结 众所周知 ,如果使用GPU进行图形绘制,就认为是硬件减速绘制:反之,则是软件绘制. 以平时开发举例,实现一个圆角矩形按钮通常有两种方案:使 ...

  8. matlab 关闭硬件加速,matlab常见问题集

    matlab安装.运行与其他问题集锦 Q1:matlab有没有监视内存的方法? A: 用函数whos. Q2:如何解决matlab7.0命令窗口跳出一大堆java错误... A: 换matlab 7的 ...

  9. 一文读懂,Android中的硬件加速

    /   今日科技快讯   / 近日,携程发布<2023年春节旅游总结报告>.报告显示,春节期间国内外旅行订单皆迎来三年巅峰,旅游订单整体较虎年春节增长4倍.同时,春节期间出境游整体订单同比 ...

最新文章

  1. 【c语言】蓝桥杯算法提高 征税程序
  2. function java_java.util.function之function
  3. 用Spotlight on windows 实时监控Windows服务器性能
  4. 为衣服添加NFC功能:挥下袖子就能安全支付,打开车门坐进去就能启动汽车|Nature子刊...
  5. 【计算机网络】网络层 : IP 数据报分片 ( 数据分片机制 | 分片示例 | 三种数据长度单位 )
  6. java map移除key为空_Java实现过滤掉map集合中key或value为空的值示例
  7. 浅谈JavaScript中闭包
  8. linux自动挂载usb打印机,Linux下使用Usbmount实现USB设备自动挂载
  9. android平台上持久化存储3种手段_深入学习Redis :持久化
  10. 阿里电商架构演变之路(一)
  11. Codeforces 893 D Credit Card 贪心 思维
  12. bitnami redmine mysql_linux下bitnami一键安装redmine后无法远程访问mysql的问题
  13. Zepto:实现移动端tab选项
  14. 基于64QAM的LDPC编译码算法
  15. CentOS下du 和 df 的区别
  16. 在xml添加红色的星号android,在文本输入框中输入编辑文本(红色星号)的必填符号...
  17. 计算机科学与技术高校毕业生要求,计算机科学与技术专业 毕业要求(2016)
  18. 湍流公式推导系列——(一) 不可压湍动能方程的推导与含义
  19. 谷歌手机地图中文java_谷歌地图开发(1)使用MapView显示地图
  20. 非严格次小生成树+严格次小生成树

热门文章

  1. 敏捷Scrum理念的背后—写给机械制造行业同仁(上篇)
  2. 从反汇编的角度看C++语法(构造函数)
  3. 五四青年节54行代码向祖国告白
  4. Bulma CSS - 入门
  5. 用计算机探索规律的思维导图,手绘思维导图与计算机的完美结合
  6. CentOS Hive安装详细步骤
  7. ESP32学习笔记(19)——SPI(主机)接口使用
  8. android微信 icon,Android 微信分享icon黑边代码解决
  9. webSocket抓包分析
  10. X-admin经典前端后台管理模板,基于layui的轻量级前端后台管理框架,简单,兼容性好,面向所有层次的前后端程序