h.264 NALU详细分析2

承接上集 

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

 

上集我们已经讲到了帧是由一个或者多个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;

 

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

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

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

 

 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单元

TNAL 单元和 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( )
5IDR图像的编码条带(⽚) 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了 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杀神李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值