详细的RFC见RFC-618
简介
RTP是流协议,所以传输的H264一定是Nal类型的H264数据,Nal的头中有三个字段,分辨是forbidden_zero, nal_ref, nal_unit_type,内涵不再详细说明。
RTP头格式中与H264相关的字段如下:
- M (Mark), 表示当前包是H264 Nal的最后一个包。
- PT(Payload Type),对于H264该字段应该是通过SDP或则其他信令映射的标示。
- Sequence Number, 序列号,单调递增。
- Timestamp 时间戳,Nalu第一个8bit的采样时间,频率是90Hz。
1. 概览
1.1 打包方式
RFC-6184根据RTP包大小和NAL类型定义了如下数据封装格式
对于H264的数据,RTP打包的时候是如何打包这些数据的呢?
- Signal Nal Unit, 仅包含一个NAL。
- Aggregation Unit, 聚合多个NAL,包括 STAP-A,STAP-B,MTAP16,MTAP24。
- Fragmentation Unit, 如果一个NAL太大,可以将其分片分别进行打包,会使用该中类型。
NAL Unit Type | Packet Type | Packet Type Name | Section |
---|---|---|---|
0 | reserved | - | |
1-23 | NAL unit | Single NAL unit packet | 5.6 |
24 | STAP-A | Single-time aggregation packet | 5.7.1 |
25 | STAP-B | Single-time aggregation packet | 5.7.1 |
26 | MTAP16 | Multi-time aggregation packet | 5.7.2 |
27 | MTAP24 | Multi-time aggregation packet | 5.7.2 |
28 | FU-A | Fragmentation unit | 5.8 |
29 | FU-B | Fragmentation unit | 5.8 |
30-31 | reserved | - |
1.2 打包模式
根据不同的应用场景,定义了三种不同的组包模式,分别如下
- 单NALU模式:使用单个NALU包进行封RTP包的方式,实现此协议的所有应用都需要支持此模式。
- 非交织模式:NAL发送顺序和其生成顺序一致,实现此协议的应用建议支持此模式。
- 交织模式:NAL发送顺序和其生成顺序不一致,此模式是可选的。
几种模式与负载的关系
2 DON
DON即Decoding Order Number,在非交织传输NAL的发送顺序和生成顺序不同,这就意味着接收端收到NAL的顺序与生成顺序也不同,为了能够正常的解码,需要重新对NAL进行排序。因此引入DON的概念,标识解码顺序。
3 包格式
3.1 Signal Nal Unit 包格式
3.2 Aggregation Unit 打包方式
聚合报文是本负载规范的NAL单元聚合方案。引入该方案是为了反映两个关键目标网络中MTU大小的显著差异:有线IP网络(MTU大小通常受以太网MTU大小的限制,大约1500字节)和基于IP或非基于IP(例如,ITU-T H.324/M)的无线通信系统,首选传输单元大小为254字节或更小。为了防止媒体在两个世界之间进行转码,避免不必要的分组开销,提出了一种NAL单元聚合方案。
规范中定义了两种聚合类的报文方式:
- STAP(Single-Time Aggregation Packet)对NALU时间相同的NAL单元进行聚合,具体如下
- STAP-A 不带DON
- STAP-B 带DON
- MTAP(Multi-time aggregation packet)对NALU时间可能不同的NAL单元进行聚合,具体如下
注意, 无论是STAP还是MTAP打包时都应该遵守如下规则:
- RTP时间戳必须设置为所有要聚合的NAL单元的nalu时间中最早的一个。
- NAL单元的头中 Type 必须设置正确,根据上面的表格,如STAP-A 对应24。
- 如果复合的NAL都是可以正确解码的帧,则F为必须设置为0,否则设置为1。
- 如果复合的NAL头的NRI需要取所有NAL单元的最大值。