H.264的语法单元:H.264中没有I图像,P图像和B图像的概念,取而代之的是I片,P片和B片:
0、Slice的概念
定义Slice的意义:为限制误码的扩散和传输
1、一个Slice:包含某一帧的全部(不分片时)或部分数据(分片时)
2、不同的slice之间,其解码操作独立👉防止误码的扩散
slice的解码过程所参考的数据(例如预测编码)不能越过slice的边界
图像解码过程中总是按照片slice进行解码,然后按照片组将解码宏块重组成图像。
5种Slice的类型
根据码流中不同的数据类型,H.264标准中共定义了5种Slice类型:
I slice: 帧内编码的条带; 只包含I宏块
P slice: 单向帧间编码的条带; 包含P宏块,可能有I宏块
B slice: 双向帧间编码的条带; 包含B宏块,可能有I宏块
SI slice: 切换I条带,用于扩展档次中码流切换使用; SI + I
SP slice: 切换P条带,用于扩展档次中码流切换使用; P + I
0、 slice通过nalu装载并进行网络传输
NALU内可以是切片,也可能装载着其他用作描述视频的信息,如sps ppe等。
1、若不采用DP数据分割机制,一片只包含1个NALU,
2、若采用DP数据分割,则一片拆分成3个NALU,nal_unit_type值等于2、3、4(A、B、C)的NALU属于同一个片
分割A:包含片头和片中每个宏块头数据。 nal_unit_type=2
分割B:包含帧内和 SI 片宏块的编码残差数据。 nal_unit_type=3
分割C;包含帧间宏块的编码残差数据。 nal_unit_type=4
每个分割可放在独立的 NAL 单元并独立传输。
//如果分割 A 数据丢失,便很难或者不能重建片,因此分割 A 对传输误差很敏感。
//解码器可根据要求只解 A 和 B 或者A和 C,以降低在一定传输条件下的复杂度。
1、4类Slice
Slice_body,通常是一组连续的宏块结构(或者宏块跳过信息)
1.1 Slice_Header
1、first_mb_in_slice:片中的第一个宏块的地址, 片通过这个句法元素来标定它自己的地址。
注意:在【帧场自适应模式】下,宏块都是成对出现,这时本句法元素表示的是第几个宏块对,
对应的第一个宏块的真实地址应该是2 * first_mb_in_slice
2、slice_type:指明片的类型,IDR 图像时, slice_type 等于 2, 4, 7, 9。
num_of_slice_type 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)</