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)的划分方式如下:
当前帧图像尺寸1920x1080
,每个宏块大小16x16
因此,每个slice的大小:1920xS
,S
的计算方法:
- 计算1080与16的最小公倍数:8
- 实际处理高度将是1080+8 = 1088
- 因此每个slice高度S = 1088 / 4 = 272像素,272/16=17个宏块
码流解析:
默认一个slice
码流解析:
slice组成
每一个条带(slice)总体来看都由两部分组成,一部分作为Slice header,用于保存Slice的总体信息(如当前Slice的类型等),另一部分为Slice body,通常是一组连续的宏块结构(或者宏块跳过信息),如下图所示:
条带头语法元素slice_type
slice_type | Name of slice_type |
---|---|
0 | P(P slice) |
1 | B(B slice) |
2 | I(I slice) |
3 | SP(SP slice) |
4 | SI(SI slice) |
5 | P(P slice) |
6 | B(B slice) |
7 | I(I slice) |
8 | SP(SP slice) |
9 | SI(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模式,比如对带宽的要求、对容错要求等。
编解码时图像序列的整体结构:
像素点: 像素点是最小的图像单元,一张图片由好多的像素点组成。图片尺寸是500×338的,表示图片是由一个500×338的像素点矩阵构成的,这张图片的宽度是500个像素点的长度,高度是338个像素点的长度,共有500×338 = 149000个像素点。
RGB格式的图片,一个像素点的大小就是rgb所占的空间,比如rgb888,像素大小3×8=24bit
参考
- H.264的Slice及Slice类型
- h264编码概述五(slice定义)