HEVC视频编码技术详解与实践——基于T-REC-H.265-201304-I!!PDF-E文档
简介:HEVC作为新一代视频编码标准,大幅提升了视频压缩效率。本篇文章以T-REC-H.265-201304-I!!PDF-E.pdf文档为基础,深入解析了HEVC标准的核心技术,包括编码架构、预测技术、变换与量化、熵编码、多视图编码以及对HDR和WCG的支持。HEVC采用精细化的块划分和多样化的预测模式,优化了变换与量化参数,增强了熵编码效率,并提供了多视图和高动态范围视频的编码支持。本资料对于理解HEVC编码原理及应用至关重要。
1. HEVC标准概述
HEVC(High Efficiency Video Coding),即高效视频编码,是由ISO/IEC Moving Picture Experts Group(MPEG)和ITU-T Video Coding Experts Group(VCEG)共同开发的最新一代视频压缩标准,它在H.264/AVC的基础上,提供了更高的压缩效率和更好的视频质量。HEVC的成功之处在于它能够以低于H.264/AVC一半的码率提供与之相当甚至更高的视频质量,这使其成为当前以及未来一段时间内视频内容分发和存储的理想选择。
本章将介绍HEVC的发展背景,它的目标和应用场景,以及它在视频编码领域的重要性和优势。随后,我们会更详细地探讨HEVC标准的技术架构和关键技术,为读者提供一个全面的HEVC技术概览,帮助理解后续章节中将深入探讨的编码细节和优化技术。
2. 编码架构细节
2.1 HEVC编码原理
2.1.1 HEVC编解码流程
HEVC(High Efficiency Video Coding,高效视频编码),也被称为H.265,是继H.264/AVC之后的下一代视频压缩标准。为了实现更高的编码效率,HEVC引入了若干创新技术,增加了编码过程的复杂度,但同时也提高了视频的质量和压缩比。HEVC的编解码流程可以概括为以下几个关键步骤:
-
帧划分 :视频被分为一组连续的帧,称为帧组(Group of Pictures,GOP)。在HEVC中,帧首先被划分为更小的编码单元(Coding Tree Units,CTUs),这些单元随后被进一步划分为编码单元(Coding Units,CUs)、预测单元(Prediction Units,PUs)和变换单元(Transform Units,TUs)。
-
帧内预测 :对每个CU进行帧内预测,预测过程是基于当前帧内已编码的相邻块的数据。这一步骤是无损的,因为仅涉及数据的参考和推算。
-
帧间预测 :对于视频序列,帧间预测用于利用时间上相邻的帧之间的相关性。这涉及到运动估计和运动补偿,以寻找时间上最接近的参考帧中的匹配块。
-
变换和量化 :选定最佳的预测模式后,对残差(预测与原始像素之差)应用变换,转换为频率域,然后进行量化处理,降低数据量。
-
熵编码 :量化后的数据通过熵编码进一步压缩。HEVC使用了改进的熵编码方法,如并行的上下文自适应二进制算术编码(CABAC)。
-
重建 :为了进行帧间预测,需要重建视频帧。这包括对量化后的变换系数进行逆量化和逆变换,以及将预测块与残差块相加。
-
滤波 :重建后的图像可能会应用一系列滤波处理,如去块滤波器,以消除块效应并改善图像质量。
-
输出/存储 :编码后的视频数据被输出并用于传输或存储。同时,为了进行下一步的帧间预测,重建的帧被存储在参考帧缓冲区。
整个编解码流程强调了预测精度和编码效率,HEVC的这一流程在实际应用中证明了其在保持高清视频质量的同时大幅减少比特率的能力。
2.1.2 帧内预测与帧间预测机制
在HEVC编码过程中,帧内预测和帧间预测是两个核心步骤,它们对于最终的编码效率和视频质量起着决定性的作用。
帧内预测 主要依赖于当前帧内的空间冗余信息。在HEVC中,一个CU可以划分为16×16、32×32或更小的尺寸,并且针对每个PU,有多种预测模式可供选择。每个像素值都是通过参考其相邻的已编码像素来预测的。方向性预测模式依据当前块周围的像素模式,应用不同的预测方向进行预测。非方向性预测模式则不依赖于特定的方向,如DC模式或平面模式。
帧间预测 则依赖于时间冗余信息,它通过运动估计在时间上相邻的帧间寻找相似块来工作。HEVC提供灵活的运动估计框架,支持多参考帧,以及更精细的像素精度运动矢量(down to 1/4 or 1/8像素精度)。这些改进为编码器提供了更多的选择,以找到最佳匹配块,从而提高压缩效率。
在帧内和帧间预测过程中,HEVC采用了“最佳预测模式搜索”的方法。编码器会尝试所有可能的预测模式,并根据某种代价函数(如最小化率失真代价)选择最优的预测方式。这种方法虽然计算量较大,但可以显著提升最终视频的质量和压缩率。
2.2 编码单元和转换单元
2.2.1 CTU、CU、PU和TU的定义与关系
在HEVC中,编码单元的结构层次非常清晰,编码任务按如下单位进行细分:
-
编码树单元(CTU, Coding Tree Unit) :视频序列首先被分割成CTUs,这是HEVC编码结构中的基本单位。CTU是最大的编码单位,可以划分为32x32、16x16或8x8大小的像素区域。
-
编码单元(CU, Coding Unit) :CTU进一步被划分为编码单元,它继承了CTU的树状结构,可以递归划分为更小的单元,直到达到最小的编码单元大小。
-
预测单元(PU, Prediction Unit) :在CU内部,用于进行帧内或帧间预测的部分被称为预测单元。PU定义了预测的模式和数据。
-
变换单元(TU, Transform Unit) :对残差信号进行变换和量化时,CU被进一步细分为变换单元。TU与PU可以有独立的大小和形状,其目的是为了更好地适应数据的统计特性,实现更好的压缩效果。
CTU、CU、PU和TU之间的关系是层次化的,它们之间的关系影响着编码的效率和灵活性。编码器可以根据内容的特性选择最合适的单位大小,从而在编码效率和视频质量之间取得平衡。
2.2.2 编码单元的划分策略
为了实现高效的视频编码,HEVC使用了灵活的编码单元划分策略。编码单元(CU)的划分遵循一种类似于四叉树的分割方法,可以递归地将一个大块划分成更小的块。这种划分策略提供了以下优势:
-
适应性 :允许编码器根据视频内容的复杂性调整CU的大小。在内容变化较为剧烈的区域,使用较小的CU可以获得更精确的预测;在纹理较为均匀的区域,使用较大的CU可以减少分割开销。
-
优化 :编码器会评估不同的划分方案,选择具有最小率失真代价的方案。这涉及到比较不同大小CU的预测误差和比特消耗。
-
并行处理 :四叉树划分允许并行处理,从而加快编码速度。不同的CU可以独立处理,这在多核处理器上能够显著提高编码效率。
-
节省比特 :较小的CU允许更精细的预测,从而可能减少比特的消耗。然而,更小的CU也会带来更高的语法元素开销,因此需要仔细平衡。
在实际应用中,编码器通常会考虑视频序列的特性,动态地调整CU的划分。例如,在处理具有复杂细节的场景时,编码器可能会使用更小的CU以捕捉细节;而对于简单或静态的场景,则可能使用较大的CU。
代码块、表格和mermaid流程图等元素在后续的章节中将进一步详细展示。
3. 预测技术的多样化
3.1 帧内预测技术
帧内预测利用图像内部像素的相关性,通过预测编码的方式去除帧内的空间冗余信息。与传统编码标准如H.264/AVC相比,HEVC在帧内预测方面进行了大幅改进,引入了更多预测模式和更灵活的像素预测方法,从而进一步提高了压缩效率。
3.1.1 方向性预测模式
在HEVC中,方向性预测模式是指利用当前编码块的已编码像素,按照某种特定的方向来预测当前块的像素值。为了提供更精确的预测,HEVC定义了33种不同方向的预测模式,这些模式被组织成两组:一个是垂直方向,另一个是水平方向。
每个方向的预测模式对应一种特定的加权函数,该函数基于参考像素计算当前块中每个像素的预测值。例如,如果使用45度方向的预测模式,那么预测过程可能涉及在左侧像素和上边像素之间进行插值,以计算右侧像素的预测值。
3.1.2 非方向性预测模式
除了方向性预测模式之外,HEVC还包含了几种非方向性预测模式,这些模式适用于特定的图像特征和结构。比如DC模式(直流预测)是用当前块相邻的顶部和左侧像素的平均值进行预测。平面模式(Plane Mode)考虑到了图像的斜率,适用于渐变区域。
在平面模式下,预测值是通过线性插值计算得出的,这涉及到对图像中局部区域的倾斜程度进行计算。非方向性模式提供了一种更一般化的预测方法,它们在特定情况下能够提供与方向性预测模式相同或更好的压缩效果。
代码块及分析
// 伪代码演示方向性预测的实现
void IntraDirectionalPrediction(int* referenceLine, int* predictionLine, int n, int angle) {
// referenceLine: 已编码的参考像素行
// predictionLine: 需要预测的像素行
// n: 预测的像素数量
// angle: 预测角度
for (int i = 0; i < n; i++) {
// 根据不同的角度,实现不同方向的插值计算
if (angle == 45) {
// 使用45度方向的加权函数进行预测计算
predictionLine[i] = (referenceLine[i - 1] + referenceLine[i] + 1) / 2;
} else if (angle == -45) {
// 使用-45度方向的加权函数进行预测计算
predictionLine[i] = (referenceLine[i] + referenceLine[i + 1] + 1) / 2;
}
// 其他角度的预测计算逻辑...
}
}
在上述代码块中, IntraDirectionalPrediction 函数是一个简化的示例,用于演示如何根据不同的角度进行方向性预测。实际编码实现会更复杂,包括多种角度的插值计算和边界条件处理。 referenceLine 是参考像素行, predictionLine 是要预测的像素行, n 是预测的像素数量, angle 是预测角度。通过分析该函数,我们可以理解HEVC中帧内预测的基本原理。
表格展示不同方向的预测模式效果对比
| 模式编号 | 角度(度) | 预测效果描述 |
|---|---|---|
| 0 | 0 | 水平方向预测,适用于图像顶部或底部的纹理区域 |
| 1 | 45 | 正45度方向预测,适用于图像左上至右下的纹理区域 |
| 2 | -45 | 负45度方向预测,适用于图像右上至左下的纹理区域 |
| … | … | … |
| 32 | 177 | 非常接近水平方向,用于细节较少的区域 |
上表展示了不同预测模式编号对应的预测角度及其预测效果的描述。此表说明了预测模式的多样性以及它们对不同图像特征的适应性。
3.2 帧间预测技术
帧间预测技术是基于视频序列中连续帧之间的时间相关性,通过比较当前帧与参考帧之间的差异来进行预测。HEVC在帧间预测方面引入了多项创新,包括多参考帧预测和运动估计与补偿的改进。
3.2.1 多参考帧预测
传统的编码标准通常只支持有限数量的参考帧,例如H.264/AVC标准支持至多16个参考帧。相比之下,HEVC标准支持的参考帧数量可达到16个,甚至更多,这显著增强了编码器在预测运动对象时的能力。
多参考帧预测通过利用多个过去或未来帧的信息来构建预测帧,从而能够更准确地追踪复杂的运动。编码器可以选择最优的一个或多个参考帧,以达到最好的预测效果。
3.2.2 运动估计与补偿的改进
运动估计是帧间预测的一个关键步骤,它涉及到在参考帧中寻找最相似的像素块以预测当前帧的像素块。在HEVC中,运动估计过程更加精细,可以使用更大的块大小(最大到64x64像素),并且可以对每一个16x16的子块进行独立的运动搜索。
运动补偿是对运动估计结果的应用。HEVC通过改进的运动补偿来进一步提高预测的准确性。例如,它引入了亚像素运动补偿,允许进行高达1/4或1/8像素精度的插值计算,比H.264/AVC的1/4像素精度有了提升。
代码块及分析
// 伪代码演示运动估计过程
void MotionEstimation(int* currentBlock, int* referenceFrame, int searchRange, int* motionVector) {
int bestSAD = MAX_INT;
int bestMotionX = 0, bestMotionY = 0;
// 搜索范围内的每一个位置
for (int x = -searchRange; x <= searchRange; x++) {
for (int y = -searchRange; y <= searchRange; y++) {
int SAD = ComputeSAD(currentBlock, referenceFrame, x, y);
if (SAD < bestSAD) {
bestSAD = SAD;
bestMotionX = x;
bestMotionY = y;
}
}
}
*motionVector = (bestMotionX << 16) | bestMotionY;
}
int ComputeSAD(int* currentBlock, int* referenceFrame, int motionX, int motionY) {
int SAD = 0;
for (int i = 0; i < BLOCK_SIZE; i++) {
for (int j = 0; j < BLOCK_SIZE; j++) {
int currentVal = currentBlock[i * BLOCK_SIZE + j];
int refVal = referenceFrame[(i + motionY) * BLOCK_SIZE + (j + motionX)];
SAD += abs(currentVal - refVal);
}
}
return SAD;
}
上述代码块展示了运动估计和运动补偿中的一部分实现。 MotionEstimation 函数计算当前块与参考帧之间的运动向量,并寻找最佳匹配的位置。 ComputeSAD 函数用于计算当前块和参考帧中对应块的绝对差值和(SAD),以评估预测的准确性。通过这两个函数的逻辑,我们可以理解HEVC如何改进运动估计和补偿过程,从而提高编码效率。
mermaid格式流程图:多参考帧预测流程图
graph TD;
A[开始运动估计] --> B[确定搜索范围];
B --> C[对每个参考帧重复以下步骤];
C --> D[为当前块搜索最佳运动向量];
D --> E{所有参考帧检查完毕?};
E -->|否| C;
E -->|是| F[选择最佳参考帧和运动向量];
F --> G[执行运动补偿];
G --> H[完成帧间预测];
此流程图表示了多参考帧预测的步骤,展示了如何为当前块在多个参考帧中搜索最佳运动向量,然后选择最佳的参考帧和运动向量进行补偿,最终完成帧间预测的过程。
表格展示参考帧对预测精度的影响
| 参考帧数量 | 预测精度 | 帧间预测性能 | 实时编码适用性 |
|---|---|---|---|
| 1 | 较低 | 低 | 较高 |
| 2-4 | 中等 | 中等 | 中等 |
| >4 | 高 | 高 | 较低 |
上表描述了不同数量的参考帧对帧间预测精度、整体编码性能以及实时编码适用性的影响。随着参考帧数量的增加,虽然预测精度和编码性能得到提升,但同时编码所需的计算资源和时间也会增加,这可能降低编码过程的实时性。
在本章节中,我们详细探讨了HEVC标准在预测技术方面的多样化与改进。通过分析帧内预测和帧间预测的技术细节,以及它们如何被编码工具实现,我们能够更好地了解HEVC如何提升视频压缩的效率和质量。下一章节将继续深入到变换与量化技术的改进,探讨HEVC如何进一步优化编码过程,以减少数据冗余并提高压缩比。
4. 变换与量化的改进
4.1 变换技术的革新
4.1.1 整数变换的种类和应用
整数变换(Integer Transform)是HEVC中用于图像和视频编码的一种重要技术,用于减少视频信号中的空间冗余。整数变换的一个关键优势是其可逆性,这意味着可以进行无损变换,这对于确保信息完整性是必要的。
在HEVC中,最常用的整数变换是4x4和8x8变换。4x4变换特别用于亮度信息的块级变换,而8x8变换则针对色度信息。这些变换能减少相邻像素间的相关性,从而降低视频数据的熵,为后续的熵编码阶段提供更高效的数据。
除了尺寸上的选择,HEVC还引入了不同的变换核,这些变换核设计来最小化变换过程中信号的失真。例如,基于哈达玛变换的整数近似变换(IHT)提供了一种有效的变换方式,它在硬件实现上比传统的离散余弦变换(DCT)具有更小的计算复杂度。
4.1.2 非对称内核变换(SAO)
非对称内核变换(SAO,或称为非对称内核量化 offset,AK-SZO)是HEVC标准中的另一项重要改进。SAO的核心思想是在反量化后,对像素值进行调整,补偿由于量化引入的失真。
SAO的目的是在保持码率不变的前提下,进一步提高图像质量。它通过将像素值分为不同的边缘分类,并对每一类边缘应用适当的偏移量。SAO分类包括边缘分类和带分类。边缘分类基于像素和邻近像素之间的差异进行,带分类则是根据像素值是否位于某个特定的值范围来分类。
为了优化SAO,HEVC引入了自适应的分类方法,其中边缘偏移是根据每个编码单元的具体内容自适应计算的。这样,SAO能够更准确地补偿量化误差,显著提升图像质量。
代码块4.1 展示了SAO分类和偏移应用的一个伪代码示例,其中的参数说明以及逻辑分析提供了详细的执行过程。
// SAO分类和偏移应用伪代码
for each Coding Unit (CU) in the frame:
// 计算像素值与其邻居之间的差异
for each pixel in CU:
if pixel is an edge pixel:
edgeClassify(pixel)
else:
bandClassify(pixel)
// 根据分类结果,应用适当的偏移量
applyOffsetForEdges()
applyOffsetForBands()
// 边缘分类函数
function edgeClassify(pixel):
// 边缘分类逻辑...
// 带分类函数
function bandClassify(pixel):
// 带分类逻辑...
// 对边缘像素应用偏移量函数
function applyOffsetForEdges():
// 应用边缘偏移量逻辑...
// 对带像素应用偏移量函数
function applyOffsetForBands():
// 应用带偏移量逻辑...
在上述伪代码中,我们展示了SAO处理流程的大致步骤,包括边缘分类、带分类和偏移量应用。实际的编码器实现会根据具体编码标准细节来精确执行SAO的每个步骤。
4.2 量化与去块滤波
4.2.1 环路滤波器与去块滤波器(SAO和ALF)
在HEVC编码过程中,量化之后图像往往会出现视觉上不舒服的块效应(blockiness)。为了解决这一问题,HEVC引入了环路滤波器,其中包括样本自适应偏移(SAO)和自适应环路滤波器(ALF)。SAO在前面已经讨论过,接下来重点介绍ALF及其应用。
ALF工作原理是对编码块边缘的像素进行加权滤波,其权重由一系列滤波器系数确定,这些系数是通过训练得到的。ALF根据编码块的特性和周围像素信息来动态调整,从而实现最优的图像质量。
为了更加灵活地处理图像中的各种信号特性,ALF设计了不同的滤波器模式。每个模式对应一组特定的滤波器系数,编码器会基于失真模型来选择最合适的模式。比如,对于纹理较平滑区域,可能采用弱滤波;而对于边缘区域,则可能减少滤波强度以保护边缘信息。
4.2.2 量化步长的调整与优化
量化步长(Quantization Parameter, QP)是影响量化质量的关键因素。在HEVC中,QP用于控制量化过程中的信息损失程度,从而直接关联到压缩效率和图像质量。
为了实现最优的编码效果,HEVC采用自适应量化步长调整策略。例如,在区域内容复杂性较高的部分,可以采用较小的QP值以保留细节;反之,在内容较为平坦的区域,则可以采用较大的QP值以提高压缩率。编码器在编解码过程中会根据不同的内容特征和目标码率来动态调整QP值。
量化步长的调整对图像质量有极大影响,如何找到最佳的QP值平衡点一直是研究的热点。图4.1提供了一个典型的量化步长调整策略流程图,展示了如何根据内容复杂性和目标码率来进行QP的选择。
graph TD;
A[开始] --> B[分析内容特征]
B --> C{内容复杂性判断}
C -->|高| D[设定较低QP]
C -->|低| E[设定较高QP]
D --> F[编码块]
E --> F[编码块]
F --> G{是否满足码率目标}
G -->|是| H[结束]
G -->|否| I[调整QP]
I --> F
流程图中,内容特征分析后,对内容复杂性进行判断,然后根据判断结果设定QP值。随后,进行编码块的操作。如果编码后的码率不满足目标,则需要重新调整QP,并再次进行编码块的操作,直至满足码率目标。
通过量化步长的优化,编码器能够在保证图像质量的同时,尽可能降低码率,达到高效压缩的目的。表4.1展示了一些常见场景下的QP设定及其影响。
| 场景描述 | 推荐QP值 | 预期效果 |
|---|---|---|
| 高质量要求 | 低QP | 更高的图像质量,更大的码率需求 |
| 低码率传输 | 高QP | 较低的码率,图像细节丢失增加 |
| 移动设备流媒体 | 中等QP | 平衡码率和质量,适应移动网络带宽 |
在实际应用中,可以根据表4.1的建议来调整QP值,以适应不同设备和网络环境下的编码需求。
5. 熵编码技术优化
在现代视频编码技术中,熵编码是将数据压缩到最少比特数的技术。在HEVC标准中,熵编码技术经历了重要的优化,以提高压缩效率并降低编码和解码的复杂度。
5.1 传统的熵编码方法
熵编码主要分为两种类型:上下文自适应的变长编码(CAVLC)和上下文自适应的二进制算术编码(CABAC)。CAVLC是基于H.264/AVC标准的编码方式,主要用于降低编码复杂度,而CABAC提供了更高的编码效率。
5.1.1 CAVLC与CABAC的原理和对比
CAVLC 的工作原理是基于数据块中非零系数和尾零的数量来进行编码。它利用了这些系数在视频信号中的统计特性,通过查找表来转换为变长码。尽管CAVLC实现起来相对简单,但它无法有效地编码二进制符号,因此在HEVC中只被用于某些特定的语法元素。
CABAC 则通过算术编码对二进制符号进行编码,具有更高的压缩效率。它使用了一种基于上下文的模型来预测每个符号的概率,然后通过上下文模型来调整概率,最终实现对符号的算术编码。CABAC的高效率使其成为HEVC标准中推荐的熵编码方式。
CAVLC和CABAC在实际应用中的主要区别在于:
- 编码效率 : CABAC通常提供比CAVLC更好的压缩效率。
- 编码复杂度 : CABAC在编码器和解码器端的复杂度都比CAVLC高。
- 压缩速度 : CAVLC编码速度快于CABAC,更适合实时应用。
5.2 熵编码的改进
为了进一步提升熵编码的效率,HEVC标准中引入了一些新的优化方法。
5.2.1 并行编码和解码的熵编码
由于CABAC在编码器和解码器端的复杂度较高,HEVC采用了一种并行编码和解码的策略。通过将视频数据分割成更小的独立块,可以实现块级别的并行处理,从而提高处理速度。在熵编码的上下文建模和算术编码过程中,HEVC允许编码和解码过程同时进行,从而加快处理速度。
5.2.2 上下文自适应的改进方法
为了提高编码效率,HEVC在CABAC的基础上进行了上下文自适应的改进。具体包括:
- 上下文建模的优化 : HEVC为不同的语法元素设计了更加精细的上下文模型,使得符号概率的预测更加准确,从而提高了编码效率。
- 二进制算术编码的改进 : 通过引入新的算术编码算法,例如状态切换机制和多状态二进制算术编码器,可以更好地适应不同的视频内容,从而达到更高的压缩率。
- 并行处理能力的增强 : HEVC增加了对并行处理的支持,使得熵编码过程可以在多核处理器上高效运行,进一步加快了编码和解码速度。
graph TD;
A[熵编码开始] --> B[确定编码类型]
B --> C[CAVLC或CABAC]
C -->|CAVLC| D[使用查找表进行变长编码]
C -->|CABAC| E[上下文建模]
E --> F[算术编码]
F --> G[编码效率评估]
G -->|效率高| H[输出编码结果]
G -->|效率低| I[调整上下文模型]
I --> F
在实际应用中,视频编码器会根据编码设置和视频内容的特性,选择最合适的熵编码方法。对于那些对压缩效率有较高要求,且对编码时间不太敏感的场景,CABAC通常是更优的选择。而CAVLC在实时视频传输等需要快速编码的场合中依然占有重要地位。
通过本章节的讨论,我们可以看出,熵编码技术在HEVC标准中得到了重要的优化和发展,这些改进不仅提升了编码效率,还增强了视频编码器的适应性和灵活性。在不同的应用场景中,选择合适的熵编码方式,是实现高效视频编码的关键。
简介:HEVC作为新一代视频编码标准,大幅提升了视频压缩效率。本篇文章以T-REC-H.265-201304-I!!PDF-E.pdf文档为基础,深入解析了HEVC标准的核心技术,包括编码架构、预测技术、变换与量化、熵编码、多视图编码以及对HDR和WCG的支持。HEVC采用精细化的块划分和多样化的预测模式,优化了变换与量化参数,增强了熵编码效率,并提供了多视图和高动态范围视频的编码支持。本资料对于理解HEVC编码原理及应用至关重要。
更多推荐
所有评论(0)