RTP报文格式
12字节头部 + payload
12字节头部
struct rtp_hdr { #ifdef BIGENDIAN unsigned char v:2; /* protocol version */ unsigned char p:1; /* padding flag */ unsigned char x:1; /* header extension flag */ unsigned char cc:4; /* CSRC count */ unsigned char m:1; /* marker bit */ unsigned char pt:7; /* payload type */ #else unsigned char cc:4; unsigned char x:1; unsigned char p:1; unsigned char v:2; unsigned char pt:7; unsigned char m:1; #endif unsigned short seq; /* sequence number */ unsigned int ts; /* timestamp */ unsigned int ssrc; /* synchronization source */ #if 0 unsigned int csrc[2]; /* optional CSRC list */ #endif };
*版本号(V):2比特,用来标志使用的RTP版本。
*填充位(P):1比特,如果该位置位,则该RTP包的尾部就包含附加的填充字节。
*扩展位(X):1比特,如果该位置位的话,RTP固定头部后面就跟有一个扩展头部。
*CSRC计数器(CC):4比特,含有固定头部后面跟着的CSRC的数目。
*标记位(M):1比特,当RTP负载是一个完整的NALU时M 位置为 1;当前RTP 数据包为一个NALU 的最后的那个分片时(NALU 的分片在后面讲述),M位置 1。其余情况下M位保持为 0。
*载荷类型(PT):7比特,标识了RTP载荷的类型。
*序列号(SN):16比特,发送方在每发送完一个RTP包后就将该域的值增加1,接收方可以由该域检测包的丢失及恢复包序列。序列号的初始值是随机的。
*时间戳:32比特,记录了该包中数据的第一个字节的采样时刻。在一次会话开始时,时间戳初始化成一个初始值。即使在没有信号发送时,时间戳的数值也要随时间而不断地增加(时间在流逝嘛)。时间戳是去除抖动和实现同步不可缺少的。
*同步源标识符(SSRC):32比特,同步源就是指RTP包流的来源。在同一个RTP会话中不能有两个相同的SSRC值。该标识符是随机选取的 RFC1889推荐了MD5随机算法。
*贡献源列表(CSRC List):0~15项,每项32比特,用来标志对一个RTP混合器产生的新包有贡献的所有RTP包的源。由混合器将这些有贡献的SSRC标识符插入表中。SSRC标识符都被列出来,以便接收端能正确指出交谈双方的身份。
payload
payload 的组成和封包模式有关
单一封包模式
对于 NALU 的长度小于 MTU 大小的包, 一般采用单一 NAL 单元模式。对于一个原始的 H.264 NALU 单元打包时去除 "00 00 01" 或 "00 00 00 01" 的开始码, 把其他数据封包的 RTP 包即可。
如有一个 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 个字节的开始码就可以了。
组合封包模式
不常用,不介绍
分片封包模式
当NALU的长度超过MTU时,就必须对NALU单元进行分片封包,也称为Fragmentation Units(FUs)。payload 的组成如下,1字节 FU indicator,1字节 FU header,若干字节 FU payload
F、NRI 和 NALU 的头的 F、NRI 一样
S:标记该分片打包的第一个RTP包
E:该分片打包的最后一个RTP包
Type:NALU的头的Type
FU payload 是去掉起始码和头部的NALU
标签:协议,char,00,比特,unsigned,---,RTP,NALU From: https://www.cnblogs.com/god-of-death/p/18548383