问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

H.264视频编码技术详解:帧内和帧间编码分析

创作时间:
作者:
@小白创作中心

H.264视频编码技术详解:帧内和帧间编码分析

引用
CSDN
1.
https://blog.csdn.net/xiaoyuanren11/article/details/139990051

H.264作为广泛使用的视频编码标准,在视频处理、多媒体通信等领域具有重要应用。本文详细介绍了H.264中的帧内编码和帧间编码机制,包括预测模式的选择、宏块大小的划分、预测块的搜索方法,以及运动矢量的预测等关键技术细节。

帧内编码是怎么预测的?

通过利用已经编码的相邻像素值来预测待编码的像素值。在预测时,已编码像素值会重建像素,用来做待编码像素的参考像素。

  • 4x4宏块:8种方向模式和一种DC模式
  • 16x16宏块:4种方向模式
  • 8x8宏块:4种方向模式

帧内预测模式怎么选择?

先得到预测块,根据预测块得到残差块

  • 方案一:对每一种预测模式的残差块的像素值求绝对值再求和,称为cost,然后取其中cost最小的预测模式为最优预测模式
  • 方案二:对残差块先进行Hadamard变化,变化到频域之后再求绝对值之和,取cost最小为最优预测模式
  • 方案三:残差块直接DCT变换、量化、熵编码,计算得到失真大小和编码后的码流大小,然后通过率失真优化方式来选择最优预测模式

帧内编码的宏块大小是固定的吗?

在H264中亮度块的宏块大小是16 x 16,亮度宏块还可以划分为更小的子块8 x 8或者4 x 4

在H264中色度块的宏块大小是8 x 8,不会继续划分

帧间编码是怎么编码的?

帧间预测是在其他已编码的图像中去寻找参考像素块,帧间编码有单参考(只在一帧已编码图像寻找参考像素块)和多参考(在多个已编码图像中寻找像素块),既可以向前参考也可以向后参考。

帧间编码的宏块大小是固定的吗?

亮度块的划分如下图所示:

色度块的划分分别对应:

  • 8x8 4x8 4x8 8x4 8x4 4x4 4x4 4x4 4x4
  • 4x4 2x4 2x4 4x2 4x2 2x2 2x2 2x2 2x2

帧间怎么找到预测块?

先进行整像素搜索,后进行半像素搜索,通过比较得到最优预测块

  • 整像素搜索方式:全搜索、菱形搜索、六边形搜索
  • 亚像素精度搜索

运动矢量怎么预测?

先用周围相邻块的运动矢量预估得到预测运动矢量称为MVP,将当前运动矢量与MVP的差值称为MVD,将MVD编码到码流中。

MVP怎么得到?

例如一个16 x 16的宏块预测步骤如下:

  1. 取当前编码宏块的左边块 A、上边块 B、右上块 C。如果右上块不存在或者参考帧与当前编码宏块不同(多参考的时候会存在),则使用左上块 D 替换 C,即 C = D。
  2. 求得 A、B、C 块的参考帧有多少个与当前编码块的参考帧相同,记为 count。
  3. 如果 count > 1,则取 A、B、C 块的运动矢量的中值(就是 A、B、C 块运动矢量的 3 个 x 和 3 个 y 分别取中间值作为 MVP 的 x 和 y)。
  4. 如果 count = 1,则直接将这个块的运动矢量作为 MVP。
  5. 如果 count = 0,并且 B、C 都不存在,A 存在的话,则直接将 A 的运动矢量作为 MVP。如果上述条件都不满足,则取 A、B、C 块运动矢量的中值。

知道SKIP模式吗?

如果MVD和残差块同时为0就是SKIP模式

单参考帧帧间模式的参考过程

  1. 首先判断当前宏块是不是可以作为 SKIP 块(通过相邻已经编码的块是不是存在 SKIP 块,和当前块使用 MVP 做运动矢量之后,残差块变换量化后是不是都为 0 等算法来判断),如果可以作为 SKIP 块则模式选择结束,不再进行下面的划分了。

  2. 宏块大小为 16 x 16。首先不划分宏块,直接使用 16 x 16 大小的块,在参考帧中进行运动搜索,得到运动矢量和预测块,通过 MVP 求得 MVD,通过预测块求得残差块,并求得残差块的 SATD 值(残差块经过 Hadamard 变换之后求绝对值再求和),估计 MVD 的编码后占用的字节数,将两个值加起来作为 cost16x16。

  3. 将 16 x 16 块划分成 4 个 8 x 8 的子块,分别进行运动搜索,并求得每一个 8 x 8 子块的 MVD 和残差块,最后分别得到 4 个子块的 cost8x8。

  4. 如果 4 个 8 x 8 子块的 cost8x8 之和小于 16 x 16 块的 cost16x16 的话,我们再分别对每一个 8 x 8 子块划分成 4 个 4 x 4 子块,同样分别进行运动搜索,得到每一个 4 x 4 子块的 cost4x4。

  5. 如果 4 个 cost4x4 之和小于 cost8x8,则将 8 x 8 块划分成 4 x 8 和 8 x 4 两种子块分别求得 cost4x8 和 cost8x4,再根据 4 个 cost4x4、2 个 cost4x8 和 2 个 cost8x4 的大小,选择最终的 8x8 划分的方式,并将对应的 cost 值更新到 cost8x8。

  6. 否则不划分 8 x 8 子块。

  7. (2)如果 4 个 8 x 8 子块的最新的 cost8x8 之和还是小于 cost16x16 的话,则再将 16 x 16 划分成两个 8 x 16 和 16 x 8 子块,并分别求得 cost8x16 和 cost16x8,对比 8x8、16x8、8x16 的 cost 值,并决定最终 16 x 16 块的划分方式。

  8. 否则的话,不划分 16 x 16 的块。

  9. 得到了编码宏块的帧间模式之后,我们还需要对编码宏块进行帧内模式的选择。在 P 帧和 B 帧中的宏块也是可以使用帧内模式的,所以我们需要看是帧间模式 cost 更小还是帧内模式 cost 更小。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号