支持RTP/RTCP的服务器和客户端

一、简介

RTCP不仅仅用于RTSP服务器,还会用在国标GB28181流媒体服务器,WebRTC,.云游戏的一些流媒体服务器,包括一些自定义信令协议的服务器都有可能采用RTCP协议。

RTCP是和 RTP 可以选择TCP传输或者UDP传输,当使用UDP传输时,RTP和RTCP采用不同的连接,用不同的端口号进传输。使用TCP传输时,复用同一个连接。

二、RTCP功能

服务质量的监视与反馈

举例:直播推流时,推流端不停地向服务端推送RTP包时,每隔一段时间还会发送RTCP信息包,RTCP信息包内容包含:截至到当前已经发送的RTP包的数目,RTP包对应字节流的数据,RTP的最新时间戳,NTP时间戳(用于同步)等。接收端在不停接收RTP视频流和音频流信息的同时,还接收了推流端RTCP信息包。接收后,对RTP和RTCP包的信息进行总结分析。

比如接收端周期性地接收了一个RTCP信息包,RTCP信息包反馈已发送1000个RTP包,但只接收到900个RTP包,这就存在RTP包丢失。接收端将丢包情况反馈给推流端,推流端在优先视频流传输的情况下,降低视频的码率。

三、RTCP包的类型

  200  SR (Sender Report):包含发送者的统计信息,如 RTP 包的时间戳、NTP 时间戳和发送的                                                RTP 包数量。

  201   RR (Receiver Report):提供接收者的统计信息,包括接收到的 RTP 包数量、丢包率、抖                                                    动等。

  202  SDES (Source Description):提供源描述信息,如源名称、电子邮件地址、电话等。

  203  BYE:通知其他参与者某个源已经离开会话。

  204  APP (Application-defined):允许应用程序定义自己的 RTCP 消息,以传递特定的信息或                                                            控制数据。

201和202可以一起使用,200单独使用

四、代码分析

收流端

【收流端不断接收数据,每隔一段时间向推流端发送一次接收数据,整体逻辑不会被阻塞】

启动rtpServer的start函数,实现TCP的server描述符监听,阻塞式的TCPserver。之后进行阻塞监听,接收到新连接后,进行接收recv,将接收到的数据放recvBuf里。每隔1000毫秒向客户端(推流端)发送一次RTCP RR数据包。

使用TCP传输RTP、RTCP时,在包前加4个字节,第一个字节是分隔符$,第二个字节是通道编号。(RTP是偶数,RTCP是偶数+1),第三四个字节表示当前包的具体长度。

将RTCP包封装放到缓冲区(从缓冲区第5个字节开始存储)

计算接受速率

recvBuf每次接收到的数据放到parseRecvData函数里,这个函数:recvBuf不停放到cache里,根据cache缓冲容器进行遍历处理,为了从接收数据里区分出来是RTP包还是RTCP包。

        如果是RTP包,就进行解析,将RTP包的头部信息记录下来放到RTCP包中,隔一段时间后发送。每次收到RTP包后都会更新累积数据(更新RTCP)

        如果是RTCP包,进行解析,得到RTCP的vector。每解析出一个RTCP都要进行逻辑计算,处理,更新RTCP的控制包信息,方便反馈信息。如果类型是SR,就转化为SR类型。

推流端

【不停向收流端发送数据,同时不定期会接收数据】

创建TCPclient连接描述符,进行TCP连接。创建两个子线程:发送数据子线程和接收数据子线程。

  • 收流端不停接收,偶尔发送,收流数据不会阻塞
  • 推流不停发送,偶尔接收,发送数据不阻塞,但接收数据不定期,可能很少,这两个逻辑不能放一起————因此创建两个子线程

发送数据子线程

  1. 读取数据:从本地媒体源读取数据(视频帧或音频样本)。

  2. 封装 RTP 数据包:将读取的数据封装成 RTP 数据包。将序号,时间戳,ssrc主机序转成网络序,RTP包前封装4个字节。

  3. 发送 RTP 数据包:通过网络接口将 RTP 数据包发送到接收端。发送后,将序号,时间戳,ssrc网络序转成主机序

  4. 设置RTCP SR。每发送一个RTP后,将RTP的数据更新到RTCP上下文里。

  5. 周期性发送 RTCP 包:定期发送 RTCP Sender Report(SR)或其他控制信息包,提供发送端的统计信息。

接收数据子线程

  1. 接收到的数据放到parseRecvData函数里,数据放缓冲容器里面在循环里逐个字节遍历,接收到RTCP  RR(单向通信)

  2. RTCP解析,逐个遍历,将RTCP的数据更新到RTCP上下文

  3. 构建RTCP SR,构建RTCP包,包前加4个字节,发送给收流端。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值