H.264 视频 RTP 负载格式(RFC3984)

RFC3984的核心主要涉及到H264的分包,组合包,单个Nalu包

因为以太网卡每次传输的最大数据越在1500字节左右,而一个H264帧如果超过了这个大小,就会存在数据丢失的情况,从而导致图片的质量没有办法得到保证。为此RFC3984应用而生。

NALU包,就是直接的RTP(12字节+扩展数据(可选))+NALU data

下面着重讲解下RFC3984中的FU组合拆包:

FU组合拆包主要运用在I帧非常大的情况下,发送格式如下:

RTP+FU TYPE+FU HEADER+NALU DATA

那么怎么知道当前的包是FU-A数据报呢,如果是FU-A组合包,怎么知道是包的开始,怎么知道是包的结束呢?(这个是分析问题的核心)

FU-A由1字节的分片单元指示,1字节的分片单元头,和分片单元荷载组成。(详细结构见下面的2.3 Fragmentation Units)

当你接受了一段RTP+RFC3984+H264的数据包的时候,判断第13个字节的后5位的值,如果是1-23的话,那么就说明这个是单片NALU的数据包,如果是28的话,就说明是要给FU-A组合包

int type = buf[Index]&0x1F;//把13个字节与上0x1F就是type的值了

然后继续分析第14个字节,第14个字节是FU的Header,里面的位直接的告诉了你,数据包的开头和结尾,S=1 E=0的情况下就是开头,后面的直接判断E=1后就是片得结尾了: 

80 E0 00 00 00 45 4B D8 20 00 8B 40 27 42 E0 16 8D 68 0A DA 6C 80 00 00 03 00 80 00 00 1E 07 9c F5

这个数据的结构是RTP+SPS NALU,是一个单个NALU类型。

RFC3984中文:http://blog.csdn.net/leesphone/article/details/5576247

以上摘自:http://www.shouyanwang.org/thread-214-1-1.html

1. 网络抽象层单元类型 (NALU)

NALU 头由一个字节组成, 它的语法如下:

      +---------------+
      |0|1|2|3|4|5|6|7|
      +-+-+-+-+-+-+-+-+
      |F|NRI|  Type   |
      +---------------+

F: 1 个比特.
  forbidden_zero_bit. 在 H.264 规范中规定了这一位必须为 0.

NRI: 2 个比特.
  nal_ref_idc. 取 00 ~ 11, 似乎指示这个 NALU 的重要性, 如 00 的 NALU 解码器可以丢弃它而不影响图像的回放. 不过一般情况下不太关心这个属性.

Type: 5 个比特.
  nal_unit_type. 这个 NALU 单元的类型. 简述如下:

  0     没有定义
  1-23  NAL单元  单个 NAL 单元包.
  24    STAP-A   单一时间的组合包
  24    STAP-B   单一时间的组合包
  26    MTAP16   多个时间的组合包
  27    MTAP24   多个时间的组合包
  28    FU-A     分片的单元
  29    FU-B     分片的单元
  30-31 没有定义

2. 打包模式

  下面是 RFC 3550 中规定的 RTP 头的结构.

       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |V=2|P|X|  CC   |M|     PT      |       sequence number         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                           timestamp                           |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |           synchronization source (SSRC) identifier            |
      +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
      |            contributing source (CSRC) identifiers             |
      |                             ....                              |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

     每一个 RTP 包中都有前 12 个字节,而 CSRC identifier 列表仅在 Mixer 插入时才有。

开始12个八位组(字节)出现在每个RTP包中,而CSRC标识列表仅出现在混合器插入时。各字段的含义如下:

① 版本(v):2位,标识RTP版本。

② 填充标识(P):1位,如设置填充位,在包尾将包含附加填充字,它不属有效载荷。填充的最后一个八位组包含应该忽略的八位组。某些加密算法需要固定大小的填充字,或为在低层协议数据单元中携带几个RTP包。

③ 扩展(x):1位,如设置扩展位,固定头后跟一个头扩展。

④ CSRC计数(cc):4位,CSRC计数包括紧接在固定头后CSRC标识符个数。

⑤ 标记(M):1位,标记解释由设置定义,目的在于允许重要事件在包流中标记出来。设置可定义其他标识位,或通过改变位数量来指定没有标记位。

⑥ 载荷类型(PT,Payload Type):7位,标识RTP载荷格式并决定其解释。设置指定载荷类型代码对载荷格式的静态映射(audio, video, image, texte, html等)。其他载荷类型代码可通过非RTP途径动态定义。对音频和视频的缺省映射初集在相关设置中指出。将来可进一步扩展。

⑦ 序列号(Sequence Number):16位,序列号随每个RTP数据包而增加1,由接收者用来探测包损失,而恢复包序列。序列号初值是随机的,使对加密的文本攻击更加困难。

