1. 单一NALU模式
单一NALU模式
适用于小于MTU(最大传输单元)的NALU。这种模式下,一个RTP包包含一个完整的NALU。RTP头部之后紧跟着NALU头和NALU数据。
封装格式:
RTP头 | NALU头 | NALU数据
这种方式简单直接,但仅适用于较小的NALU。
2. 组合帧封装模式
组合帧封装模式适用于多个小NALU的组合传输。常用的类型是STAP-A(单时间聚合包)。这种模式下,一个RTP包可以包含多个NALU,适合传输多个小NALU以提高传输效率。
STAP-A封装格式:
- RTP头:包含标识、序列号、时间戳等信息。
- STAP-A头:表示这是一个STAP-A包。
- NALU头和数据:包含多个NALU,每个NALU都有自己的头和数据。
RTP头 | STAP-A头 | NALU1头 | NALU1数据 | NALU2头 | NALU2数据 | ...
这种方式在传输多个小NALU时非常高效。
3. 分片封装模式
分片封装模式适用于大于MTU的NALU。常用的类型是FU-A(分片单元A)。这种模式下,一个NALU被分片成多个RTP包传输。
封装格式:
RTP头 | FU Indicator | FU Header | NALU分片数据
- FU Indicator:包含NALU头的前三位(F、NRI)和类型字段(28表示FU-A)。
- FU Header:包含分片的开始(S)、结束(E)和NALU类型字段。
- S(Start):表示这是一个NALU的起始片段。如果S=1,表示这是该NALU的第一个片段。
- E(End):表示这是一个NALU的结束片段。如果E=1,表示这是该NALU的最后一个片段。
- R(Reserved):保留位,固定为0。
- Type:表示NALU的类型,与NALU头中的类型字段相同。
假设我们有一个NALU需要分成四个片段传输,那么每个片段的FU Header如下:
- 第一个片段:S=1, E=0, R=0, Type=NALU类型
- 第二个片段:S=0, E=0, R=0, Type=NALU类型
- 第三个片段:S=0, E=0, R=0, Type=NALU类型
- 最后片段:S=0, E=1, R=0, Type=NALU类型
此时第二第三片段FU Header是完全一致的,它们的顺序可以通过RTP序列号、时间戳、接收顺序区分。
通过这种方式,接收端可以根据S和E字段来重组原始的NALU。这种方式确保了大NALU可以被分片并通过网络传输。
总结
- 单一NALU模式:适用于小NALU,简单直接。
- 组合帧封装模式:适用于多个小NALU的组合,提高传输效率。
- 分片封装模式:适用于大NALU,通过分片传输。
RTP头(RTP Header)
RTP头是RTP数据包的一个组成部分,包含了多个字段,用于描述数据包的各种信息。RTP头的结构如下:
- 版本号(V):2位,表示RTP协议的版本。
- 填充标志(P):1位,如果P=1,则在报文尾部有填充字节。
- 扩展标志(X):1位,如果X=1,则在RTP头后有扩展头。
- CSRC计数器(CC):4位,表示CSRC标识符的个数。
- 标记(M):1位,用于标记重要事件。
- 有效载荷类型(PT):7位,表示RTP报文中有效载荷的类型。
- 序列号(Sequence Number):16位,用于标识发送的RTP报文的序列号。
- 时间戳(Timestamp):32位,表示数据包的采样时刻。
- 同步源标识符(SSRC):32位,用于标识同步源。
- 特约信源标识符(CSRC):每个CSRC占32位,可以有0-15个。
RTP序列号(RTP Sequence Number)
RTP序列号是RTP头中的一个字段,占16位。它用于标识发送的RTP报文的顺序,每发送一个报文,序列号会递增1。接收端可以通过序列号来检测报文丢失情况,并重新排序报文以恢复数据