H.264/AVC 中的宏块、片、帧

上篇文章最后,因为编辑的原因,有一点没有补充。就是最后给出的维基百科的FMO彩图,其中的Type 0 并不是规则0中的交错片组,而是不使用FMO情况下的,标准的H.264像片,而Type 1 至Type 5依次对应规则1 至 规则5。

这篇文章中,我们继续接着H264画面划分开始,介绍它的像片类型。希望读者通过这一篇文章,能够对理解H.264的编解码原理打下基础,了解H.264的基本编码单元,以及帧、像片、宏块之间的关系。

通过上篇我们知道,一帧图像可以划分成若干片组,“片组”又由“像片”组成,而像片则由宏块组成。所以这里为了弄清楚帧、像片和宏块之间的关系,我们先从宏块开始,然后像片,最后帧这种逐级向上的方式来分析。

1、H.264的宏块

就像MPEG-1和MPEG-2一样,H.264的宏块,也是编码标准的基本处理单元,通常它的大小也为16x16像素。但在H.264的简介一文中我们就说过,H.264的预测图块可以小到4x4像素。所以这也促成了,16x16像素的宏块,可以接着再划分成子宏块这一操作。

如下图:

在这里插入图片描述
H.264宏块分割

在上图中,左上角的就是16x16像素的宏块,我们可以对它进行水平和垂直两个方向的等分划分,最终它所产生的可能的宏块大小,分别为8x8、4x8、8x8、4x4。总结起来,就如下图所示的树状结构:

在这里插入图片描述
H.264的树状结构分割

可以看到,16x16的宏块,可以进行一分为二,二分为四,而产生的所有可能,就列在上图中。在实际的H.264编码时,可能会使用8x8、或4x8、或8x4、或4x4像素的子宏块,也有可能是它们的组合。

当然,像素块越小,编码的复杂度也会随之增加,编码效率自然就会降低。但是这样是值得的,因为图像的压缩效率有了显著提高,也就是编码后得到的相同质量的图像,H.264的压缩比更大,占用的空间及带宽更小。

而在H.264编码过程中,与宏块的划分直接相关的,就是帧内预测和帧间预测了。注意我们现在讨论的,是H.264的帧内预测和帧间预测。有的同学可能一看到这两个词,自然而然就联想到了MPEG-1和MPEG-2中,I帧的帧内编码,和B帧、P帧的帧间预测。

这里有两点需要注意:

  • (1)在H.264里,我们说的是帧内预测,注意是预测,并不是帧内编码。
  • (2)在H.264里,我们试图描述的,是把宏块与帧内预测和帧间预测联系起来。而在MPEG-1和MPEG-2里,虽然它的处理单位也是宏块,但在介绍它们的时候,我们的着重点,一直是放在I帧、B帧、P帧这样的图像级别的区别之上,进而去讨论帧内编码和帧间预测。

这两点其实很好理解,我们一一来分析:

(1)首先关于第一点,我们疑惑并不是帧内编码,而是不知道帧内预测是啥。在讲MPEG 1和2的时候,我们都知道,在帧内编码时,也就是对帧内图像I进行编码时,我们的重点是对I帧的各个宏块进行编码,即只利用了一个宏块内部的空间相关性,并没有利用宏块与宏块之间的空间相关性。

也就是说,在I帧图像内,即使两个宏块之间,像素差值很小,也是分开进行编码。所以在MPEG-1和MPEG-2中,我们就看到,即使是编码后,I帧的数据量也非常大,这就是之前说的帧内编码。

所以答案就很明显了,H.264/AVC为了改善这一状况,就引入了帧内预测技术。而关于帧内预测更详细的内容,我们下篇再介绍。

(2)接下来就是第二点了,我们看完这点依然不明白什么意思,那是因为我们还有一个知识点没介绍。那就是在H.264中,宏块也是分类型的,与图像一样,它也分为三种类型(不考虑特殊的SI宏块):I宏块、B宏块、P宏块。所以在H.264中,我们说的帧内预测,其实说的对象是I宏块,而帧间预测,则为B宏块和P宏块。

下面为I宏块、B宏块、P宏块的用法(摘自毕厚杰《新一代视频压缩编码标准》):

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

其实就是和I、B、P帧的编码类似,但是我们这里的对象是I、B、P宏块而已,并且对于I宏块,我们使用的是帧内预测。

2、H.264的宏块与像片

我们都知道,像片由整数个宏块组成,那既然宏块分为三种类型(没有考虑特殊的SI宏块),我们自然而然就会想到,像片是不是也应该分一下类型?答案是绝对正确的,但是我们可能猜不到像片的种数。

在H.264中,有5种类型的像片,分别为:I像片、P像片、B像片、SP像片、SI像片。我们可能会猜到I、B、P像片,但是SP和SI像片,却不知道是干啥用的,关于这点,我们稍后介绍。现在我们先来看看,这5种像片分别是啥?

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

而在H.264里,这5种类型的像片,与宏块的关系如下:

在这里插入图片描述
像片与宏块的关系

图中英文看不懂没关系,只需要知道表头分为三列就行,分别为:像片类型,描述,配置。具体如下:

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

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

3、H.264的帧、像片、宏块

在上面我们介绍了宏块和像片的关系之后,很多人自然而然就会想到,帧应该是有哪种哪种类型的像片组成的吧。事实上,并非如此。

关于帧的类型,在维基百科上有专门介绍:https://en.wikipedia.org/wiki/Video_compression_picture_types
对于I帧、B帧、P帧的概念,其实在H.264和之前的标准中,都表示一个意思。比如I帧,就是指能够独立完成编解码的视频帧,P帧则依靠前面的I帧做参考,B帧则依靠之前和之后的图像做参考。

在面向宏块的划分上,I帧只包含帧内宏块,P帧可以包含帧内和预测宏块,B帧可以包含帧内、预测、双向预测宏块。对应到H.264中,就是指:

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

而像片呢,也是对宏块的划分,比如I像片只包含I宏块,P像片包含P宏块和/或I宏块,B像片B宏块和/或I宏块。

但是I帧、B帧、P帧和对应类型的像片之间的关系呢?

我们只能说,当帧内像片全部为I像片时,则此帧为I帧;当全部为P像片或和I像片的组合时,则为P帧;当为B像片或和I、P像片的组合时,则为B帧。

不过关于如何通过片(即像片),来辨别是哪个帧,到我们后面学习比特流的句法和语义的时候,H.264已有规定。因为默认情况下,不使用FMO且没有数据分割时,一帧即为一片,进一步则可以根据片的类型去判断帧的类型。而且在实际的H.264比特流结构中,并没有图像层,片是最上层的图像数据单位。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值