H264---H.264/AVC 中的宏块、片、帧
1、H.264的宏块
就像MPEG-1和MPEG-2一样,H.264的宏块,也是编码标准的基本处理单元,通常它的大小也为16x16像素。但在H.264的简介一文中我们就说过,H.264的预测图块可以小到4x4像素。所以这也促成了,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中,在【帧内编码】时,例如对T帧图像进行编码时,不同宏块是独立编码的
【只利用宏块内部空间相关性,没有利用宏块间的空间相关性】????I帧编码后的数据量也非常大
H.264/AVC为了改善这一状况,就引入了帧内预测技术
2、在H.264中,宏块也是分类型的,与图像一样,它也分为三种类型:I宏块、B宏块、P宏块(此外还有特殊的SI宏块等)。
在H.264中, 帧内预测的对象是I宏块,
帧间预测的对象是为B宏块和P宏块。
下面为I宏块、B宏块、P宏块的用法(摘自毕厚杰《新一代视频压缩编码标准》):
I宏块利用从【当前片中已解码的像素】作为参考进行帧内预测 //注意是当前片内,不能取自其他片
P宏块利用前面已编码的图像作为参考图像,进行帧间预测。
B宏块则利用双向的参考图像(当前的和未来的已编码的图像帧)进行帧间预测。
//其实就是和I、B、P帧的编码类似,但是我们这里的对象是I、B、P宏块为单位预测
2、H.264的宏块与像片
像片由整数个宏块组成,且宏块分为三种类型(没有考虑特殊的SI宏块)
在H.264中,有5种类型的像片,分别为:
I像片:只包含I宏块
P像片:包含P宏块和/或I宏块
B像片:包含B宏块和/或I宏块
SP像片:包含P宏块和/或I宏块,用于不同编码流之间进行切换。
SI像片:包含SI宏块(一种特殊类型的帧内编码宏块),用于不同编码流之间进行切换。
SP和SI像片,是H.264新增的,经过特殊编码的像片,它们用于在不同编码流之间进行切换、随机访问、快进和快退。
在用户网络状况变化的情况下,可以使用SP帧从低数据量码流切换到高数据流码流,或者从高切向低。
在H.264里,这5种类型的像片,与宏块的关系如下:
3、H.264的帧、像片、宏块
关于帧的类型,在*上有专门介绍:https://en.wikipedia.org/wiki/Video_compression_picture_types
I片:只有I宏块
P片:必有P宏块,可能有I宏块
B片:必有B宏块,可能有I宏块
I帧:只有I片
P帧:必有P片,可能有I片
B帧:必有B片,可能有I片、P片
因为默认情况下,不使用FMO且没有数据分割时,一帧即为一片,进一步则可以根据片的类型去判断帧的类型。而且在实际的H.264比特流结构中,并没有图像层,片是最上层的图像数据单位。