diff --git a/postman/ZLMediaKit.postman_collection.json b/postman/ZLMediaKit.postman_collection.json index 48d93811..a45b60d1 100644 --- a/postman/ZLMediaKit.postman_collection.json +++ b/postman/ZLMediaKit.postman_collection.json @@ -1023,6 +1023,68 @@ }, "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)", "request": { diff --git a/server/WebApi.cpp b/server/WebApi.cpp index 768b2e64..4f8c3827 100644 --- a/server/WebApi.cpp +++ b/server/WebApi.cpp @@ -873,6 +873,37 @@ void installWebApi() { } }); + api_regist1("/index/api/pauseRtpCheck", [](API_ARGS1) { + CHECK_SECRET(); + CHECK_ARGS("stream_id"); + //只是暂停流的检查,流媒体服务器做为流负载服务,收流就转发,RTSP/RTMP有自己暂停协议 + lock_guard 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 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 diff --git a/src/Rtp/RtpProcess.cpp b/src/Rtp/RtpProcess.cpp index 80e71738..34bd9ab3 100644 --- a/src/Rtp/RtpProcess.cpp +++ b/src/Rtp/RtpProcess.cpp @@ -28,6 +28,7 @@ RtpProcess::RtpProcess(const string &stream_id) { _media_info._vhost = DEFAULT_VHOST; _media_info._app = RTP_APP_NAME; _media_info._streamid = stream_id; + _stop_rtp_check.store(false); GET_CONFIG(string, dump_dir, RtpProxy::kDumpDir); { @@ -134,6 +135,8 @@ void RtpProcess::addTrackCompleted() { } bool RtpProcess::alive() { + if(_stop_rtp_check.load()) + return true; GET_CONFIG(int, timeoutSec, RtpProxy::kTimeoutSec) if (_last_frame_time.elapsedTime() / 1000 < timeoutSec) { return true; @@ -141,6 +144,10 @@ bool RtpProcess::alive() { return false; } +void RtpProcess::setStopCheckRtp(bool is_check){ + _stop_rtp_check = is_check; +} + void RtpProcess::onDetach() { if (_on_detach) { _on_detach(); diff --git a/src/Rtp/RtpProcess.h b/src/Rtp/RtpProcess.h index 2551ab8b..40e3d8cb 100644 --- a/src/Rtp/RtpProcess.h +++ b/src/Rtp/RtpProcess.h @@ -53,6 +53,11 @@ public: */ void setOnDetach(const function &cb); + /** + * 设置onDetach事件回调,false检查RTP超时,true停止 + */ + void setStopCheckRtp(bool is_check=false); + /// SockInfo override string get_local_ip() override; uint16_t get_local_port() override; @@ -89,6 +94,7 @@ private: std::shared_ptr _save_file_video; ProcessInterface::Ptr _process; MultiMediaSourceMuxer::Ptr _muxer; + std::atomic_bool _stop_rtp_check; }; }//namespace mediakit diff --git a/src/Rtp/RtpServer.cpp b/src/Rtp/RtpServer.cpp index d192416d..cb4f79d9 100644 --- a/src/Rtp/RtpServer.cpp +++ b/src/Rtp/RtpServer.cpp @@ -90,5 +90,16 @@ uint16_t RtpServer::getPort() { 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 #endif//defined(ENABLE_RTPPROXY) \ No newline at end of file diff --git a/src/Rtp/RtpServer.h b/src/Rtp/RtpServer.h index bcc045bc..51f26f3d 100644 --- a/src/Rtp/RtpServer.h +++ b/src/Rtp/RtpServer.h @@ -56,6 +56,14 @@ public: * 设置RtpProcess onDetach事件回调 */ void setOnDetach(const function &cb); + /** + * 暂停Rtp服务的RTP流检测 + */ + void pauseRtpCheck(); + /** + * 暂停Rtp服务的RTP流检测 + */ + void resumeRtpCheck(); protected: Socket::Ptr _udp_server; diff --git a/src/Rtsp/RtspSession.cpp b/src/Rtsp/RtspSession.cpp index 40c42f47..d016fa90 100644 --- a/src/Rtsp/RtspSession.cpp +++ b/src/Rtsp/RtspSession.cpp @@ -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类型的播放端,那么就做超时检测 shutdown(SockException(Err_timeout,"rtp over udp session timeouted")); return;