RTSP-Server组件EasyRTSPServer多个客户端访问同一路源某个客户端异常断电后资源没有释放问题的解决

背景分析

众所周知,RTSP协议是一个流媒体协议,可以实现直播和点播形式的音频与视频流的播放。RTSP协议定义了多种服务器-客户端之间交互的接口,主要有OPTIONS,DESCRIBE,SETUP,PLAY,TEARDOWN,RECORD,ANNOUNCE。网络上已经有很多针对RTSP协议的文章,我这里不准备进行过多介绍。RTSP并不包括具体数据的传输,该功能一般由RTP与RTCP协议来实现,并可以通过TCP或UDP两种底层传输方式进行。

下图是典型的RTSP直播过程中服务端-客户端主要交互过程:

关于安防互联网直播平台EasyRTSPServer

EasyRTSPServer是一套稳定、高效、可靠、多平台支持的RTSP-Server组件, 接口调用非常简单成熟,无需关注RTSPServer中关于客户端监听接入、音视频多路复用、RTSP具体流程、RTP打包与发送等相关问题,支持多种音视频格式,再也不用去处理整个RTSP OPTIONS/DESCRIBE/SETUP/PLAY/RTP/RTCP的复杂流程和担心内存释放的问题了,非常适合于安防领域、教育领域、互联网直播领域等。

EasyRTSPServer多个客户端访问同一路源, 其中某个客户端异常断电后资源没有释放问题解决

提出问题

安防互联网直播平台EasyRTSPServer 经过一年多的商用,已经表现得非常稳定了,今天有个客户反馈,在客户端突然断电后,EasyRTSPServer中有部分资源没有释放。

和上一篇的没有释放稍有区别,上一篇是某一个通道没有客户端访问了, 要释放相应资源,而今天要说的,是多个客户端访问同一路源, 其中某个客户端异常断电了(比如NVR断电), 上次的方法就不适用于这种情况了。

分析问题

两台电脑上分别打开一个客户端,连接安防互联网直播平台EasyRTSPServer中的同一个源, 在播放过程中,将一台电脑的网卡直接禁用(模拟突然掉电), 而另一台电脑上的客户端还在正常播放。通过命令ss -ntp | grep 554 查看当前连接,发现连接仍然在,相应的socket没有被关闭,但通过打印可以看出,已经执行了RTSPClientSession的析构了,而没有执行到RTSPClientConnection的析构。

注:Windows环境下没有该问题, 只有Linux环境下会出现。

解决问题

在ClientSession中,保存相应的RTSPClientConnection的指针, 当ClientSession被析构时,创建一个延时任务来关闭相应的RTSPClientConnection, 代码如下:

void GenericMediaServer::ClientSession::CloseConnectionTask(ClientConnection *clientConnection)
{
	if (NULL == clientConnection)			return;
	if (clientConnection->GetFlag() != LIVE_FLAG)		return;

	clientConnection->handleRequestBytes(-1, clientConnection->pClientConnectionEnv);
}
发布了64 篇原创文章 · 获赞 0 · 访问量 6841

猜你喜欢

转载自blog.csdn.net/EasyGBS/article/details/103527363
今日推荐