H.264 编码的原理与算法实现

您所在的位置:网站首页 编码过程 H.264 编码的原理与算法实现

H.264 编码的原理与算法实现

2024-07-05 10:41:31| 来源: 网络整理| 查看: 265

H.264 是当前应用较为广泛的视频编码标准,能够在大幅度降低视频传输带宽占用或视频文件存储空间的同时保证重建视频的清晰度,并能够满足实时性要求。本文调研了 H.264 编码的基本原理和具体算法实现。

0. H.264 的基本步骤

知乎用户 声网Agora 在专栏中对 H.264 的编码原理进行了简要的分析,将 H.264 编码的过程划分为:

帧类型分析帧内、帧间预测编码变换编码量化编码去块滤波熵编码

等步骤,这里也沿着这些步骤,结合一定的实例进行算法分析与展示。我们所分析的对象的 YUV 格式的帧序列。

1. 帧类型分析 1.1 基本原理

H.264 编码过程将视频帧分为 I 帧、P 帧和 B 帧三类:

I 帧:内部编码帧(Intra-coded frames),编解码不依赖于其他帧,相对而言压缩力度最小,也称为关键帧;P 帧:前向预测帧(Predicted frames),编解码依赖于历史 I 帧的信息,即通过先前几帧可以对 P 帧进行预测,压缩力度较大,相较于对每一帧都只进行内部编码可以节省约 50 % ∼ 90 % 50\%\sim90\% 50%∼90% 的带宽;B 帧:双向预测帧(Bidirectional predicted frames),编解码依赖于其前后数帧的信息,压缩力度最大。

H.264 编码对一定数量的帧进行缓存之后进行帧类型分析,再依次对片段中的 I 帧、P 帧和 B 帧进行编码。

由于 I 帧需要尽量多地为 P 帧和 B 帧提供信息以最大化压缩效率,因此 I 帧往往标志着画面中场景的变换。一般情况下,P 帧和 B 帧编解码时所依赖的帧不会跨过一个 I 帧,满足该特点的 I 帧也对码流起到分块的作用,被称为 IDR 帧(Instantaneous Decoding Refresh),被 IDR 帧分隔开的一组帧被称为 GOP(Group of Pictures),一个 GOP 中包含的一个 I 帧和其后的 B 帧与 P 帧通常具有相似的特征。一般而言,一个 GOP 中各个帧的编码依赖帧的位置具有固定的规则。

基于以上设计,H.264 的编码过程通常不是逐帧完成,而是以 GOP 为单位完成,即通常需要接收到一个 GOP 的完整码流才能对该 GOP 全部完成解码。这也导致了不可避免的延时,且 GOP 越长,编码效率越高,但延时也越长。

1.2 帧类型分析算法

一般情况下,在帧类型分析之前,会对原始帧进行降采样处理,以减少分析时间。而帧类型的分析算法在不同的编码器中有各自不同的实现,如 StackExchange 中提到的一位算法工程师基于帧相似度对 I 帧和 P 帧进行选择的分析算法。其核心算法为:

Target: encode current frame as (a really fast approximation of) a P-frame and an I-frame. if ((distance from previous keyframe) > keyint) then set IDR-frame else if (1 - (bit size of P-frame) / (bit size of I-frame) < (scenecut / 100) * (distance from previous keyframe) / keyint) then if ((distance from previous keyframe) >= minkeyint) then set IDR-frame else set I-frame else set P-frame encode frame for real.

对 B 帧的选择过程应该与其相似。简而言之,算法中设定了关键帧阈值 k e y i n t keyint keyint 和关键帧最低阈值 m i n k e y i n t minkeyint minkeyint。对于当前的某一帧,当其与前一个关键帧的距离大于关键帧阈值时,将其设置为 IDR 帧;当该距离小于关键帧阈值时,若将当前帧设置为 P 帧的压缩效率相比于设置为 I 帧足够高,则将其设置为 P 帧。当当前帧与前一个关键帧的距离不够大,但将其设置为 P 帧的压缩效率又不太高时,只要距离大于关键帧最低阈值,也将其设置为 IDR 帧,否则设置为 I 帧。

算法中涉及到的帧之间距离的定义、关键帧阈值的设计、相对压缩效率计算,则需要深入各个编码器从源码进行分析。

1.3 帧类型分析实现 2. 帧内编码与帧间预测编码 2.1 预测编码基本原理

对每一帧进行预测编码之前先对图像进行分块,划分为 8 × 8 8\times8 8×8 或 4 × 4 4\times4 4×4 的块。分块大小最大为 16 × 16 16\times16 16×16,称为 H.264 编码中的宏块。之后对每块分别进行预测编码。

对于 I 帧而言,每个块只能依赖于自身信息,通过块的局部(如块的某一行、列、斜线或块平均值)对总体进行预测,获得预测块与原始块的残差。一般情况下,块内的 YUV 值具有局部相似特征,经过预测编码之后的残差较小且含有许多 0 0 0 值,为后续变换编码进一步压缩码率奠定基础。

对于 P 帧而言,预测编码过程可以依赖历史 I 帧的值。对于每个块而言,编码器在 I 帧中对应的相邻位置进行搜索,获得与当前块最相似的邻近区域。记录邻近区域到当前块的位移向量(运动矢量)后,对两者的残差进行后续编码。由于 P 帧只有一个依赖帧,部分块不能实现较好的预测,因此压缩效率有限。

对于 B 帧而言,预测编码过程可以依赖其前后两帧的值,编码器也对每个块在前后两帧中进行搜索,获得能够实现最好预测的参照帧和位移矢量。由于 B 帧能够综合两帧的信息,因此能够使大部分块得到较好的预测,从而大大提高压缩效率。

