h.264 NALU详细分析2

承接上集 

h.264 NALU详细分析1_杀神李的博客-CSDN博客

h.264 NALU详细分析2_第1张图片

 

上集我们已经讲到了帧是由一个或者多个NALU组成 并且NALU除了存储帧的信息外 还会存储一些其他的信息 比如 SEI SPS PPS 看到这些名词别急 等会我会一一解释 

⼀个原始的H.264 NALU单元通常由[StartCode] [NALU Header] [NALU Payload]三部分组成,其中 Start Code ⽤于标示这是⼀个NALU 单元的开 始,必须是"00 00 00 01" 或"00 00 01",除此之外基本相当于⼀个NAL header + RBSP;

h.264 NALU详细分析2_第2张图片

 

注意 我上文说的是通常由  [StartCode] [NALU Header] [NALU Payload] 这三部分组成 但是在某些情况下 是没有StartCode这个字段的 初学者不用考虑 继续看文章 下文省略掉StartCode  ps:对于FFmpeg解复⽤后,MP4⽂件读取出来的packet是不带startcode,但TS⽂件读取出来 的packet带了startcode

 NALU结构单元的主体结构如下所示(除去StartCode):

首先我们来看NAL header里的信息 NAL header只占一个字节 

 h.264 NALU详细分析2_第3张图片

 T为负荷数据类型,占5bit 这是表明了这个NALU所携带的信息到底是啥 比如可以是I帧 B帧 P帧 或者其他SEI SPS PPS之类的信息 NALU不一定非要存储帧信息

R为重要性指示位,占2个bit 取00~11,似乎指示这个NALU的重要性,如00的NALU解码器可以丢弃它⽽不 影响图像的回放,0~3,取值越⼤,表示当前NAL越重要,需要优先受到保护。如果当前 NAL是属于参考帧的⽚,或是序列参数集(SPS),或是图像参数集(PPS)这些重要的单位时,本句法元 素必需⼤于0。

发I帧之前,⾄少要发⼀次SPS和PPS。否则无法解析 否则无法解析 否则无法解析  

最后的F为禁⽌位,占1bit forbidden_zero_bit: 在 H.264 规范中规定了这⼀位必须为 0

有些地方看不懂没关系 比如序列参数集 图像参数集啥的 等会我还会解释 

 我们来看一个例子 当NAL header的值为67时 他的头部信息表示什么意思呢

67:

转换为⼆进制:0110 0111

F=0 禁止位 

R=11=3(十进制) 表示有点重要 

T=00111= 7(⼗进制) 7对应的NALU的类型需要去查表 表如下所示 查表可得他是一个SPS NALU单元

T NAL 单元和 RBSP 语法结构的内容
0 未指定
1 ⼀个⾮IDR图像的编码条带 slice_layer_without_partitioning_rbsp ( )
2 编码条带数据分割块A slice_data_partition_a_layer_rbsp( )
3 编码条带数据分割块B slice_data_partition_b_layer_rbsp( )
4 编码条带数据分割块C slice_data_partition_c_layer_rbsp( )
5 IDR图像的编码条带(⽚) slice_layer_without_partitioning_rbsp ( )
6 辅助增强信息 (SEI) sei_rbsp( ) 用的比较多
7 序列参数集 seq_parameter_set_rbsp( ) 也就是SPS
8 图像参数集 pic_parameter_set_rbsp( ) 也就是PPS
9 访问单元分隔符 access_unit_delimiter_rbsp( )
10 序列结尾 end_of_seq_rbsp( )
11 流结尾 end_of_stream_rbsp( )
12 填充数据 filler_data_rbsp( )
13 序列参数集扩展seq_parameter_set_extension_rbsp( )
14-18 保留
19 未分割的辅助编码图像的编码条带 slice_layer_without_partitioning_rbsp ( )
20-23 保留
24-31 未指定

SPS即Sequence Paramater Set,又称作序列参数集。SPS中保存了一组编码视频序列(Coded video sequence)的全局参数。所谓的编码视频序列即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列。而每一帧的编码后数据所依赖的参数保存于图像参数集中。一般情况SPS和PPS的NAL Unit通常位于整个码流的起始位置。但在某些特殊情况下,在码流中间也可能出现这两种结构,主要原因可能为:

1.解码器需要在码流中间开始解码;

2.编码器在编码的过程中改变了码流的参数(如图像分辨率等);

总而言之 这两个东西保存了一些全局参数和配置信息 必须要先有SPS和PPS才能解析接下来的I帧 关于SPS和PPS详细解析 以后我还会出文章 同理 这两个东西也不是初学者应该去深入了解的 

 接下来我们还会去分析NAL header后的RBSP  Raw Byte Sequence Payload  原始数据字节流

接下来的文章就请看NALU详细分析3了 

 

 

 

你可能感兴趣的:(音视频,c++,音视频)