欢迎光临
我们一直在努力

编解码流程和原理分析

编码流程(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 供后续参考。

  • 赞(0)
    未经允许不得转载:171主机测评 » 编解码流程和原理分析
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址