2.2 预测编码算法

I 帧的帧内预测编码过程需要遍历各种参考模式,使残差尽量小;P 帧和 B 帧的帧间预测编码则需要遍历各种位移矢量,寻找每个块的最佳匹配。与此同时,编码器要考虑不同的块大小。不同的编码器也采用不同的搜索算法,以实现有限搜索时间内的最大压缩效果。

2.3 预测编码实现 3. 变换编码 3.1 变换编码基本原理

一般而言,图像具有局部平稳特性,即一个小块中的 YUV 值通常具有较大的直流分量,交流分量有限,尤其是在预测编码后进一步降低了块内的交流分量。基于此,编码器对每个块进行变换编码,从而在频域上使数值集中分布(具体为大值集中在低频区域),以便后续编码过程。常用的变换编码方式为 DCT 编码。

3.2 变换编码算法

变换编码算法比较固定,通常采用一组固定的基对块中的残差值进行二维离散余弦变换。

3.3 变换编码实现 4. 量化 4.1 量化基本原理

各个块经变换编码后的数值为浮点数,每个值通常需要 16 bit 甚至 32 bit 来表示,成本较高。而人眼具有对高频或微小差别不敏感的特性,因此可以对频域数值进行适当的量化,损失一定的精度来换取带宽的节省。

简单的量化对块中所有的数值采取相同的量化参数,而基于图像的统计特性可以设计更优的量化参数,对不同的频率分量采取不同的量化精度,能够实现最大化压缩效率的同时有效保证图像质量。同时,编码器往往设置不同的量化参数,根据带宽要求选用不同的量化参数以实现对图像不同的压缩效果。量化参数越大,损失的细节信息越多,但压缩效率越高。此外,较大的量化参数使各个块损失了较多的高频分量,加以量化台阶附近的数值在重建时差异进一步扩大,将导致明显的块效应。

4.2 量化算法

量化时对块中各个频率分量分别除以对应的量化参数,对得到的商取整,即完成量化过程。而解码器进行解码时则乘以同样的量化参数进行数值的有损解码。

4.3 量化实现 5. 熵编码 5.1 熵编码基本原理

量化后的块二维数据通常通过 ZigZag 扫描为一维,当量化参数合适时,其中往往包含许多 0。此时可以将一串数值表示成 (0 的个数,数值) 这样的 (run, level) 数值对,且各种数值对的出现频率满足一定的统计规律。通过熵编码,为出现频率较高的数值对分配较少的比特,为出现频率较低的数值对分配较多的比特,可以实现带宽的最大节省。

5.2 熵编码算法

熵编码算法对各个块分别执行,通常包括:

Zigzag 扫描;统计块中非零数值的个数和拖尾系数( ± 1 \pm1 ±1 的个数,最大取 3 3 3);在对应表中查找编码方式;编码

等步骤。

5.3 熵编码算法实现 6. 去块滤波 6.1 去块滤波基本原理

量化参数较大时,图像中原本平滑过渡的部分由于在量化台阶附近被量化到不同的值(如直流分量为 149 149 149 和 150 150 150 的两个块在量化参数为 20 20 20 时分别被量化为 7 7 7 和 8 8 8),重建后将导致差异明显扩大(以上直流分量被恢复为 140 140 140 和 160 160 160),从而导致了严重的块效应,使重建图像中出现明显的虚假边界(两个块的交界处)。因此编码器需要对虚假边界附近的数值进行补偿,消除块效应,使重建的区域仍然得到平滑过渡。

值得注意的是,由于去块滤波过程需要将重建后的图像与原始图像进行对照,因此在这里编码器端也会根据量化后的数值进行图像重建。根据 TaigaComplex 的博客,编码器会把滤波后的图像作为后续预测编码过程的参考,解码器则将滤波后的图像作为最终的解码结果并作为后续解码过程的参考。

6.2 去块滤波算法

去块滤波以宏块为单位,对亮度和色度分量进行,其中前者宏块大小为 16 × 16 16\times16 16×16,后者则有多种不同的划分。

宏块中通常包含多个块,去块滤波过程考察宏块中各个块的边缘。滤波过程按照固定的顺序进行,通常先从左到右进行垂直边界滤波,后从上到下进行水平边界滤波。当块边缘同时位于宏块边缘,则对该边缘的滤波还需要参考相邻宏块的信息,否则只需要参考宏块内部的数据。

对于一个块边缘,编码器先根据边缘两侧的两个宏块(称为 P 块和 Q 块)的信息估计该边缘的强度,之后区分真假边界,对假边界(即由于块效应产生的边界)进行滤波:

判断条件(亮度宏块)边界强度 BSP 块或者 Q 块为帧内编码模式,并且块边缘为宏块边缘4P 块或者 Q 块为帧内编码模式3P 块或者 Q 块的残差变换系数包含非零系数2P 块或者 Q 块的残差变换系数都不包含非零系数,并且P块和Q块的参考帧或运动向量数目(前后向)不同1P 块或者 Q 块的残差变换系数都不包含非零系数,并且P块和Q块的参考帧以及运动向量数目(前后向)相同0 真边界(强度 0 级)不进行滤波;对于较弱的假边界(强度 1~3 级),首先对边界紧邻的像素进行调整,之后根据次近邻的像素特点决定是否对其进行调整;对于较强的假边界(强度 4 级),若认为边界所包含的细节信息不多,则对边界紧邻的三对像素进行调整(强滤波),而若认为边界包含了较多的细节信息,则只对边界紧邻的像素进行调整(弱滤波)。

对于需要进行调整的边缘,编解码器利用边缘附近的像素值进行调整。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