【版权申明】转载请附上出处链接
rtp中的组合封包以及分片封包
RTP的PayLoad部分:
Rtp负载第一个字节的结构如下,它和H.264的NALU头结构完全一致。
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
需要注意的是,其中Type表示媒体类型。当为1~23时,与NALU中的Type是一致的定义。除此以外还可取以下值:
序号 | 类型 | 解释 |
---|---|---|
24 | STAP-A | 单一时间的组合包 |
25 | STAP-B | 单一时间的组合包 |
26 | MTAP16 | 多个时间的组合包 |
27 | MTAP24 | 多个时间的组合包 |
28 | FU-A | 分片的单元 |
29 | FU-B | 分片的单元 |
单一NALU模式:
对于NALU的长度小于MTU(1500)的包,一般采用单一NALU模式。即一个rtp包就是一个NALU,不需要分成多个rtp包发送到客户端并重新组合在一起。
对于一个原始的 H.264 NALU常由[Start Code / NALU Size] [NALU Header] [NALU Payload]三部分组成。
- 其中[Start Code]用于标示这是一个NALU 单元的开始,必须是0x00000001或0x000001;
- [NALU Size]常见于h264原始码流/packet-h264码流中,用于告诉我们该NALU多大。与[Start Code]只存在其一;
- [NALU Header]仅一个字节,其后都是NALU内容的开始。
在rtp单一NALU传输模式中,[NALU Header]和[NALU Payload]将会被传输,且[NALU Header]将会被当成上面的(Rtp负载第一个字节)|F|NRI|type|被解析,如下所示:
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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
组合封包模式:
当NALU的长度特别小时,可以把几个NALU封在一个RTP包中。
下面的是STAP-A模式,如果是STAP-B的话会多加入一个DON域。
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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
分片封包模式:
当NALU的长度超过MTU时,就必须对NALU进行分片封包。也称为Fragmentation Units(FUs)。这里使用FU-A。
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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
与单一封包不一样的是,|F|NRI|type|变成了|FU indicator|FU header|。其实,|FU indicator|就是|F|NRI|type|,但是额外增加了|FU header|用于标识当前分片的状态,如下所示:
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|S|E|R| Type |
+---------------+
- S,为1表示分片的开始;
- E,为1表示分片的结束;
- R,保留位;
- Type就是NALU头中的Type,取1-23值。
官方文档地址: