编码流程(Encoder)
H264和265编码流程对比
预处理
-
H.264:
-
RGB → YUV4:2:0 转换
-
色度降采样(U/V 分辨率减半)
-
-
H.265:
-
同上,但支持更高位深(8/10/12-bit)、YUV4:4:4、广色域(如 BT.2020)
-
✅ 差异:H.265 更适应高动态范围(HDR)和专业视频。
2. 帧类型与 GOP 结构
-
两者均支持 I/P/B 帧。
-
H.265 新增:
-
IBC(Intra Block Copy):用于屏幕内容编码(如 PPT、游戏 UI)
-
更灵活的参考帧管理(最多 32 个参考帧 vs H.264 的 16 个)
-
✅ 差异:H.265 对非自然视频(文本、图形)压缩更优。
3. 块划分与结构
|
项目 |
H.264 |
H.265 |
|
基本单元 |
宏块(16×16) |
编码树单元(Coding Tree Unit, CTU,最大 64×64 或 128×128) |
|
划分方式 |
固定子块划分(如 16×16 → 8×8 → 4×4) |
四叉树(Quadtree)递归划分 CU |
|
预测单元(PU) |
与宏块绑定,划分有限(如 16×16, 16×8, 8×8 等) |
PU 独立于 CU,支持对称/不对称划分(如 2N×nU, nL×2N) |
|
变换单元(TU) |
与预测块绑定,通常 4×4 或 8×8 |
TU 独立划分,尺寸 4×4 ~ 32×32(匹配残差特性) |
✅ 优势:H.265 能根据图像内容自适应选择最优块结构,提升预测精度。
H.264:固定宏块 → 子块(绑定式)
帧 (Frame)
│
片 (Slice)
│
宏块 (Macroblock, 16×16)
│
├─ 预测模式决定子划分:
│ ├─ 帧内预测:16×16 或 4×4(亮度)
│ └─ 帧间预测:16×16, 16×8, 8×16, 8×8 → 8×8 可再分为 8×4/4×8/4×4
│
变换块 (Transform Block):
– 通常与预测块一致(4×4 或 8×8)
-
特点:
-
预测单元(PU)与变换单元(TU)强耦合,无法独立优化。
-
最小处理单元为 4×4(用于帧内预测和残差变换)。
-
划分方式有限,难以适应复杂纹理或大平滑区域。
-
H.265:CTU → CU → PU/TU(分离式)
H.265 采用 三重分离结构,实现高度灵活性:
帧 (Frame)
│
片 (Slice) 或 Tile(并行单元)
│
编码树单元 (CTU, e.g., 64×64)
│
└─ 四叉树划分 → 编码单元 (CU)
│
├─ 预测单元 (PU):负责预测(帧内/帧间)
│ ├─ 对称划分:2N×2N, N×N, 2N×N, N×2N
│ └─ 不对称划分:2N×nU, 2N×nD, nL×2N, nR×2N(仅帧间)
│
└─ 变换单元 (TU):负责残差变换
└─ 另一个四叉树(可嵌套于 CU 内)
├─ 32×32
├─ 16×16
├─ 8×8
└─ 4×4
4. 帧内预测(空间冗余去除)
|
特性 |
H.264 |
H.265 |
|
亮度预测模式 |
9 种方向 + DC(共 9 或 17,视 profile) |
35 种角度模式 + Planar(平面)+ DC(共 37 种) |
|
色度预测 |
独立 4 种模式 |
支持 跨分量预测(Chroma from Luma),利用 Y 与 UV 相关性 |
|
边缘优化 |
无 |
新增 PDPC(Position Dependent Prediction Combination),改善边缘重建 |
✅ 效果:H.265 帧内预测残差更小,尤其在纹理复杂区域。
5. 帧间预测(时间冗余去除)
可以把帧间预测理解为:在已经编码好的参考帧中,为当前正在编码的每一个图像块寻找一个最匹配的块,然后只记录这个块的位置偏移量(即运动矢量)和与原始块的像素差异(即残差),而不是记录整个块的所有像素信息。
帧间预测的过程通常包含以下几个关键步骤:
运动估计
目的:在参考帧中搜索当前块的最佳匹配块。
过程:编码器以当前块为中心,在参考帧的特定搜索范围内,按照一定的策略(如菱形搜索、六边形搜索)进行遍历比较。比较的标准通常是SAD或SATD,值越小,说明两个块越相似。
输出:找到最佳匹配块后,计算出当前块与其在水平和垂直方向上的偏移量,这就是运动矢量。
运动补偿
目的:根据运动估计得到的信息,构建当前块的预测块。
过程:编码器根据计算出的运动矢量,从参考帧中取出对应的匹配块像素数据,作为当前块的预测值。
输出:得到预测块。
残差计算
目的:计算预测的准确程度。
过程:用当前块的原始像素值减去运动补偿得到的预测块像素值,得到的差值矩阵就是残差数据。
后续处理:这个残差数据会进入后续的变换和量化环节,进一步去除空间冗余。如果预测得非常准,残差就会很小甚至为零,码率就能得到极大节省。
运动矢量预测与编码
目的:进一步压缩运动矢量本身的信息量。
原理:相邻块的运动通常具有很强的相关性。因此,编码器不会直接编码运动矢量的原始值,而是利用已编码的相邻块的运动矢量来预测当前块的运动矢量,计算出运动矢量差值,然后只对差值进行编码。这样可以进一步节省码率。
|
对比维度 |
H.264 (AVC) |
H.265 (HEVC) |
技术演进与优势 |
|
1. 块划分结构 |
基于宏块,大小固定为 16×16。可进一步划分成亚宏块,如 16×8,8×16,8×8,4×8,8×4,4×4。 |
引入编码树单元(CTU),大小可变(最大可达 64×64)。采用灵活的四叉树递归划分结构,可以根据图像纹理复杂度,从64×64向下划分到32×32、16×16,甚至8×8。 |
H.265的灵活性更强。对于平坦区域(如天空、墙壁),使用大块(如32×32、64×64)进行预测,能用更少的运动矢量覆盖大面积;对于细节区域,使用小块进行精细预测。这大幅提升了预测的准确性和编码效率。 |
|
2. 运动矢量精度 |
主要支持整数像素、半像素和1/4像素精度的运动矢量。需要插值来获得分数像素位置的像素值。 |
同样支持1/4像素精度。但在插值滤波器的设计上进行了优化,使用了更长的抽头数和更优的系数,使得分数像素位置的预测更加精确。 |
更精确的运动补偿意味着残差更小,从而在相同码率下能保留更多细节,或者在相同画质下码率更低。 |
|
3. 运动矢量预测 |
支持中值预测等简单方法,从空间相邻块的运动矢量推导出预测值。 |
引入了更高级的Merge模式和高级运动矢量预测技术。 |
– Merge模式:允许当前块直接复用相邻块的运动信息(运动矢量、参考帧索引等),几乎不消耗额外比特来描述运动信息,对于运动一致的物体区域效果极佳。 – AMVP:提供更精细的运动矢量候选列表,提高了运动矢量差值的编码效率。 |
|
4. 参考帧管理 |
支持多参考帧,但管理机制相对简单。最多 16 帧 |
引入了参考帧集(RPS) 的概念,这是一种更强大、更精确的参考帧管理机制。最多 32 帧。 |
RPS可以更清晰地描述哪些帧可以作为后续帧的参考,以及在时间上的层级关系。这为分层B帧预测结构提供了有力支持,能够更好地处理视频中的遮挡、旋转等复杂运动场景。 |
6. 变换与量化
将空间域残差块(预测误差)转换为频域系数,使能量集中于低频区域,便于后续量化和熵编码。
流程(编码端):
获取残差块(如 4×4、8×8 等)
应用整数变换(近似 DCT/DST)
对变换系数进行量化(除以量化步长)
量化后系数经扫描 + 熵编码写入码流
流程(解码端):
熵解码 → 反扫描 → 反量化 → 反变换 → 重建残差
|
项目 |
H.264 |
H.265 |
|
变换类型 |
整数 DCT(4×4 / 8×8) |
整数 DCT/DST(4×4 ~ 32×32),高频区域使用 DST |
|
变换尺寸 |
固定 |
自适应:大 CU 用大 TU,小细节用小 TU |
|
量化 |
标量量化,QP=0~51 |
支持 自适应量化矩阵、量化参数偏移(Delta QP) |
|
扫描顺序 |
Zig-zag / field scan |
自适应扫描(根据预测模式调整) |
✅ 效果:H.265 能更高效去除残差中的空间冗余。
4×4 帧内残差具有“边缘奇对称”特性,DST(Discrete Sine Transform) 比 DCT 能量集中度更高,残差系数更小
7. 熵编码
-
消除符号间的统计冗余
-
利用符号出现概率的不均匀性:高频符号用短码,低频符号用长码
-
自适应更新概率模型:随图像内容动态调整
✅ 核心思想:“越可预测的信息,编码越短”
|
项目 |
H.264 |
H.265 |
|
编码方式 |
CAVLC(低复杂度) CABAC(高压缩) |
仅 CABAC(优化版) |
|
上下文建模 |
基于块类型、位置 |
更精细(考虑 CU 尺寸、深度、邻块状态) |
|
并行性 |
CABAC 串行,难并行 |
引入 上下文同步机制,支持 Wavefront 并行 |
✅ 压缩率:H.265 的 CABAC 比 H.264 高 10–15%。
8. 环路滤波(Loop Filtering)
|
项目 |
H.264 |
H.265 |
|
主滤波器 |
去块效应滤波器(Deblocking Filter) |
同上,但滤波强度更精细 |
|
附加滤波 |
无 |
SAO(Sample Adaptive Offset): 对像素分类后加偏移,减少量化失真 ALF(Adaptive Loop Filter)(VVC 引入,HEVC 可选) |
✅ 画质提升:H.265 重建图像更接近原始,尤其在低码率下。
帧类型判定的核心机制
1. GOP(Group of Pictures)结构预设
编码器通常按照预定义的 GOP 模式安排帧类型。常见模式包括:
|
GOP 类型 |
示例(长度=8) |
特点 |
|
Closed GOP |
I B B P B B P B |
GOP 之间不互相参考,利于剪辑和随机访问 |
|
Open GOP |
I B B P B B B B(最后一个 B 参考下一 GOP 的 I) |
压缩效率更高,但跨 GOP 依赖 |
|
全 I 帧 |
I I I I … |
无压缩优势,但低延迟、高容错(如监控) |
|
IPPP… |
I P P P P … |
无 B 帧,低延迟,常用于实时通信 |
2. 固定周期插入 I 帧(关键帧间隔)
-
大多数编码器(如 x264、x265、FFmpeg)允许设置关键帧间隔(keyint / gop_size)。
-
即使没有场景切换,也会定期插入 I 帧,防止错误传播,并支持快进/跳转。
3. 场景切换检测(Scene Change Detection)
编码器会分析连续帧之间的差异,判断是否发生场景突变(如镜头切换、黑屏、画面剧烈变化):
-
方法:
-
计算当前帧与前一帧的 像素差、SAD(Sum of Absolute Differences)、直方图距离等。
-
若差异超过阈值,则强制插入 I 帧(或 IDR 帧)。
-
-
优点:
-
避免在场景切换处用 P/B 帧预测(会导致大量残差和失真)。
-
提升主观质量。
-
4. 低延迟 vs 高压缩的权衡
-
实时通信(如 Zoom、WebRTC):
-
禁用 B 帧(因需未来帧参考,引入延迟)。
-
使用 IPPP… 结构,甚至全 I 帧(极低延迟)。
-
-
点播视频(如 YouTube、Netflix):
-
使用含 B 帧的复杂 GOP(如 IBBPBBP…),最大化压缩率。
-
接受一定解码延迟。
-
5. IDR 帧 vs 普通 I 帧
-
普通 I 帧:可被后续帧参考,但其后的 P/B 帧仍可能参考 GOP 开始之前的帧(在 Open GOP 中)。
-
IDR 帧(Instantaneous Decoder Refresh):
-
是一种特殊的 I 帧。
-
解码器在遇到 IDR 帧时会清空 DPB(解码图像缓冲区),之后所有帧都不能参考 IDR 之前的内容。
-
用于完全独立的随机访问点。
-
帧内预测基本原理
当前块待编码(如 4×4、16×16 等)
从已解码的上边(top)和左边(left)获取参考像素
根据选定的预测模式生成预测块
计算残差 = 原始块 − 预测块
对残差进行变换、量化、熵编码
同时将预测模式索引写入码流
H.264 帧内预测详解
1. 块尺寸支持
-
亮度(Luma):
-
16×16 宏块级预测(用于平滑区域)
-
4×4 子块级预测(用于纹理细节)
-
-
色度(Chroma):8×8 块,仅 4 种模式
2. 亮度预测模式(共 9 种)
|
模式编号 |
名称 |
方向 |
|
0 |
Vertical(垂直) |
↑ |
|
1 |
Horizontal(水平) |
← |
|
2 |
DC(平均) |
取参考像素均值 |
|
3 |
Diagonal Down-Left |
↙ |
|
4 |
Diagonal Down-Right |
↘ |
|
5 |
Vertical-Right |
↗ |
|
6 |
Horizontal-Down |
↙ |
|
7 |
Vertical-Left |
↖ |
|
8 |
Horizontal-Up |
↗ |
3. 参考像素要求
-
4×4 块需 13 个参考像素(上 4 + 左 4 + 左上 1 + 扩展 4)
-
若相邻块未编码(如 slice 边界),则用默认值(如 128)填充
4. 局限性
-
方向数量少,难以拟合复杂边缘
-
无平面(Planar)模型,对渐变区域建模弱
-
色度与亮度预测独立,未利用 Y-UV 相关性
H.265 帧内预测详解
H.265 极大增强了帧内预测能力,核心改进包括:
1. 块尺寸灵活(由 CU/TU 决定)
-
支持 4×4、8×8、16×16、32×32 的帧内预测块
-
大块用于平滑区域,小块用于细节,自适应匹配内容
2. 亮度预测模式(共 35 种角度 + 2 种非方向)
|
类型 |
数量 |
说明 |
|
角度模式 |
33 种 |
覆盖 −135° 到 +135°,步长 ≈5.625° |
|
Planar 模式 |
1 种 |
拟合二维平面渐变(如光照变化) |
|
DC 模式 |
1 种 |
取参考像素平均值 |
角度模式设计特点:
-
使用分数采样 + 插值实现亚像素方向
-
方向更密集,可精确拟合任意边缘走向
-
引入 MPM(Most Probable Mode) 机制:从邻块继承最可能模式,减少码率
3. Planar 模式(H.265 新增)
-
适用于平滑渐变区域(如天空、皮肤)
-
预测值 = 水平插值 + 垂直插值 − 中心偏移
4. 色度预测增强
-
跨分量预测(Chroma from Luma):
-
利用亮度块的重建值线性映射预测色度
-
公式: Cpred=α⋅Yrecon+βCpred=α⋅Yrecon+β
-
显著提升屏幕内容、文本等场景的色度压缩效率
-
5. PDPC(Position Dependent Prediction Combination)
-
H.265 Main 10 Profile 及以上支持
-
将传统预测与未滤波参考像素加权融合
-
改善块边界连续性,减少失真
熵编码基本原理
H.264 熵编码:双模式设计
H.264 提供两种熵编码方案,供不同场景选择:
1. CAVLC(Context-Adaptive Variable-Length Coding)
-
基于变长码(VLC)
-
无需算术编码器,复杂度低,适合低端设备
-
主要编码对象:残差系数(尤其是 Baseline Profile)
CAVLC 核心机制:
-
coeff_token:联合编码非零系数个数(TotalCoeffs)和拖尾系数个数(TrailingOnes)
-
Level(幅值):使用 Exp-Golomb 编码(UE/V)
-
Run(零游程):查表 VLC
-
上下文自适应:
-
根据前一个已编码块的非零系数数量选择 VLC 表
-
例如:若前一块有很多非零系数,则当前块更可能也有 → 使用更短的码表
-
✅ 优点:简单、低延迟、硬件友好
❌ 缺点:压缩效率低于 CABAC(约 10–20% 码率损失)
2. CABAC(Context-Adaptive Binary Arithmetic Coding)
-
基于二进制算术编码
-
Main/High Profile 强制使用
-
压缩效率显著高于 CAVLC
CABAC 三大核心步骤:
二值化(Binarization)
将多值符号(如 MV、coeff_abs_level)转为二进制串(如 unary、TU、FL)
-
例:abs_level_minus1 = 3 → 1110(unary)
上下文建模(Context Modeling)
-
为每个二进制位(bin)分配一个概率模型(MPS/LPS 概率)
-
模型根据邻近已编码块的统计特性动态选择
-
例:残差系数的 first bin 使用“左侧+上方非零系数数”作为上下文索引
-
二进制算术编码(Binary Arithmetic Coding)
-
利用概率模型将二进制串映射到 [0,1) 区间的一个子区间
-
最终输出该区间的二进制表示(即压缩比特)
✅ 优点:高压缩率
❌ 缺点:串行性强,难以并行;计算复杂
H.265 熵编码:仅 CABAC,但全面增强
H.265 弃用 CAVLC,仅支持 CABAC,并在其基础上进行多项优化:
1. 更精细的上下文建模
|
语法元素 |
H.264 上下文依据 |
H.265 增强 |
|
残差系数 |
邻块非零数 |
CU 深度 + 预测模式 + 邻块状态 |
|
分割标志(split_cu_flag) |
固定上下文 |
根据 CTU 位置、深度、slice 类型 |
|
Merge 标志 |
简单上下文 |
基于邻块 Merge 使用频率 |
2. 旁路编码(Bypass Coding)优化
-
对高随机性符号(如 coeff_sign_flag、部分 MVD bits),跳过上下文建模
-
直接以 0.5 概率 进行算术编码(等效于直接输出比特)
-
减少上下文更新开销,提升速度
3. 并行处理支持
H.264 CABAC 是完全串行的,成为性能瓶颈。
H.265 引入两种并行机制:
(1) Wavefront Parallel Processing (WPP)
-
每隔几行 CTU 启动一个新“波前”
-
当前行 CABAC 初始化依赖上一行倒数第二个 CTU 的状态
-
允许多行并行编码/解码
(2) Tiles(图块)
-
将帧划分为矩形 Tile,Tile 间完全独立
-
每个 Tile 可单独 CABAC 编码,天然并行
4. 语法元素重组与编码顺序优化
-
H.265 将相关语法元素集中编码,提升上下文相关性
-
例如:先编码所有 CU 的 split 标志,再编码预测信息
-
-
减少上下文切换,提高概率估计准确性
解码流程(Decoder)
熵解码
-
解析码流,恢复量化系数、运动矢量、预测模式等。
反量化 & 反变换
-
对量化系数进行反量化,再进行反 DCT 变换,得到残差。
预测重建
-
根据预测模式(帧内/帧间)生成预测块。
-
将预测块与残差相加,得到重建块。
去块滤波
-
对重建帧应用去块滤波器。
输出 & 存储
-
输出当前帧,并将重建帧存入 DPB 供后续参考。