⑧ 时间戳(timestamp):32位,时间戳反映RTP数据包中第一个八位组的采样时刻,采样时刻必须从单调、线性增加的时钟导出,以允许同步与抖动计算。时钟必须有足够分辨率,满足所需同步和测定包到达抖动精度。时钟频率依赖携带数据的格式,并在设置中静态指定。如RTP包周期产生,采用采样所用的时钟确定名义采样时刻,而不是从系统读出。如同序列号,时间戳的初始值是随机的。如几个连续RTP包在逻辑上一次产生它们就有着相同的时间戳,属于同一视频帧。如数据不是以采集顺序发送,像MPEG插入的视频帧,连续RTP包包含的时标可能不是单调的。

⑨ 同步源标识符(SSRC,Synchronization Source Identifier):32位,SSRC段标识同步源。此标识不是随机选择的,目的在于使同一RTP包连接中设有两个同步源有相同的SSRC标识。尽管多个源选择同一个标识的概率很低,所有RTP实现都必须探测并解决冲突。如源改变源传输地址,也必须选择一个新SSRC标识以避免插入成环行源。

⑩ CSRC列表:0到15项,每项32位。CSRC列表表示包内包含的对载荷起作用的源。标识数量由CC段给出。如超过15个作用源,也仅标识15个。CSRC标识由混合器插入,用作源的SSRC标识。

  H.264 Payload 格式定义了三种不同的基本的负载(Payload)结构. 接收端可能通过 RTP Payload 
  的第一个字节来识别它们. 这一个字节类似 NALU 头的格式, 而这个头结构的 NAL 单元类型字段
  则指出了代表的是哪一种结构,

  这个字节的结构如下, 可以看出它和 H.264 的 NALU 头结构是一样的.
      +---------------+
      |0|1|2|3|4|5|6|7|
      +-+-+-+-+-+-+-+-+
      |F|NRI|  Type   |
      +---------------+
  字段 Type: 这个 RTP payload 中 NAL 单元的类型. 这个字段和 H.264 中类型字段的区别是, 当 type
  的值为 24 ~ 31 表示这是一个特别格式的 NAL 单元, 而 H.264 中, 只取 1~23 是有效的值.
   
  24    STAP-A   单一时间的组合包
  24    STAP-B   单一时间的组合包
  26    MTAP16   多个时间的组合包
  27    MTAP24   多个时间的组合包
  28    FU-A     分片的单元
  29    FU-B     分片的单元
  30-31 没有定义

  可能的结构类型分别有:

  1. 单一 NAL 单元模式
     即一个 RTP 包仅由一个完整的 NALU 组成. 这种情况下 RTP NAL 头类型字段和原始的 H.264的 NALU 头类型字段是一样的.

  2. 组合封包模式
    即可能是由多个 NAL 单元组成一个 RTP 包. 分别有4种组合方式: STAP-A, STAP-B, MTAP16, MTAP24.
  那么这里的类型值分别是 24, 25, 26 以及 27.

  3. 分片封包模式
    用于把一个 NALU 单元封装成多个 RTP 包. 存在两种类型 FU-A 和 FU-B. 类型值分别是 28 和 29.

2.1 单一 NAL 单元模式

  对于 NALU 的长度小于 MTU 大小的包, 一般采用单一 NAL 单元模式.
  对于一个原始的 H.264 NALU 单元常由 [Start Code] [NALU Header] [NALU Payload]三部分组成, 其中 Start Code 用于标示这是一个 NALU 单元的开始, 必须是"00 00 00 01" 或 "00 00 01",NALU 头仅一个字节, 其后都是 NALU 单元内容.

  打包时去除 "00 00 01" 或 "00 00 00 01" 的开始码, 把其他数据封包的 RTP 包即可.

       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |F|NRI|  type   |                                               |
      +-+-+-+-+-+-+-+-+                                               |
      |                                                               |
      |               Bytes 2..n of a Single NAL unit                 |
      |                                                               |
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                               :...OPTIONAL RTP padding        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

  如有一个 H.264 的 NALU 是这样的:

  [00 00 00 01 67 42 A0 1E 23 56 0E 2F ... ]

  这是一个序列参数集 NAL 单元. [00 00 00 01] 是四个字节的开始码, 67 是 NALU 头, 42 开始的数据是 NALU 内容.

  封装成 RTP 包将如下:

  [ RTP Header ] [ 67 42 A0 1E 23 56 0E 2F ]

  即只要去掉 4 个字节的开始码就可以了.

2.2 组合封包模式

  其次, 当 NALU 的长度特别小时, 可以把几个 NALU 单元封在一个 RTP 包中.

       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                          RTP Header                           |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |STAP-A NAL HDR |         NALU 1 Size           | NALU 1 HDR    |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                         NALU 1 Data                           |
      :                                                               :
      +               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |               | NALU 2 Size                   | NALU 2 HDR    |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                         NALU 2 Data                           |
      :                                                               :
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                               :...OPTIONAL RTP padding        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

