一 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 & 0x1fnalu 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-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:编码器在编码的过程中改变了码流的参数(如图像分辨率等);
图像参数集SPS--7
除了序列参数集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帧没有完整画面数据,只有与前一帧的画面差别的数据)
三 参考代码
h264nalu头部解析可参考ffmpeg源码
h264_parser.c的parse_nal_units函数
F: 必须为0,为1表示语法错误。整包将被丢弃
NalType:nalu包的类型,其中VCL NAL和non-VCL NAL各有32类。0-31是vcl nal单元;32-63,是非vcl nal单元。VCL是指携带编码数据的数据流,而non-VCL则是控制数据流.
LayerId:表示NAL所在的Access unit所属的层,该字段是为了HEVC的继续扩展设置。也就是目前都是0,以后的扩展可能会用到。
TID:此字段指定nal单元加1的时间标识符。时间id的值等于tid-1,tid的值为0是非法的,以确保nal单元报头中至少只有一个比特等于1,以便能够在nal单元头和nal单元有效负载数据中独立考虑启动代码仿真。
当head为40 01 ====》0100 0000 0000 0001时,解析如下
F 0
NalType 100 0000 32/VPS
LayerId 0 0000 0 0
TID 001 1
在每一帧的起始码(00 00 00 01)之后取到nalu头部code 两个字节
用该公式计算nalutype :int type = (code & 0x7E)>>1;
val nal
non-vcl nalu
语义为视频参数集 VPS
HEVC_NAL_VPS 32
语义为序列参数集 SPS
HEVC_NAL_SPS 33
语义为图像参数集 PPS
HEVC_NAL_PPS 34
语义为补充增强信息 SEI
HEVC_NAL_SEI_PREFIX 39
HEVC_NAL_SEI_SUFFIX 40
视频帧数据流IDR ------ 下列均为视频帧,若要区分I B P 需要进一步分析
HEVC_NAL_TRAIL_N 0
HEVC_NAL_TRAIL_R 1
HEVC_NAL_TSA_N 2
HEVC_NAL_TSA_R 3
HEVC_NAL_STSA_N 4
HEVC_NAL_STSA_R 5
HEVC_NAL_BLA_W_LP 16
HEVC_NAL_BLA_W_RADL 17
HEVC_NAL_BLA_N_LP 18
HEVC_NAL_IDR_W_RADL 19
HEVC_NAL_IDR_N_LP 20
HEVC_NAL_CRA_NUT 21
HEVC_NAL_RADL_N 6
HEVC_NAL_RADL_R 7
HEVC_NAL_RASL_N 8
HEVC_NAL_RASL_R 9
h265nalu头部的解析可参考ffmpeg代码
hevc_parser.c的parse_nal_units函数