高清编码的处理一般分为几个步骤,每个步骤会完成相应的任务,而解码的时候也会存在这些步骤,从而达成影片的顺利播放。这些步骤都会被执行(也许个别步骤可以省略,但是主要步骤都会存在),但是处理这些步骤的配件可能不同。电脑上,自然是CPU和显卡这两个配件来执行,我们播放高清影片导致的不流畅大都是因为CPU占用率过高,原因就是CPU处理了大部分步骤或者负载很高的步骤,显卡能解决的问题就是它来承担这些负载很高的步骤,从而释放了CPU的负担。
那么究竟高清编码的步骤有哪些,哪些又是负载最高的部分呢?就H.264视频而言,分为四个主要部分(见下图)。图中的四个方块基本就是H.264解码的四个最主要步骤,也是资源消耗的主要四个部分,其中又以第一步的“CAVLC/CABAC解码”最为消耗运算资源,这方面远高于其他三步(简单的说,CAVLC/CABAC是H.264编码规范中两种不同的算法,际俏了提高压缩比,其中CABAC比CAVLC压缩率更高,但解码时自然也要求更高)。
『H.264解码流程图,其中第一个流处理部分最为消耗硬件资源』
其它编码格式与H.264类似。我们下面来看看主流的3种编码格式,包括Mpeg2、VC-1、H.264的解码流程对比(见下图)。可以看出,几种编码格式还是有不少区别的,这也是造成几种编码格式要求不同的原因,H.264编码格式最为复杂,因此系统要求最高,VC-1略有降低,但是也比Mpeg2高得多。
| 三种主流高清视频编码格式处理流程对比 | ||||
| 视频编码格式 | 流处理 | 视频变换 | 动态补偿 | 去块滤波 |
| MPEG-2 | VLC | 反离散余弦变换 (浮点) |
帧间编码 (双线性插值) |
N/A |
| VC-1 | VLC | 反离散余弦变换 (整数) |
帧间编码 (双三线插值) |
循环 |
| H.264/AVC | VLC/CAVLC/CABAC | 反离散余弦变换 逆变换 |
帧间编码 或 帧内编码 |
循环 |
『3种主流高清视频编码格式流程对比,还是有不少区别的』
那么究竟哪个步骤最为消耗CPU占用率呢?下面的测试对比应该最能说明问题(见下图)。对比的视频包括Mpeg2和H.264(AVC),其中上面我们讲到的四个步骤都有涉及。显而易见,“流处理”是所有编码格式中最为消耗处理器运算的部分,但是Mpeg2视频的这部分还并不会造成很大的困扰,因为CPU的占用率还不到2%。
| 不同编码格式在解码过程中各个步骤的CPU消耗比率 | ||||
| 编码格式 | MPEG-2 | H.264/AVC | ||
| 数据流算法 | VLC | CAVLC | CABAC | CABAC |
| 码率 | 8Mb/s | 20Mb/s | 20Mb/s | 40Mb/s |
| 流处理 占用率 | 1.6% | 8.9% | 26.5% | 47.8% |
| 视频变换 占用率 | 0.7% | 1.2% | 1.5% | 2.6% |
| 动态补偿 占用率 | 0.5% | 11.0% | 11.5% | 11.6% |
| 去块滤波 占用率 | N/A | 8.2% | 8.5% | 8.2% |
| 注:以上的是4种不同的视频数据流算法解码时4个主要步骤所消耗的CPU占用率 | ||||
『不同步骤的CPU占用率对比,显然H.264编码的“流处理”要求最高』
但是对于H.264来说,问题就出现了,20Mb/s编码率的视频流处理过程就会达到26.5%的CPU占用率,加上别的处理达到48%的总CPU占用率;40Mb/s的高编码率视频更为夸张,流处理的过程上升极快,达到了47.8%,加上别的处理,总CPU占用率突破70%。
上文已经提到,这四个步骤的处理配件不同,主要是CPU和显卡。在之前,CPU因为处理了更多的步骤,所以占用率高居不下,因此如果显卡能承担越多的解码步骤,CPU就能释放更多的负载,以保证视频播放的流畅。
通过具有H.264硬件解码引擎的显卡,就可以共同完成H.264编码的全部4个处理步骤,这就是它们能让H.264高清视频播放的CPU占用率大幅度下降的根本原因。既然显卡完成了所有的高清解码处理,那么CPU自然就空闲了。