H.264数据通过rtp分片发送

一、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数据分三种类型

  1. 单包发送
  2. 组包发送
  3. 分片发送

由于视频数据通常都比较大,所以多数情况下需要进行分片发送。分片后的数据按照下面的格式组织。

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)

你可能感兴趣的:(android,rtp,h264,fragment)