添加停止、恢复rtp代理rtp超时检查功能

This commit is contained in:
sunhui 2020-12-25 16:05:38 +08:00
parent bc125e65be
commit c32c2146b2
7 changed files with 126 additions and 1 deletions

View File

@ -1023,6 +1023,68 @@
}, },
"response": [] "response": []
}, },
{
"name": "暂停RTP超时检查(pauseRtpCheck)",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{ZLMediaKit_URL}}/index/api/pauseRtpCheck?secret={{ZLMediaKit_secret}}&stream_id=test",
"host": [
"{{ZLMediaKit_URL}}"
],
"path": [
"index",
"api",
"pauseRtpCheck"
],
"query": [
{
"key": "secret",
"value": "{{ZLMediaKit_secret}}",
"description": "api操作密钥(配置文件配置)如果操作ip是127.0.0.1,则不需要此参数"
},
{
"key": "stream_id",
"value": "test",
"description": "该端口绑定的流id"
}
]
}
},
"response": []
},
{
"name": "恢复RTP超时检查(resumeRtpCheck)",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{ZLMediaKit_URL}}/index/api/resumeRtpCheck?secret={{ZLMediaKit_secret}}&stream_id=test",
"host": [
"{{ZLMediaKit_URL}}"
],
"path": [
"index",
"api",
"resumeRtpCheck"
],
"query": [
{
"key": "secret",
"value": "{{ZLMediaKit_secret}}",
"description": "api操作密钥(配置文件配置)如果操作ip是127.0.0.1,则不需要此参数"
},
{
"key": "stream_id",
"value": "test",
"description": "该端口绑定的流id"
}
]
}
},
"response": []
},
{ {
"name": "获取RTP服务器列表(listRtpServer)", "name": "获取RTP服务器列表(listRtpServer)",
"request": { "request": {

View File

@ -873,6 +873,37 @@ void installWebApi() {
} }
}); });
api_regist1("/index/api/pauseRtpCheck", [](API_ARGS1) {
CHECK_SECRET();
CHECK_ARGS("stream_id");
//只是暂停流的检查流媒体服务器做为流负载服务收流就转发RTSP/RTMP有自己暂停协议
lock_guard<recursive_mutex> lck(s_rtpServerMapMtx);
auto it = s_rtpServerMap.find(allArgs["stream_id"]);
if (it == s_rtpServerMap.end())
{
val["hit"] = 0;
return;
}
auto server = it->second;
server->pauseRtpCheck();
val["hit"] = 1;
});
api_regist1("/index/api/resumeRtpCheck", [](API_ARGS1) {
CHECK_SECRET();
CHECK_ARGS("stream_id");
lock_guard<recursive_mutex> lck(s_rtpServerMapMtx);
auto it = s_rtpServerMap.find(allArgs["stream_id"]);
if (it == s_rtpServerMap.end())
{
val["hit"] = 0;
return;
}
auto server = it->second;
server->resumeRtpCheck();
val["hit"] = 1;
});
#endif//ENABLE_RTPPROXY #endif//ENABLE_RTPPROXY

View File

@ -28,6 +28,7 @@ RtpProcess::RtpProcess(const string &stream_id) {
_media_info._vhost = DEFAULT_VHOST; _media_info._vhost = DEFAULT_VHOST;
_media_info._app = RTP_APP_NAME; _media_info._app = RTP_APP_NAME;
_media_info._streamid = stream_id; _media_info._streamid = stream_id;
_stop_rtp_check.store(false);
GET_CONFIG(string, dump_dir, RtpProxy::kDumpDir); GET_CONFIG(string, dump_dir, RtpProxy::kDumpDir);
{ {
@ -134,6 +135,8 @@ void RtpProcess::addTrackCompleted() {
} }
bool RtpProcess::alive() { bool RtpProcess::alive() {
if(_stop_rtp_check.load())
return true;
GET_CONFIG(int, timeoutSec, RtpProxy::kTimeoutSec) GET_CONFIG(int, timeoutSec, RtpProxy::kTimeoutSec)
if (_last_frame_time.elapsedTime() / 1000 < timeoutSec) { if (_last_frame_time.elapsedTime() / 1000 < timeoutSec) {
return true; return true;
@ -141,6 +144,10 @@ bool RtpProcess::alive() {
return false; return false;
} }
void RtpProcess::setStopCheckRtp(bool is_check){
_stop_rtp_check = is_check;
}
void RtpProcess::onDetach() { void RtpProcess::onDetach() {
if (_on_detach) { if (_on_detach) {
_on_detach(); _on_detach();

View File

@ -53,6 +53,11 @@ public:
*/ */
void setOnDetach(const function<void()> &cb); void setOnDetach(const function<void()> &cb);
/**
* onDetach事件回调,false检查RTP超时true停止
*/
void setStopCheckRtp(bool is_check=false);
/// SockInfo override /// SockInfo override
string get_local_ip() override; string get_local_ip() override;
uint16_t get_local_port() override; uint16_t get_local_port() override;
@ -89,6 +94,7 @@ private:
std::shared_ptr<FILE> _save_file_video; std::shared_ptr<FILE> _save_file_video;
ProcessInterface::Ptr _process; ProcessInterface::Ptr _process;
MultiMediaSourceMuxer::Ptr _muxer; MultiMediaSourceMuxer::Ptr _muxer;
std::atomic_bool _stop_rtp_check;
}; };
}//namespace mediakit }//namespace mediakit

View File

@ -90,5 +90,16 @@ uint16_t RtpServer::getPort() {
return _udp_server ? _udp_server->get_local_port() : 0; return _udp_server ? _udp_server->get_local_port() : 0;
} }
void RtpServer::pauseRtpCheck(){
if(_rtp_process)
_rtp_process->setStopCheckRtp(true);
}
void RtpServer::resumeRtpCheck(){
if(_rtp_process)
_rtp_process->setStopCheckRtp(false);
}
}//namespace mediakit }//namespace mediakit
#endif//defined(ENABLE_RTPPROXY) #endif//defined(ENABLE_RTPPROXY)

View File

@ -56,6 +56,14 @@ public:
* RtpProcess onDetach事件回调 * RtpProcess onDetach事件回调
*/ */
void setOnDetach(const function<void()> &cb); void setOnDetach(const function<void()> &cb);
/**
* Rtp服务的RTP流检测
*/
void pauseRtpCheck();
/**
* Rtp服务的RTP流检测
*/
void resumeRtpCheck();
protected: protected:
Socket::Ptr _udp_server; Socket::Ptr _udp_server;

View File

@ -106,7 +106,7 @@ void RtspSession::onManager() {
} }
} }
if ((_rtp_type == Rtsp::RTP_UDP || _push_src ) && _alive_ticker.elapsedTime() > keep_alive_sec * 1000) { if ((_rtp_type == Rtsp::RTP_UDP || _push_src ) && _alive_ticker.elapsedTime() > keep_alive_sec * 1000 && _enable_send_rtp) {
//如果是推流端或者rtp over udp类型的播放端那么就做超时检测 //如果是推流端或者rtp over udp类型的播放端那么就做超时检测
shutdown(SockException(Err_timeout,"rtp over udp session timeouted")); shutdown(SockException(Err_timeout,"rtp over udp session timeouted"));
return; return;