一 NALU头部解析
F:
forbidden_zero_bit. 在 H.264 规范中规定了这一位必须为 0.
NRI:
nal_ref_idc. 取00~11,似乎指示这个NALU的重要性,如00的NALU解码器可以丢弃它而不影响图像的回放,0~3,取值越大,表示当前NAL越重要,需要优先受到保护。如果当前NAL是属于参考帧的片,或是序列参数集,或是图像参数集这些重要的单位时,本句法元素必需大于0。
Type:
标识NAL单元中的RBSP数据类型,其中,nal_unit_type为1, 2, 3, 4, 5的NAL单元称为VCL的NAL单元,其他类型的NAL单元为非VCL的NAL单元。
二 NALU Type 解析
nalu type的计算方式
在每一帧的起始码(00 00 00 01)之后取到nalu头部code 一个字节
用该公式计算nalutype :int type = code & 0x1f
nalu type
nal_unit_type. 这个NALU单元的类型,1~12由H.264使用,24~31由H.264以外的应用使用,简述如下:
0 没有定义
1-23 NAL单元 单个 NAL 单元包
1 不分区,非IDR图像的片
2 片分区A
3 片分区B
4 片分区C
5 IDR图像中的片
6 补充增强信息单元(SEI)
7 SPS
8 PPS
9 序列结束
10 序列结束
11 码流结束
12 填充
13-14 保留
15 Subset SPS
16-23 保留
24 STAP-A 单一时间的组合包
25 STAP-B 单一时间的组合包
26 MTAP16 多个时间的组合包
27 MTAP24 多个时间的组合包
28 FU-A 分片的单元
29 FU-B 分片的单元
30-31 没有定义
常见数据帧
序列参数集 SPS----7:
SPS即Sequence Paramater Set SPS中保存了一组编码视频序列(Coded video sequence)的全局参数。所谓的编码视频序列即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列。而每一帧的编码后数据所依赖的参数保存于图像参数集中。一般情况SPS和PPS的NAL Unit通常位于整个码流的起始位置。但在某些特殊情况下,在码流中间也可能出现这两种结构,主要原因可能为:
1:解码器需要在码流中间开始解码;
2:编码器在编码的过程中改变了码流的参数(如图像分辨率等);
图像参数集 PPS----8:
除了序列参数集SPS之外,H.264中另一重要的参数集合为图像参数集Picture Paramater Set(PPS)。通常情况下,PPS类似于SPS,在H.264的裸码流中单独保存在一个NAL Unit中,只是PPS NAL Unit的nal_unit_type值为8;而在封装格式中,PPS通常与SPS一起,保存在视频文件的文件头中。
关键帧 IDR 帧----5:
I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)
P帧 ----1:
P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)
RBSP
Raw Byte Sequence Payload,原始字节序列载荷。
跟据nal_unit_type可以分成以下表格
nal_unit_type
|
Content of NAL unit and RBSP
syntax structure
|
Categary
|
说明
|
0
|
Unspecified
|
|
|
1
|
Coded slice of a non-IDR picture
slice_layer_without_partitioning_rbsp( )
|
2,3,4
|
一个非IDR图像的编码条带
|
2
|
Coded slice data partition A
slice_data_partition_a_layer_rbsp( )
|
2
|
编码条带数据分割块A
|
3
|
Coded slice data partition B
slice_data_partition_b_layer_rbsp( )
|
3
|
编码条带数据分割块B
|
4
|
Coded slice data partition C
slice_data_partition_c_layer_rbsp( )
|
4
|
编码条带数据分割块C
|
5
|
Coded slice of an IDR picture
slice_layer_without_partitioning_rbsp( )
|
2,3
|
IDR图像的编码条带
|
6
|
Supplemental enhancement information
(SEI)
sei_rbsp( )
|
5
|
辅助增强信息 (SEI)
|
7
|
Sequence parameter set
seq_parameter_set_rbsp( )
|
0
|
序列参数集SPS
|
8
|
Picture parameter set
pic_parameter_set_rbsp( )
|
1
|
图像参数集PPS
|
9
|
Access unit delimiter
access_unit_delimiter_rbsp( )
|
6
|
访问单元分隔符AUD
|
10
|
End of sequence
end_of_seq_rbsp( )
|
7
|
序列结尾
|
11
|
End of stream
end_of_stream_rbsp( )
|
8
|
流结尾
|
12
|
Filler data
filler_data_rbsp( )
|
9
|
填充数据
|
13
|
Sequence parameter set extension
seq_parameter_set_extension_rbsp( )
|
10
|
|
14
|
Prefix NAL unit
prefix_nal_unit_rbsp( )
|
2
|
|
15
|
Subset sequence parameter set
subset_seq_parameter_set_rbsp( )
|
0
|
|
16…18
|
Reserved
|
|
|
19
|
Coded slice of an auxiliary coded
picture without partitioning
slice_layer_without_partitioning_rbsp( )
|
2,3,4
|
|
20
|
Coded slice extension
slice_layer_extension_rbsp( )
|
2,3,4
|
|
21
|
Coded slice extension for a depth view
component or a 3D-AVC texture view component
slice_layer_extension_rbsp( )
|
2,3,4
|
|
22…23
|
Reserved
|
|
|
24…31
|
Unspecified
|