From 88b422db08516692140f39e2eddfc9e2ce8d1dcf Mon Sep 17 00:00:00 2001 From: xia-chu <771730766@qq.com> Date: Tue, 9 Sep 2025 23:11:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96pauseRtpCheck=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E6=96=B0=E5=A2=9Epause=5Fseconds=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/source/mk_rtp_server.cpp | 4 ++-- postman/ZLMediaKit.postman_collection.json | 6 ++++++ server/WebApi.cpp | 4 ++-- src/Rtp/RtpProcess.cpp | 23 ++++++++++------------ src/Rtp/RtpProcess.h | 16 +++++++-------- 5 files changed, 28 insertions(+), 25 deletions(-) diff --git a/api/source/mk_rtp_server.cpp b/api/source/mk_rtp_server.cpp index 830f71b7..c9a19ed4 100644 --- a/api/source/mk_rtp_server.cpp +++ b/api/source/mk_rtp_server.cpp @@ -102,7 +102,7 @@ API_EXPORT void API_CALL mk_rtp_pause_check(const char *app, const char *stream) auto src = MediaSource::find(DEFAULT_VHOST, app, stream); auto process = src ? src->getRtpProcess() : nullptr; if (process) { - process->setStopCheckRtp(true); + process->pauseRtpTimeout(true); } } @@ -110,7 +110,7 @@ API_EXPORT void API_CALL mk_rtp_resume_check(const char *app, const char *stream auto src = MediaSource::find(DEFAULT_VHOST, app, stream); auto process = src ? src->getRtpProcess() : nullptr; if (process) { - process->setStopCheckRtp(false); + process->pauseRtpTimeout(false); } } diff --git a/postman/ZLMediaKit.postman_collection.json b/postman/ZLMediaKit.postman_collection.json index 729b6290..5a6a61ae 100644 --- a/postman/ZLMediaKit.postman_collection.json +++ b/postman/ZLMediaKit.postman_collection.json @@ -2019,6 +2019,12 @@ "key": "stream_id", "value": "test", "description": "该端口绑定的流id" + }, + { + "key": "pause_seconds", + "value": "300", + "description": "暂停超时监测后,将在pause_seconds时间后恢复", + "disabled": true } ] } diff --git a/server/WebApi.cpp b/server/WebApi.cpp index d7964e20..6ff38fad 100755 --- a/server/WebApi.cpp +++ b/server/WebApi.cpp @@ -1734,7 +1734,7 @@ void installWebApi() { auto src = MediaSource::find(vhost, app, allArgs["stream_id"]); auto process = src ? src->getRtpProcess() : nullptr; if (process) { - process->setStopCheckRtp(true); + process->pauseRtpTimeout(true, allArgs["pause_seconds"]); } else { val["code"] = API::NotFound; } @@ -1754,7 +1754,7 @@ void installWebApi() { auto src = MediaSource::find(vhost, app, allArgs["stream_id"]); auto process = src ? src->getRtpProcess() : nullptr; if (process) { - process->setStopCheckRtp(false); + process->pauseRtpTimeout(false); } else { val["code"] = API::NotFound; } diff --git a/src/Rtp/RtpProcess.cpp b/src/Rtp/RtpProcess.cpp index 139bc980..a5312d73 100644 --- a/src/Rtp/RtpProcess.cpp +++ b/src/Rtp/RtpProcess.cpp @@ -203,27 +203,24 @@ void RtpProcess::doCachedFunc() { } bool RtpProcess::alive() { - if (_stop_rtp_check.load()) { - if(_last_check_alive.elapsedTime() > 5 * 60 * 1000){ - // 最多暂停5分钟的rtp超时检测,因为NAT映射有效期一般不会太长 [AUTO-TRANSLATED:2df59aad] - // Pause the RTP timeout detection for a maximum of 5 minutes, because the NAT mapping validity period is generally not very long. - _stop_rtp_check = false; - } else { + if (_pause_timeout) { + if (_last_check_alive.elapsedTime() < _pause_seconds * 1000) { return true; } + // 最多暂停_pause_seconds秒的rtp超时检测,因为NAT映射有效期一般不会太长 + _pause_timeout = false; } _last_check_alive.resetTime(); GET_CONFIG(uint64_t, timeoutSec, RtpProxy::kTimeoutSec) - if (_last_frame_time.elapsedTime() / 1000 < timeoutSec) { - return true; - } - return false; + return _last_frame_time.elapsedTime() < timeoutSec * 1000; } -void RtpProcess::setStopCheckRtp(bool is_check){ - _stop_rtp_check = is_check; - if (!is_check) { +void RtpProcess::pauseRtpTimeout(bool pause, uint32_t pause_seconds) { + _pause_timeout = pause; + // 默认5分钟恢复超时监测 + _pause_seconds = pause_seconds ? pause_seconds : 300; + if (!pause) { _last_frame_time.resetTime(); } } diff --git a/src/Rtp/RtpProcess.h b/src/Rtp/RtpProcess.h index cffe119f..08b91e5e 100644 --- a/src/Rtp/RtpProcess.h +++ b/src/Rtp/RtpProcess.h @@ -69,12 +69,11 @@ public: void setOnDetach(onDetachCB cb); /** - * 设置onDetach事件回调,false检查RTP超时,true停止 - * Set onDetach event callback, false checks RTP timeout, true stops - - * [AUTO-TRANSLATED:2780397f] + * 暂停或恢复rtp超时监测 + * @param pause 是否暂停超时检测 + * @param pause_seconds 暂停超时检测最大时间(单位秒),超过这个时间后将恢复超时检测; 设置为0时默认为300 */ - void setStopCheckRtp(bool is_check=false); + void pauseRtpTimeout(bool pause, uint32_t pause_seconds = 0); /** * 设置为单track,单音频/单视频时可以加快媒体注册速度 @@ -129,10 +128,12 @@ private: void createTimer(); private: - OnlyTrack _only_track = kAll; - std::string _auth_err; + bool _pause_timeout = false; + uint32_t _pause_seconds = 5 * 60; uint64_t _dts = 0; uint64_t _total_bytes = 0; + OnlyTrack _only_track = kAll; + std::string _auth_err; std::unique_ptr _addr; toolkit::Socket::Ptr _sock; MediaInfo _media_info; @@ -142,7 +143,6 @@ private: std::shared_ptr _save_file_video; ProcessInterface::Ptr _process; MultiMediaSourceMuxer::Ptr _muxer; - std::atomic_bool _stop_rtp_check{false}; toolkit::Timer::Ptr _timer; toolkit::Ticker _last_check_alive; std::recursive_mutex _func_mtx;