H264编码—slice

一个视频图像可编码成一个或更多个条带(slice),每个条带(slice)包含整数个宏块(MB),即每个条带至少一个MB,最多时每个条带包含整个图像的宏块。总之,一幅图像中每个条带的宏块数不一定固定。
设条带的目的是为了限制误码的扩散和传输,每个编码条带相互间是独立的。某个条带的预测不能以其它条带中的宏块为参考图像,这样某一条带中的预测误差才不会传播到其它条带中去。

slice类型

根据码流中不同的数据类型,H264中定义了5中slice类型:

类型含义描述Profile
I(I slice)帧内编码条带仅包含I宏块ALL
P(P slice)单向帧间编码条带包含P宏块或I宏块ALL
B(B slice)双向帧间编码条带包含B宏块或I宏块Extended and Main
SP(SP slice)切换I条带包含P宏块或I宏块Exteded
SI(SI slcie)切换P条带仅包含SI宏块Exteded
  • I宏块是指每个块或宏块是通过其所在的Slice中的之前的已经编码过的数据进行预测的;
  • P宏块是指宏快或宏块分割是通过List0中的一个参考图像来进行预测的;
  • B宏块是指宏快或宏块分割是通过List0和/或List1中的参考图像来进行预测的;
  • SI和SP:即Switch I和Switch P,是一种特殊的编解码条带,可以保证在视频流之间进行有效的切换,并且解码器可以任意的访问。比如,同一个视频源被编码成各种码率的码流,在传输的过程中可以根据网络环境进行实时的切换;
  • SI宏块是一种特殊类型的内部编码宏块,按Intra_4x4预测宏块编码。

slice的划分方式

垂直方向上将一帧数据,平均分为几个区域,每个区域就是一个slice。如果不定义slice的个数,默认为1个slice,也就是整帧画面就是一个slice

4个slice

比如将一帧图像,分为4个条带(slice)的划分方式如下:

H264 4个slice

当前帧图像尺寸1920x1080,每个宏块大小16x16

因此,每个slice的大小:1920xS,S的计算方法:

  • 计算1080与16的最小公倍数:8
  • 实际处理高度将是1080+8 = 1088
  • 因此每个slice高度S = 1088 / 4 = 272像素,272/16=17个宏块

码流解析:

H264 4个slice码流

默认一个slice

码流解析:

H264默认一个slice

slice组成

每一个条带(slice)总体来看都由两部分组成,一部分作为Slice header,用于保存Slice的总体信息(如当前Slice的类型等),另一部分为Slice body,通常是一组连续的宏块结构(或者宏块跳过信息),如下图所示:

slice组成结构

条带头语法元素slice_type

slice_typeName of slice_type
0P(P slice)
1B(B slice)
2I(I slice)
3SP(SP slice)
4SI(SI slice)
5P(P slice)
6B(B slice)
7I(I slice)
8SP(SP slice)
9SI(SI slice)

IDR图像时, slice_type 等于 2, 4, 7, 9。

slice_type的值在5~9的范围内表示,除了当前条带的编码类型,所有当前编码图像的其他条带的slice_type的值应与当前条带的slice_type的值一样,或者等于当前条带的slice_type的值减5。

总结

  • 每个条带(slice)可以进行独立的编解码
  • h264编码以macroblock为最小单位(简称MB),多个连续的MB组成一个slice,每个slice编码输出一个NALU
  • 划分slice的方式可以按照固定个数MB的方式; 也可以对MB编码后累计的字节数为依据进行划分。在图像上体现为一个连续区域块,区域块的长度(以MB为单位)可以变化。
  • 一帧图像中每个条带的宏块数不一定固定
  • 每个slice的编码过程是相互独立的。分多slice之后,可以并发地对多个slice进行编解码,加快编码速度。同时分多slice之后,后续若slice内部出错,错误可以被限制在该slice内部,而不扩散到slice外部,在解码时花屏的面积就比较小。
  • 分多slice之后,对应若在解码器端出错,那么若实施纠错机制,对应所需要处理的区域就可以较小,减少消耗。
  • 分多slice之后,由于每个slice都需要自己专有的元信息,并且编码过程中slice内部可参考的信息就减少了很多,最终编码输出的码流体积会相对变大。
  • 当然一幅图像编码可以放在一个slice里进行;具体需要根据业务场景进行综合选择slice模式,比如对带宽的要求、对容错要求等。

编解码时图像序列的整体结构:

H264图像序列

像素点: 像素点是最小的图像单元,一张图片由好多的像素点组成。图片尺寸是500×338的,表示图片是由一个500×338的像素点矩阵构成的,这张图片的宽度是500个像素点的长度,高度是338个像素点的长度,共有500×338 = 149000个像素点。
RGB格式的图片,一个像素点的大小就是rgb所占的空间,比如rgb888,像素大小3×8=24bit

参考

  • H.264的Slice及Slice类型
  • h264编码概述五(slice定义)