- rtp包的转换,从字节流转换成rtp结构体
按标准的rtp协议去解析一个rtp数据包,这是一个初步版本
/*
|* 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
|* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|* |V=2|P|X| CC |M| PT | sequence number |
|* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|* | timestamp |
|* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|* | synchronization source (SSRC) identifier |
|* +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|* | contributing source (CSRC) identifiers |
|* | .... |
|* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|*/
- 版本号(V):2比特,用来标志使用的RTP版本。
- 填充位(P):1比特,如果该位置位,则该RTP包的尾部就包含附加的填充字节。
- 扩展位(X):1比特,如果该位置位的话,RTP固定头部后面就跟有一个扩展头部。
- CSRC计数器(CC):4比特,含有固定头部后面跟着的CSRC的数目。
- 标记位(M):1比特,该位的解释由配置文档(Profile)来承担.
- 载荷类型(PT):7比特,标识了RTP载荷的类型。
- 序列号(SN):16比特,发送方在每发送完一个RTP包后就将该域的值增加1,接收方可以由该域检测包的丢失及恢复包序列。序列号的初始值是随机的。
- 时间戳:32比特,记录了该包中数据的第一个字节的采样时刻。在一次会话开始时,时间戳初始化成一个初始值。即使在没有信号发送时,时间戳的数值也要随时间而不断地增加(时间在流逝嘛)。时间戳是去除抖动和实现同步不可缺少的。
- 同步源标识符(SSRC):32比特,同步源就是指RTP包流的来源。在同一个RTP会话中不能有两个相同的SSRC值。该标识符是随机选取的 RFC1889推荐了MD5随机算法。
- 贡献源列表(CSRC List):0~15项,每项32比特,用来标志对一个RTP混合器产生的新包有贡献的所有RTP包的源。由混合器将这些有贡献的SSRC标识符插入表中。SSRC标识符都被列出来,以便接收端能正确指出交谈双方的身份。