H264——H264中的宏块(macroblock)片(slice)帧(frame)

Posted 贺二公子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了H264——H264中的宏块(macroblock)片(slice)帧(frame)相关的知识,希望对你有一定的参考价值。

原文地址:https://blog.csdn.net/qq_28258885/article/details/119416168


文章目录

前言

  • 若干个块组成宏块
  • 若干个宏块组成条带
  • 若干个条带组成一帧
  • 若干帧组成一个序列
  • 若干序列组成一段视频

宏块(macroblock)

H264中,以16x16的宏块为编码最小单元,一个宏块可以被分成多个4x4或8x8的块
同一个宏块内,像素的相似程度会比较高,若16x16的宏块中,像素相差较大,那么就需要继续细分

H265的宏块是从8x8到64x64可变

宏块种类

  • I宏块利用从当前片中,已解码的像素作为参考进行帧内预测,注意是当前片内,不能取其他片中已解码的像素作为参考进行帧内预测
  • P宏块利用前面已编码的图像作为参考图像,进行帧间预测
  • B宏块则利用双向的参考图像(当前的和未来的已编码的图像帧)进行帧间预测

不合理的分块会出现块效应,即块与块之间色差明显
海思在3559之后有deblock的接口可以应对块效应,3519上用的很多

片(slice)

一帧视频图像可编码成一个或者多个片,每片包含整数个宏块,即每片至少一个宏块,最多时包含整个图像的宏块。

slice的目的:为了限制误码的扩散和传输,使编码片相互间保持独立。

我们通过分析H.264的宏块知道,要想具备哪种能力(帧内预测或帧间预测),只要包含对应类型的宏块即可。所以我们可以猜测,假如一个slice包含了I宏块,那么它就具有了帧内预测的能力,如果包含了P或B宏块,它就具有了帧间预测的能力。

slice种类如下

  • I:只包含I宏块,每一个块或宏块,可以在当前片中,通过已编码的像素作为参考进行帧内预测。可以看到和I宏块的能力一致。
  • P:包含P宏块和/或I宏块,对于P宏块的每一个宏块,用前面已编码的图像作为参考图像,进行帧间预测。
  • B:包含B宏块和/或I宏块,对于B宏块的每一个宏块,用当前的和未来的已编码的图像帧作为参考图像,进行帧间预测。
  • SP:包含P宏块和/或I宏块,用于不同编码流之间进行切换。 SI:包含SI宏块(一种特殊类型的帧内编码宏块),用于不同编码流之间进行切换。
  • SI:包含SI宏块(一种特殊类型的帧内编码宏块),用于不同编码流之间进行切换。

而SP和SI slice,是H.264新增的,经过特殊编码的slice,它们用于在不同编码流之间进行切换、随机访问、快进和快退。
在用户网络状况变化的情况下,可以使用SP帧从低数据量码流切换到高数据流码流,或者从高切向低。

以下是片的句法结构:片头规定了片的类型、属于哪个图像、有关的参考图像等;片的数据包含了一系列宏块和不编码数据。

片组是一个编码图像中若干宏块的一个子集,包含一个或若干个片。

一般一个片组中,每片的宏块是按扫描次序进行编码的,除非使用任意片次序(Arbitrary Slice Order, ASO)一个编码帧中的片之后可以跟随任一解码图像的片。

slice组

是一个编码图像中若干宏块的一个子集,包含一个或若干个片。

一般一个片组中,每片的宏块是按扫描次序进行编码的,除非使用任意片次序(Arbitrary Slice Order, ASO)一个编码帧中的片之后可以跟随任一解码图像的片。

slice与macroblock的关系

  • I:只包含I宏块,每一个块或宏块,可以在当前片中,通过已编码的像素作为参考进行帧内预测。可以看到和I宏块的能力一致。
  • P:包含P宏块和/或I宏块,对于P宏块的每一个宏块,用前面已编码的图像作为参考图像,进行帧间预测。
  • B:包含B宏块和/或I宏块,对于B宏块的每一个宏块,用当前的和未来的已编码的图像帧作为参考图像,进行帧间预测。
  • SP:包含P宏块和/或I宏块,用于不同编码流之间进行切换。
  • SI:包含SI宏块(一种特殊类型的帧内编码宏块),用于不同编码流之间进行切换。

帧(frame)

I帧P帧B帧

一段视频中,相邻的肌肤图像,可能出现互差别不大的情况。如像素只相差10%以内的点,亮度只相差2%,色度差值的变化只有1%。如果每一帧都单独压缩,那么就会很浪费空间。

所以对于一段变化不大图像画面,我们可以先编码出一个完整的图像帧A,随后的B帧就不编码全部图像,只写入与A帧的差别,这样B帧的大小就只有完整帧的1/10或更小!
B帧之后的C帧如果变化不大,我们可以继续以参考B的方式编码C帧,这样循环下去。
这段图像我们称为一个序列(序列就是有相同特点的一段数据),当某个图像与之前的图像变化很大,无法参考前面的帧来生成,那我们就结束上一个序列,开始下一段序列,也就是对这个图像生成一个完整帧A1,随后的图像就参考A1生成,只写入与A1的差别内容。

  • 先编码出来的帧A就是I帧
  • 预测出来的B、C就是P或B帧
  • 以上说的预测,就是帧间压缩
  • 对帧A的原始压缩方法,就是帧内压缩

序列

在H264中图像以序列为单位进行组织,一个序列是一段图像编码后的数据流, 以I帧开始,到下一个I帧结束。

一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。
一个序列就是一段内容差异不太大的图像编码后生成的一串数据流。当运动变化比较少时,一个序列可以很长,因为运动变化少就代表图像画面的内容变动很小,所以就可以编一个I帧,然后一直P帧、B帧了。当运动变化多时,可能一个序列就比较短了,比如就包含一个I帧和3、4个P帧。

如果I帧与PB帧的比例不够合理,就会出现呼吸效应,即I帧图像最优,随着P帧的增加图像质量递减,到第二个I帧图像质量出现明显跳变

frame与slice、macroblock的关系

frame和宏块间的关系

  • I帧只包含I宏块
  • P帧包含I宏块和P宏块
  • B帧包含I宏块、P宏块、B宏块

而slice呢,也是对宏块的划分

slice和宏块的关系

  • I slice只包含I宏块
  • P slice包含P宏块和/或I宏块
  • B sliceB宏块和/或I宏块。

I帧、B帧、P帧和对应类型的slice之间的关系

  • 当帧内slice全部为I像片时,则此帧为I帧
  • 当全部为P slice或和I slice的组合时,则为P帧
  • 当为B slice或和I、P slice的组合时,则为B帧。

不过关于如何通过slice,来辨别是哪个帧,到我们后面学习比特流的句法和语义的时候,H.264已有规定。

因为默认情况下,不使用FMO且没有数据分割时,一帧即为一片,进一步则可以根据片的类型去判断帧的类型。而且在实际的H.264比特流结构中,并没有图像层,片是最上层的图像数据单位。

以上是关于H264——H264中的宏块(macroblock)片(slice)帧(frame)的主要内容,如果未能解决你的问题,请参考以下文章

H264中的宏块

H264基本概念之宏块片和片组

H264基本概念之宏块片和片组

H264解析Demo12去块滤波

h.264宏块与子宏块类型

H264解析Demo11帧内预测编码_2_获得参考的像素值