2.3 Fragmentation Units (FUs).

  而当 NALU 的长度超过 MTU 时, 就必须对 NALU 单元进行分片封包. 也称为 Fragmentation Units (FUs).
         0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      | FU indicator  |   FU header   |                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
      |                                                               |
      |                         FU payload                            |
      |                                                               |
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                               :...OPTIONAL RTP padding        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      Figure 14.  RTP payload format for FU-A

   The FU indicator octet has the following format:

      +---------------+
      |0|1|2|3|4|5|6|7|
      +-+-+-+-+-+-+-+-+
      |F|NRI|  Type   |
      +---------------+

   The FU header has the following format:

      +---------------+
      |0|1|2|3|4|5|6|7|
      +-+-+-+-+-+-+-+-+
      |S|E|R|  Type   |
      +---------------+

   S: 1 bit

   开始位:当设置成1,指示分片NAL单元的开始。当跟随的FU荷载不是分片NAL单元荷载的开始,开始位设为0。

   E: 1 bit

   结束位:当设置成1, 指示分片NAL单元的结束,即, 荷载的最后字节也是分片NAL单元的最后一个字节。当跟随的FU荷载不是分片NAL单元的最后分片,结束位设置为0。

   R: 1 bit

   保留位:必须设置为0,接收者必须忽略该位。

   Type: 5 bits

   NAL单元荷载类型定义

3. SDP 参数

  下面描述了如何在 SDP 中表示一个 H.264 流:

  . "m=" 行中的媒体名必须是 "video"
  . "a=rtpmap" 行中的编码名称必须是 "H264".
  . "a=rtpmap" 行中的时钟频率必须是 90000.
  . 其他参数都包括在 "a=fmtp" 行中.

  如:

  m=video 49170 RTP/AVP 98
  a=rtpmap:98 H264/90000
  a=fmtp:98 profile-level-id=42A01E; sprop-parameter-sets=Z0IACpZTBYmI,aMljiA==

  下面介绍一些常用的参数.

3.1 packetization-mode:表示支持的封包模式. 
  当 packetization-mode 的值为 0 时或不存在时, 必须使用单一 NALU 单元模式.
  当 packetization-mode 的值为 1 时必须使用非交错(non-interleaved)封包模式.
  当 packetization-mode 的值为 2 时必须使用交错(interleaved)封包模式.
  这个参数不可以取其他的值.

3.2 sprop-parameter-sets:
  这个参数可以用于传输 H.264 的序列参数集和图像参数 NAL 单元. 这个参数的值采用 Base64 进行编码. 不同的参数集间用","号隔开.
3.3 profile-level-id:
  这个参数用于指示 H.264 流的 profile 类型和级别. 由 Base16(十六进制) 表示的 3 个字节. 第一个字节表示 H.264 的 Profile 类型, 第三个字节表示 H.264 的 Profile 级别:

3.4 max-mbps:
  这个参数的值是一个整型, 指出了每一秒最大的宏块处理速度.

转自:http://jl9045.blog.163.com/blog/static/2162067220091252191252/

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 介绍 ........................................ 3 1.1. H.264 Codec ............................... 3 1.2. 参数集概念 ........................... 4 1.3. 网络抽象层单元类型............................ 5 2. 约定 ......................................... 6 3. 范围 ............................................... 6 4. 定义和缩写 ................................. 6 4.1. 定义 ..................................... 6 5. RTP 荷载格式 ..................................... 8 5.1. RTP 头的使用.................................. 8 5.2. RTP荷载格式的公共使用 .............. 11 5.3. NAL单言字节的用法 ............................ 12 5.4. 打方式 .................................... 14 5.5. 解码顺序号 (DON)............................. 15 5.6. 单个NAL单元................................. 18 5.7. 复合 ................................. 18 5.8. 分片单元 (FUs) ............................... 27 6. 分规则 ................................... 31 6.1. 公共分规则 .............................. 31 6.2. 单个NAL单元方式............................... 32 6.3. 非交错方式 ............................... 32 6.4. 交错方式 ............................... 33 7. 打过程 (信息) ........................ 33 7.1. 单NAL单元和非交错方式 ................ 33 7.2. 交错方式 ............................... 34 7.3. 附加的打原则 .................. 36 8. 荷载格式参数 ................................... 37 8.1. MIME 注册 .................................... 37 8.2. SDP 参数...................................... 52 8.3. 例子.......................................... 58 8.4. 参数集考虑 ............................ 60 9. 安全考虑 ....................................... 62 10. 拥塞控制............................................ 63 11. IANA考虑 ........................................... 64 12. 信息化附录: 应用例子 .................... 65 12.1. 根据ITU-T H.241 附录A的视频电话............... 65 12.2. 没有分片数据分区,没有NAL单元聚合的视频电话... 65 12.3. 使用NAL单元聚合交错打视频电话............. 66 12.4. 使用数据分区的视频电话 .................. 66 12.5. 使用FU和向前纠错的视频电话和流................ 67 12.6. 低位率流 .................................. 69 12.7. 视频流中健壮的调度 ............. 70 13. 信息化附录:解码顺序号的原理 ..... 71 13.1. 介绍.......................................... 71 13.2. 多图像片断交错的例子 ............. 71 13.3. 健壮调度的例子 .................... 73 13.4. 冗余编码片断健壮传输调度的例子................ 77 13.5. 其它设计可能的提醒 ................... 77 14. 致谢 .............................................. 78 15. 参考 ............................................... 78 15.1. 标准化参考.................................... 78 15.2. 参考性的参考.................................. 79 作者地址................................................ 81 完全版权声明 .......................................... 83

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值