RTCP协议
一、常用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 | 源名 |
邮箱 | |
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;