JRtplib是一个用C++编写的面向对象的库,旨在帮助开发人员使用RFC3550中描述的实时传输协议(RTP),该库可以提供接口给开发者实现RTP发送和接收数据,而无需担心SSRC冲突、调度和传输RTCP 用户只需要向库提供发送的有效负载数据,并且味苦提供访问传入的RTP和RTCP数据即可。
RTP/RTCP 在一般情况下,实时互动直播系统在传输音视频流数据的时候,并不直接把音视频数据交给UDP传输,而是首先给音视频数据添加RTP头,然后再交给UDP进行传输。 RTCP协议 在使用RTP协议传输协议的时候,难免会发生丢包、抖动的问题: 网络质量引起的丢包; 数据传输过程中超过了带宽限制引起的丢包; 信号干扰引起的丢包; WebRTC在处理各种情况下的丢包情况都会有相应的处理策略 ,但是在处理这些问题之前,WebRTC的两端首先需要知道自己和对方的网络情况,这就是RTCP的作用。 RTCP中有两个重要的报文:RR(Reciver Report)和SR(Sender Report),通过这两个报文的交换,各端就可以知道自己的网络状况了。 ? 上面是RTCP协议的规范 RTCP中除了RR报文和SR报文之外,还有其他的报文,比如FIR报文,即完整帧请求报文,FIR也是RTCP协议中一个非常重要的报文,假如一个房间中有3个人进行视频通信,当第4个人加入该房间的时候
RTCP简介 之前的文章,介绍了RTSP和RTP协议,RTSP用于建立连接及发送请求等,RTP用于实际的媒体数据传输。整个RTSP的流程中,还有一种不可或缺的协议, 那就是RTCP。 RTCP的全称是RTP Control Protocol,从英文名称可以看出,其是针对RTP的控制协议!RTCP主要用于提供数据分发质量反馈信息,本文详细介绍一下RTCP协议! length(16bit):RTCP数据包的大小。该字段中大小的表示比较有意思,使用4个字节为1组,长度共有几个4个字节的组,然后用该长度减去1,即为RTCP包中的长度! 举个栗子:假设RTCP数据包的长度为32个字节,32/4=8,总共有8组4个字节,8-1=7,此时RTCP数据包中length的值为7。 这样,我们对RTCP报文的整体结构就比较了解了!上一个抓包文件,我们就会更直观的感受了! ? 通过抓包文件我们可以看到,RTCP包是应用层协议,截图中的RTCP包是基于UDP协议的!
JRTPLIB 是 C++ 语言编写的 RTP 库,它帮助我们封装了 RTP 协议细节,用户通过提供好的接口可以设置 RTP 包信息并发送到指定地址,也可以接收 RTP 包取出信息。
在RFC3550中,除了定义了⽤来进⾏实时数据传输的 RTP 协议外,还定义了 RTCP 协议,⽤来反馈会话传输质量、⽤户源识别、控制 RTCP 传输间隔。 RTCP报文类型 ⽬前 RTCP 主要定义了以下8种类型的报⽂,其中业务场景中主要⽤到 SR/RR/RTPFB/PSFB,接下来我们也将重点介绍这四种报⽂。 RTCP报文格式 在介绍报⽂类型之前,我们先看⼀下报⽂格式: ? 每个 RTCP 包都有⼀个和 RTP 类似的固定格式的头,⻓度为8,后⾯跟着⻓度不定的结构化数据,在不同 RTCP 类型时,这些结构化数据各不⼀样,但是它们必须都要 32-bit 对⻬。 RTCP 的头部是定⻓的,⽽且在头部有⼀个字段来描述这个 RTCP 数据的⻓度,因此 RTCP 可以被复合成⼀组⼀同发送。 SR: Sender Report RTCP Packet ?
a=rtcp-rsize a=rtpmap:96 VP8/90000 a=rtcp-fb:96 goog-remb a=rtcp-fb:96 transport-cc a=rtcp-fb:96 ccm a=rtcp-fb:98 goog-remb a=rtcp-fb:98 transport-cc a=rtcp-fb:98 ccm fir a=rtcp-fb:98 nack a=rtcp-fb:98 :100 goog-remb a=rtcp-fb:100 transport-cc a=rtcp-fb:100 ccm fir a=rtcp-fb:100 nack a=rtcp-fb:100 nack :102 goog-remb a=rtcp-fb:102 transport-cc a=rtcp-fb:102 ccm fir a=rtcp-fb:102 nack a=rtcp-fb:102 nack a=rtcp-fb:98 goog-remb a=rtcp-fb:98 transport-cc a=rtcp-fb:98 ccm fir a=rtcp-fb:98 nack a=rtcp-fb:98
25a=rtcp-rsize 26a=rtpmap:96 VP8/90000 27a=rtcp-fb:96 goog-remb 28a=rtcp-fb:96 transport-cc 29a=rtcp-fb /90000 43a=rtcp-fb:100 goog-remb 44a=rtcp-fb:100 transport-cc 45a=rtcp-fb:100 ccm fir 46a=rtcp-fb:100 53a=rtcp-fb:102 transport-cc 54a=rtcp-fb:102 ccm fir 55a=rtcp-fb:102 nack 56a=rtcp-fb:102 nack pli 57a :120 nack 30a=rtcp-fb:120 nack pli 31a=rtcp-fb:120 ccm fir 32a=rtcp-fb:120 goog-remb 33a=rtcp-fb:121 38a=rtcp-fb:126 nack pli 39a=rtcp-fb:126 ccm fir 40a=rtcp-fb:126 goog-remb 41a=rtcp-fb:97 nack 42a=rtcp-fb
1.3 RTSP 与 RTP / RTCP 的协同关系RTSP 本身并不携带音视频内容。它的职责是会话建立 + 参数协商 + 状态管理,而数据面完全交给 RTP 与 RTCP。 3.2 报文结构与发送机制RTCP 报文设计简洁但功能丰富,通常与 RTP 使用配对端口发送:若 RTP 使用偶数端口 X,则 RTCP 使用相邻的奇数端口 X+1。 RTCP 报文的周期性发送频率取决于带宽分配与会话规模。RFC 3550 建议 RTCP 总流量不应超过会话带宽的 5%,以防止反馈机制反而成为负担。 3.3 在实时系统中的意义RTCP 让实时系统“看见自己”的状态。 3.4 工程实现要点与实践经验在工程实现中,RTCP 往往与 RTP 共生于同一线程或事件循环,但需注意以下几点: 发送频率与带宽控制 RTCP 带宽开销极小,通常控制在总媒体带宽的 1–5% 之间。
a=rtcp-rsize a=rtpmap:96 VP8/90000 a=rtcp-fb:96 goog-remb a=rtcp-fb:96 transport-cc a=rtcp-fb:96 ccm a=rtcp-fb:98 goog-remb a=rtcp-fb:98 transport-cc a=rtcp-fb:98 ccm fir a=rtcp-fb:98 nack a=rtcp-fb:98 :100 goog-remb a=rtcp-fb:100 transport-cc a=rtcp-fb:100 ccm fir a=rtcp-fb:100 nack a=rtcp-fb:100 nack :102 goog-remb a=rtcp-fb:102 transport-cc a=rtcp-fb:102 ccm fir a=rtcp-fb:102 nack a=rtcp-fb:102 nack a=rtcp-fb:98 goog-remb a=rtcp-fb:98 transport-cc a=rtcp-fb:98 ccm fir a=rtcp-fb:98 nack a=rtcp-fb:98
RTCP的封装 RTP需要RTCP为其服务质量提供保证,因此下面介绍一下RTCP的相关知识。 RTCP的主要功能是:服务质量的监视与反馈、媒体间的同步,以及多播组中成员的标识。 从图 1可以看到,RTCP也是用UDP来传送的,但RTCP封装的仅仅是一些控制信息,因而分组很短,所以可以将多个RTCP分组封装在一个UDP包中。RTCP有如下五种分组类型。 目的传输地址由一个网络地址和一对端口组成,有两个端口:一个给RTP包,一个给RTCP包,使得RTP/RTCP数据能够正确发送。 1) RTP协议从上层接收流媒体信息码流(如H.263),封装成RTP数据包;RTCP从上层接收控制信息,封装成RTCP控制包。 2) RTP将RTP 数据包发往UDP端口对中偶数端口;RTCP将RTCP控制包发往UDP端口对中的接收端口。 第3章. 相关的协议 3.1.
\r\na=rtpmap:126 H264/90000\r\na=rtcp-fb:126 ccm fir\r\na=rtcp-fb:126 goog-remb\r\na=rtcp-fb:126 nack :120 nack a=rtcp-fb:120 nack pli a=rtcp-fb:120 ccm fir a=rtcp-fb:120 goog-remb a=rtcp-fb:120 transport-cc a=rtcp-fb:121 nack a=rtcp-fb:121 nack pli a=rtcp-fb:121 ccm fir a=rtcp-fb:121 goog-remb a=rtcp-fb:121 transport-cc a=rtcp-fb:126 nack a=rtcp-fb:126 nack pli a=rtcp-fb:126 ccm fir a=rtcp-fb:126 goog-remb a=rtcp-fb:126 transport-cc a=rtcp-fb:97 nack a=rtcp-fb:97 nack pli a=rtcp-fb:97 ccm fir a=rtcp-fb:97
但在目前的市场上,真五轴(有RTCP功能)机床很少,假五轴(只做分度功能)机床很多。什么叫真五轴、什么叫假五轴,与三轴有什么区别?下面说明如下。 真五轴就是有RTCP功能。 主轴要是有RTCP真五轴的算法。就是做分度加工,有RTCP功能的真五轴只要设置一个坐标系,只需要一次对刀设坐标。而假五轴则麻烦很多。 没有RCTP功能的情况 有RCTP功能的情况 拥有RTCP功能的数控系统,可以直接使用刀尖编程,无需考虑旋转轴中心距离。 应用RTCP模式后,编程5坐标加工就可以直接针对刀具刀尖而不是旋转主轴头的中心,因此编程就会变得简单、高效很多。 从图中我们可以看到,对于双转台假五轴,需要设置多次坐标,达到分度加工的目的。
三、UDP模式:RTP/RTCP独立传输在 UDP 模式下(即 RTP over UDP): 视频和音频各自使用 RTP 通道来传输数据; 每一路媒体流(RTP)都需要一个对应的 RTCP 通道来传输控制信息 典型分配 视频流: RTP(偶数端口,例如 5004) RTCP(下一个奇数端口,例如 5005) 音频流: RTP(偶数端口,例如 5006) RTCP(下一个奇数端口,例如 5007) 再加上 情况对比 视频 + 音频:1 TCP(控制)+ 4 UDP(RTP/RTCP ×2)= 5 个端口 只有视频:1 TCP(控制)+ 2 UDP(RTP/RTCP ×1)= 3 个端口 特点 优点:丢包时只影响个别 缺点:端口占用多,防火墙穿透性差,需要显式打开 RTP/RTCP 端口范围。 UDP 模式:通常需要 3~5 个端口(RTSP 控制 + RTP/RTCP 对)。 理解这一点,不仅能帮助开发者合理配置端口和防火墙策略,也能在系统架构设计中更好地平衡 实时性 与 可部署性。
这其中,涉及多种协议,包括UDP、RTP/SRTP、RTCP/SRTCP、DTLS、SCTP。 RTP、RTCP的大概用途: RTP(Realtime Transport Protocol):实时传输协议,主要用来传输对实时性要求比较高的数据,比如音视频数据。 RTCP(RTP Trasport Control Protocol):RTP传输控制协议,跟RTP在同一份RFC中定义,主要用来监控数据传输的质量,并给予数据发送方反馈。 至于SRTP、SRTCP,分别在RTP、RTCP的基础上加了个S(Secure),表示安全的意思,这个就是DTLS做的事情了。 之前介绍过,RTP/RTCP主要用来传输音视频,是为了流媒体设计的。而对于自定义应用数据的传输,WebRTC中使用了SCTP协议。
SDP协议 RTP RTCP SRTP RTP只负责传输数据包,需要与RTCP配合使用,由RTCP来保证RTP数据包的服务质量。 RTCP的主要功能:服务质量的监控和反馈、媒体设备间的同步以及多播组中的成员标识。 在RTP会话期间,各参与者周期性传送RTCP数据包,RTCP数据包中包含已发送的数据包数量、 丢失的数据包数量等信息,各参与者通过这些信息动态改变传输速率或传输的数据类型。 类型有: SR:发送端报告, RR:接收端报告, SDES:源描述, BYE:通知离开, APP:由应用程序自己定义,解决了RTCP的扩展性问题,并且为协议的实现者提供了很大的灵活性。
它能完全处理RTCP部份的数据包,所以用户可以把精力集中在真正的数据收发。 ps:因为BYE包是一个RTCP包,RTCP不是要发就发的,它的发送时间是为了平衡带宽通过计算得出来的,那就很有可能到了要发的时候以经超过了maxwaittime时间了,作者可能认一直保留个这会话这么久没意义 在RFC3550中有关RTCP的东西都在这了,看过RFC3550的人都知到,里头谈得最多的就是RTCP。这个类我们以后会专门说。 但令我很不高兴的是,这时候的RTPSourceData 里头的CNAME和NAME等字段都还是无效的,这不是RTCP的责任,因为在这个SDES RTCP数据包中所有的信息都以经有了(通过抓包证实了这一点 Useful to inspect outgoing RTCP data.
RTP协议常用于流媒体系统(配合RTCP协议或者RTSP协议)。因RTP协议和RTP控制协议RTCP一起使用,而且它是建立在用户数据报协议上的。 RTCP的封装 RTP需要RTCP为其服务质量提供保证,因此下面介绍一下RTCP的相关知识。 RTCP的主要功能是:服务质量的监视与反馈、媒体间的同步,以及多播组中成员的标识。 从图 1可以看到,RTCP也是用UDP来传送的,但RTCP封装的仅仅是一些控制信息,因而分组很短,所以可以将多个RTCP分组封装在一个UDP包中。RTCP有如下五种分组类型。 目的传输地址由一个网络地址和一对端口组成,有两个端口:一个给RTP包,一个给RTCP包,使得RTP/RTCP数据能够正确发送。 2) RTP将RTP 数据包发往UDP端口对中偶数端口;RTCP将RTCP控制包发往UDP端口对中的接收端口。
RTP协议常用于流媒体系统(配合RTCP协议),视频会议和一键通系统(配合H.323或SIP),使它成为IP电话产业的技术基础。 RTP是建立在UDP协议上的,常与RTCP一起使用,其本身并没有提供按时发送机制或其它服务质量(QoS)保证,它依赖于低层服务去实现这一过程。 4、RTCP(Real-time Transport Control Protocol,实时传输控制协议) RTCP是RTP的配套协议,为RTP媒体流提供信道外的控制。 RTCP和RTP一起协作将多媒体数据打包和发送,定期在多媒体流会话参与者之间传输控制数据。 网络应用程序可以利用RTCP所提供的信息来提高服务质量,比如限制流量或改用压缩比小的编解码器。
所有的业务应用都在这里实现 transports docs # Janus的文档,它是通过 Doxygen 生成的 html # Web端的Demo都放在这里 rtcp.h # RTCP 是RTP的控制协议 rtcp.c # RTCP 协议的具体实现 rtp.c # RTP协议的实现,它用于传输音视频数据 rtp.h 它自己实现了 RTP/RTCP、SRTP、SCTP、DTLS/DTLS-BIO、SDP 等 WebRTC 必要的协议,而对于数据传输,则是使用 libnice 库,并通过 ice.c/h 对libnice 由于 WebRTC 使用了很多的协议(如 RTP/RTCP、DTLS、SDP等),因此作为服务端的 Janus 也都必须实现这些协议,这样才能与 WebRTC 进行通信。
但是如何将这些传输时 “网络质量信息” 实时告诉对方,就是RTCP它的作用。相对于RTP来说,RTCP所占的带宽非常小,通常只有5%。 接下来让我们简单看下RTCP协议规范:首先RTCP报文有多种类型: 发送报告SR (Sender Report): 当前活动发送者发送、接收统计。 大致流程如下: RTP协议从上层接收流媒体信息码流,封装成RTP数据包; RTCP从上层接收控制信息,封装成RTCP控制包。 RTP将RTP 数据包发往UDP端口对中偶数端口;RTCP将RTCP控制包发往UDP端口对中的接收端口。 2.4. 快速上手Wireshark抓包RTP及RTCP 纸上得来终觉浅,绝知此事要躬行。 最后再简单看RTCP,在过滤栏中输入rtcp进行过滤,可以看到Sender Report 和 Receive Report。