👉本节总结了在实际开发项目中有关rtsp交互通信的细节部分,如何保持rtsp连接方法❓;有rtsp基础的话,会更好的阅读该文章。需要了解rtsp协议的童鞋,可以看往期的文章《rtsp协议理解》、《rtsp(udp、tcp)协议详解》
在实际应用场景中,会遇到rtsp不正常断开的问题,除了正常的四次挥手断开连接,正常结束网络连接外,还会遇到意想不到的网络环境,这就需要监测设备和客户端之间的连接状态,当发现异常时可以及时处理。
GET_PARAMETER作用👇
在rtsp协议中该方法属于选择实现的,用作向服务器获取参数,一般用于获取时间范围。当发送的请求中没有相关请求参数时,则用作保持RTSP连接;在暂停流媒体播放,定期发送GET_PARAMETER作为心跳包维持连接。
请求参数格式👇
(1)RTSP URI表示请求的rtsp地址;
(2)RTSP version表示版本号;
(3)CSeq表示消息序列号;
(4)Authorization表示认证信息;
(5)User-Agent表示用户代理;
(6)Session表示会话ID,SETUP请求时server发回的session id。
请求抓包报文:👇
从抓包报文中看,没有携带任何请求信息,客户端请求的是一个空包,其左右就是为了维持rtsp连接,类似于心跳机制或ping的左右,服务端需要正确回复报文就可以。
服务端回复报文格式:👇
(1)RTSP Version表示RTSP的版本号;
(2)状态码表示服务器返回的状态,正常为200;
(3)状态描述为对状态码的描述,如对200状态码的描述为OK;
(4)Date为消息发送的日期。
服务端回复报文:👇
回复报文中需要携带设备的当前时间,由于请求的报文中没有额外的请求参数,所以也不需要回复其他参数。
👏小节:以上主要介绍了RTSP中的GET PARAMETER命令的交互,当客户端和服务器支持该命令的时候是可以使用这种方法来维持RTSP的连接。使用这种方式和交互报文的组包也是非常简单。那么你是否有疑问❔,当客户端或服务器不支持该命令时应该怎么处理呢😞,我们带着疑问往下看,下面就会讲到另外一种方式。
RTCP👇
定义:Real-time Transport Control Protocol或RTP Control Protocol或简写RTCP)是实时传输协议(RTP)的一个姐妹协议。RTCP由RFC 3550定义(取代作废的RFC 1889)。RTP 使用一个 偶数 UDP port ;而RTCP 则使用 RTP 的下一个 port,也就是一个奇数 port。RTCP与RTP联合工作,RTP实施实际数据的传输,RTCP则负责将控制包送至电话中的每个人。其主要功能是就RTP正在提供的服务质量做出反馈。
作用:RTCP的主要功能是为应用程序提供会话质量或者广播性能质量的信息。每个RTCP信息包不封装声音数据或者电视数据,而是封装发送端(和 / 或者)接收端的统计报表。这些信息包括发送的信息包数目、丢失的信息包数目和信息包的抖动等情况,这些反馈信息反映了当前的网络状况,对发送端、接收端或者网络管理员都非常有用。RTCP规格没有指定应用程序应该使用这些反馈信息做什么,这完全取决于应用程序开发人员。例如,发送端可以根据反馈信息来调整传输速率,接收端可以根据反馈信息判断问题是本地的、区域性的还是全球性的,网络管理员也可以使用RTCP信息包中的信息来评估网络用于多目标广播的性能。
有关RTCP协议的具体内容暂不展开,先简单介绍,后期会更新上。这里重点讲述一下rtcp如何保持rtsp连接的。
RTCP报文类型:👇
RTCP 协议规范中定义了五种类型的 RTCP 包:
(1)接收⽅报告( RR )
(2)发送⽅报告( SR )
(3)源描述( SDES )
(4)成员管理( BYE )
(5)应⽤程序定义( APP )
客户端或服务端通过发送接收报告,对音视频流的质量进行控制,那么在这个交互的过程中,服务端可以知道客户端的连接是正常的,如果在一段时间内没有接收到客户端的RR包,那么就有可能网络环境发生了变化,服务端可以及时做出相应的操作,设置超时时间,如果在超时时间内没有接收到RR包,那么就认为连接状态发生的变化,可以主动断开连接或采取其他措施。
👏小节:使用RTCP的方式检测rtsp连接的方式,需要客户端和服务端支持RTCP协议,一般客户端会主动发送报告,也方便服务端控制检测rtsp连接状态。
实际生产环境中,可以选择其中一种或两种方法检测rtsp的连接状态,如果是服务端程序的话,可能需要考虑的就比较多些,因为需要对接各个厂家的客户端,每个厂家的客户端处理方式不一样,都需要进行兼容。希望本篇文章对大家有帮助。