一、H264的nalu的组成
- start code [00 00 00 01]
- nalu header
- nalu payload
nalu header
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
F(forbidden_zero_bit)H.264规范中规定必须为0
NRI(nal_ref_idc)00~11,数值越大表示数据越重要。关键帧、sps、pps都不能为00。
Type 1-12由H.264使用,13-23保留,24-31被其它协议使用,比如rtp分片时使用。
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 没有定义
二、通过rtp发送H.264数据
通常通过rtp发送H.264数据分三种类型
- 单包发送
- 组包发送
- 分片发送
由于视频数据通常都比较大,所以多数情况下需要进行分片发送。分片后的数据按照下面的格式组织。
fu indicator(8) + fu header(8) + data
fu indicator
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
|F|NRI|上面都已经介绍过了这里不再解释了,我们可以直接拷贝nalu中的|F|NRI|。
Type的值取28(注意:这里采用FU-A分片类型处理)
fu header
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|S|E|R| Type |
+---------------+
|S|为1时表示nalu分片发送的开始,这时|E|必须为0
|E|为1是表示nalu分片发送的结束,这时|S|必须为0
|R|为保留位,设置为0
Type拷贝nalu头中的Type值。
sps和pps的发送
sps的nalu类型是7,pps的nalu类型是8.这两个数据是解码器所必须的,所以在rtp直播中,app需要间断性的发送sps和pps,这样才能保证接收端能够正常解码视频。(注意:间隔发送的时候保证发送sps和pps后紧跟着的是I frame)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。