From f524a0ebbde2eeed826407b1762c2eec59667e30 Mon Sep 17 00:00:00 2001 From: xia-chu <771730766@qq.com> Date: Sat, 23 Aug 2025 10:41:06 +0800 Subject: [PATCH] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6auto=5Fclos?= =?UTF-8?q?e=E5=BC=80=E5=90=AF=E5=90=8E=E4=B9=9F=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=E6=97=A0=E4=BA=BA=E8=A7=82=E7=9C=8Bhook(=E4=B8=8D=E5=A4=84?= =?UTF-8?q?=E7=90=86=E5=9B=9E=E5=A4=8D)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/WebHook.cpp | 19 ++++++++++++++++--- src/Common/MediaSource.cpp | 9 ++++----- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/server/WebHook.cpp b/server/WebHook.cpp index b685d5c9..ab65571c 100755 --- a/server/WebHook.cpp +++ b/server/WebHook.cpp @@ -624,13 +624,22 @@ void installWebHook() { }); NoticeCenter::Instance().addListener(&web_hook_tag, Broadcast::kBroadcastStreamNoneReader, [](BroadcastStreamNoneReaderArgs) { + auto auto_close = false; + auto muxer = sender.getMuxer(); + if (muxer && muxer->getOption().auto_close) { + auto_close = true; + } + if (!origin_urls.empty() && sender.getOriginType() == MediaOriginType::pull) { // 边沿站无人观看时如果是拉流的则立即停止溯源 [AUTO-TRANSLATED:a1429c77] // If no one is watching at the edge station, stop tracing immediately if it is pulling - sender.close(false); - WarnL << "无人观看主动关闭流:" << sender.getOriginUrl(); + if (!auto_close) { + sender.close(false); + WarnL << "Auto close stream when none reader: " << sender.getOriginUrl(); + } return; } + GET_CONFIG(string, hook_stream_none_reader, Hook::kOnStreamNoneReader); if (!hook_enable || hook_stream_none_reader.empty()) { return; @@ -642,7 +651,11 @@ void installWebHook() { weak_ptr weakSrc = sender.shared_from_this(); // 执行hook [AUTO-TRANSLATED:1df68201] // Execute hook - do_http_hook(hook_stream_none_reader, body, [weakSrc](const Value &obj, const string &err) { + do_http_hook(hook_stream_none_reader, body, [weakSrc, auto_close](const Value &obj, const string &err) { + if (auto_close) { + // 在上层已经关闭了 + return; + } bool flag = obj["close"].asBool(); auto strongSrc = weakSrc.lock(); if (!flag || !err.empty() || !strongSrc) { diff --git a/src/Common/MediaSource.cpp b/src/Common/MediaSource.cpp index 8d2a6372..b10db094 100644 --- a/src/Common/MediaSource.cpp +++ b/src/Common/MediaSource.cpp @@ -690,16 +690,15 @@ void MediaSourceEvent::onReaderChanged(MediaSource &sender, int size){ } if (!is_mp4_vod) { + // 直播时触发无人观看事件,让开发者自行选择是否关闭 [AUTO-TRANSLATED:c6c75eaa] + // When live streaming, trigger the no-viewer event, allowing developers to choose whether to close it. + NOTICE_EMIT(BroadcastStreamNoneReaderArgs, Broadcast::kBroadcastStreamNoneReader, *strong_sender); auto muxer = strong_sender->getMuxer(); if (muxer && muxer->getOption().auto_close) { // 此流被标记为无人观看自动关闭流 [AUTO-TRANSLATED:64a0dac3] // This stream is marked as an automatically closed stream with no viewers. - WarnL << "Auto cloe stream when none reader: " << strong_sender->getUrl(); + WarnL << "Auto close stream when none reader: " << strong_sender->getUrl(); strong_sender->close(false); - } else { - // 直播时触发无人观看事件,让开发者自行选择是否关闭 [AUTO-TRANSLATED:c6c75eaa] - // When live streaming, trigger the no-viewer event, allowing developers to choose whether to close it. - NOTICE_EMIT(BroadcastStreamNoneReaderArgs, Broadcast::kBroadcastStreamNoneReader, *strong_sender); } } else { // 这个是mp4点播,我们自动关闭 [AUTO-TRANSLATED:8a7b9a90]