H264Nalu头部分析一 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。 inttype=code0x1fnalutype
NALU单元的类型nal_unit_type .1到12用于H.264,24到31用于h.264之外的其他APP应用,简要描述:0没有定义如下
1-23 NAL单元1个NAL单元封装
1未分割的非IDR影像分割
2个分区
三个分区b
四块分区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=sequenceparamatersetSPs存储一组编码视频序列的全局参数。 所谓的编码视频序列是由将原始视频的一帧一帧的像素数据编码后的结构构成的序列。 每个帧的编码数据所依赖的参数保存在图像参数集中。 SPS和PPS的NAL Unit通常位于整个码流的开头。 但是,在某些特殊情况下,这两种结构也可能出现在码流的中间。 主要原因如下。
1 )解码器需要在码流的中间开始解码;
2 )编码器在编码过程中更改了码流的参数(如图像分辨率)。
图像参数集SPS–7
除了序列参数集合SPS之外,H.264的另一个重要参数集合是图像参数集合pictureparamaterset(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函数
H265Nalu头部分析
一NALU头部分析
gn:center;”>
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
二 NALU type 解析 nalu type的计算方式
在每一帧的起始码(00 00 00 01)之后取到nalu头部code 两个字节
用该公式计算nalutype :int type = (code & 0x7E)>>1;
Nalu type
val nal
non-vcl nalu
常用nalu type
语义为视频参数集 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
SPS PPS和VPS的关系
三 参考代码
h265nalu头部的解析可参考ffmpeg代码
hevc_parser.c的parse_nal_units函数