RTCP协议

发布于:2024-09-18 ⋅ 阅读:(68) ⋅ 点赞:(0)

一、常用RTCP数据包类型

类型 缩写表示 解释
200 SR(Sender Report) 发送端报告
201 RR(Receiver Report) 接收端报告
202 SDES(Source Description Items) 源点描述
203 BYE 结束传输
204 APP 特定应用

    (一般,推流段发送SR,收流端回应RR与SEDS。

        通常,200单独使用,201与202配合使用。)

1.1 SR

数据结构

typedef struct SR {
	/* byte0 */
	uint8_t rc : 5;//接收报告计数器,5位。
	uint8_t P : 1;//填充位,1位。如果为1,则RTCP报文尾部添加 填充字节
	uint8_t version : 2;//RTCP版本号,2位。

	/* byte1 */
	uint8_t pt;//包类型,8位。SR包为200

	/* byte2-3 */
	uint16_t len;//RTCP报文长度,16位。包括填充内容

	/* byte4-7 */
	uint32_t ssrc_of_sender;//对应的RTP包的SSRC,32位。

	/* byte8-15 */
	uint64_t NTS;//发送报告的实际时间,64位。

	/* byte16-19 */
	uint64_t RTS;//数据采样时间,32位

	/* byte20-23 */
	uint32_t SPC;//从 开始发送包 至 发送此SR包,发送的RTP包数量
	//当发送者更改SSRC时,这个域会清零

	/* byte24-27 */
	uint32_t SOC;//从 开始发送包 至 发送此SR包,发送的净荷字节总数(不包含头部与填充)
	//当发送者更改SSRC时,这个域会清零

	//-----------------------报告块(开始)-----------------------
	//	接下来每24个字节为一块报告块,用于报告每个接收源的状态
	//	一个SR包可以有多个报告块
	/* byte0-3 */
	uint32_t ssrc_source;//第一个报告块 接收端 的SSRC,32位
	/* byte4-7 */
	uint32_t C : 24;//RTP包的丢包数量
	uint32_t F : 8;//RTP包的丢包率,占8位
	
	/* byte8-11 */
	uint32_t EHSN;//扩展最大序列号,32位,接收到的RTP包的最大序列号

	/* byte12-15 */
	uint32_t J;//接收抖动,32位,RTP包接收的方差估计

	/* byte16-19 */
	uint32_t LSR;//最后接收端收到的SR包的NTP的低32位
	//如果之前还没有收到SR包,则此域为0

	/* byte20-23 */
	uint32_t DLSR;//上一次发送SR包到现在的时间间隔
	//-----------------------报告块(结束)-----------------------

	/* ......这里还可以有n个报告块...... */

	/* 扩展字段(取决于P位) */
} SR;

1.2 RR

        RR与SR最大的区别就是少了20个字节的发送者信息,其余相同。

数据结构

typedef struct RR {
	uint8_t RC : 5;//报告块计数器
	uint8_t P : 1;//扩展位
	uint8_t version : 2;//RTCP版本号

	uint8_t PT;//包类型,RR为201

	uint16_t len;//包长度

	uint32_t ssrc_of_sender;//发送者的SSRC

	//-----------------------报告块(开始)-----------------------
	//	接下来每24个字节为一块报告块,用于报告每个接收源的状态
	//	一个RR包可以有多个报告块
	/* byte0-3 */
	uint32_t ssrc_source;//第一个报告块 接收端 的SSRC,32位
	/* byte4-7 */
	uint32_t C : 24;//RTP包的丢包数量
	uint32_t F : 8;//RTP包的丢包率,占8位

	/* byte8-11 */
	uint32_t EHSN;//扩展最大序列号,32位,接收到的RTP包的最大序列号

	/* byte12-15 */
	uint32_t J;//接收抖动,32位,RTP包接收的方差估计

	/* byte16-19 */
	uint32_t LSR;//最后接收端收到的SR包的NTP的低32位
	//如果之前还没有收到SR包,则此域为0

	/* byte20-23 */
	uint32_t DLSR;//上一次发送SR包到现在的时间间隔
	//-----------------------报告块(结束)-----------------------

	/* ......这里还可以有n个报告块...... */

	/* 扩展字段(取决于P位) */
} RR;

1.3 SDES

        SDES用于描述 “源”

数据结构

typedef struct SDES {
	uint8_t RC : 5;//源描述块计数器
	uint8_t P : 1;//扩展位
	uint8_t version : 2;//RTCP版本号

	uint8_t PT;//包类型,SDES为202

	uint16_t len;//包长度

	//-----------------------源描述块(开始)-----------------------
	//	一个SDES包可以有多个描述块
	uint8_t item_type;//源类型,8位
	uint8_t item_len;//源长度,8位
	//???   item_data;//源数据,长度根据item_len而定

	//-----------------------源描述块(结束)-----------------------

	/* ......这里还可以有n个源描述块...... */
} SDES;

常用源类型

CNAME 唯一标识
NAME 源名
EMAIL 邮箱
PHONE 电话
LOC 位置
TOOL 所用工具
NOTE 备注

1.4 BYE

数据结构

typedef struct BYE {
	uint8_t RC : 5;//源描述块计数器
	uint8_t P : 1;//扩展位
	uint8_t version : 2;//RTCP版本号

	uint8_t PT;//包类型,BYE为203

	uint16_t len;//包长度

	uint32_t ssrc_of_sender;//发送BYE的发送端的SSRC
	/*这里还可以有多个ssrc_of_sender*/

	/*以下为可选项*/
	//???变长 reason; //断开连接的原因
} BYE;