https://blog.csdn.net/MACMACip/article/details/106569065
【版权申明】转载请附上出处链接
1
rtp中的组合封包以及分片封包
RTP的PayLoad部分:
Rtp负载第一个字节的结构如下,它和H.264的NALU头结构完全一致。
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
1
2
3
4
5
需要注意的是,其中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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1
2
3
4
5
6
7
8
9
10
11
组合封包模式:
当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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
分片封包模式:
当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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1
2
3
4
5
6
7
8
9
10
11
与单一封包不一样的是,|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 |
+---------------+
1
2
3
4
5
S,为1表示分片的开始;
E,为1表示分片的结束;
R,保留位;
Type就是NALU头中的Type,取1-23值。
官方文档地址:
rfc3550
rfc1889
RFC1889中文版
————————————————
版权声明:本文为CSDN博主「安河桥」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/MACMACip/article/details/106569065