diff --git a/conf/config.ini b/conf/config.ini index ae0ce077..2fe23ad0 100644 --- a/conf/config.ini +++ b/conf/config.ini @@ -94,6 +94,7 @@ maxStreamWaitMS=15000 #某个流无人观看时,触发hook.on_stream_none_reader事件的最大等待时间,单位毫秒 #在配合hook.on_stream_none_reader事件时,可以做到无人观看自动停止拉流或停止接收推流 streamNoneReaderDelayMS=20000 +noRecordStreamNoneReaderDelayMS=2000 #拉流代理时如果断流再重连成功是否删除前一次的媒体流数据,如果删除将重新开始, #如果不删除将会接着上一次的数据继续写(录制hls/mp4时会继续在前一个文件后面写) resetWhenRePlay=1 diff --git a/src/Common/MediaSource.cpp b/src/Common/MediaSource.cpp index 5e378124..83507e35 100644 --- a/src/Common/MediaSource.cpp +++ b/src/Common/MediaSource.cpp @@ -662,32 +662,65 @@ void MediaSourceEvent::onReaderChanged(MediaSource &sender, int size){ //没有任何人观看该视频源,表明该源可以关闭了 GET_CONFIG(string, record_app, Record::kAppName); GET_CONFIG(int, stream_none_reader_delay, General::kStreamNoneReaderDelayMS); + GET_CONFIG(int, no_record_stream_none_reader_delay, General::kNoRecordStreamNoneReaderDelayMS); //如果mp4点播, 无人观看时我们强制关闭点播 bool is_mp4_vod = sender.getApp() == record_app; weak_ptr weak_sender = sender.shared_from_this(); + + if(sender.isRecording(Recorder::type_hls)) {//如果正在录像 + _async_close_timer = std::make_shared( + stream_none_reader_delay / 1000.0f, + [weak_sender, is_mp4_vod]() { + auto strong_sender = weak_sender.lock(); + if (!strong_sender) { + //对象已经销毁 + return false; + } - _async_close_timer = std::make_shared(stream_none_reader_delay / 1000.0f, [weak_sender, is_mp4_vod]() { - auto strong_sender = weak_sender.lock(); - if (!strong_sender) { - //对象已经销毁 - return false; - } + if (strong_sender->totalReaderCount()) { + //还有人观看该视频,不触发关闭事件 + return false; + } - if (strong_sender->totalReaderCount()) { - //还有人观看该视频,不触发关闭事件 - return false; - } + if (!is_mp4_vod) { + //直播时触发无人观看事件,让开发者自行选择是否关闭 + NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastStreamNoneReader, *strong_sender); + } else { + //这个是mp4点播,我们自动关闭 + WarnL << "MP4点播无人观看,自动关闭:" << strong_sender->getUrl(); + strong_sender->close(false); + } + return false; + }, + nullptr); + } else {//没有录像的话 + _async_close_timer = std::make_shared( + no_record_stream_none_reader_delay / 1000.0f, + [weak_sender, is_mp4_vod]() { + auto strong_sender = weak_sender.lock(); + if (!strong_sender) { + //对象已经销毁 + return false; + } - if (!is_mp4_vod) { - //直播时触发无人观看事件,让开发者自行选择是否关闭 - NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastStreamNoneReader, *strong_sender); - } else { - //这个是mp4点播,我们自动关闭 - WarnL << "MP4点播无人观看,自动关闭:" << strong_sender->getUrl(); - strong_sender->close(false); - } - return false; - }, nullptr); + if (strong_sender->totalReaderCount()) { + //还有人观看该视频,不触发关闭事件 + return false; + } + + if (!is_mp4_vod) { + //直播时触发无人观看事件,让开发者自行选择是否关闭 + NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastStreamNoneReader, *strong_sender); + } else { + //这个是mp4点播,我们自动关闭 + WarnL << "MP4点播无人观看,自动关闭:" << strong_sender->getUrl(); + strong_sender->close(false); + } + return false; + }, + nullptr); + } + } string MediaSourceEvent::getOriginUrl(MediaSource &sender) const { diff --git a/src/Common/config.cpp b/src/Common/config.cpp index cb24064b..e6611f1e 100644 --- a/src/Common/config.cpp +++ b/src/Common/config.cpp @@ -66,6 +66,7 @@ namespace General { const string kMediaServerId = GENERAL_FIELD "mediaServerId"; const string kFlowThreshold = GENERAL_FIELD "flowThreshold"; const string kStreamNoneReaderDelayMS = GENERAL_FIELD "streamNoneReaderDelayMS"; +const string kNoRecordStreamNoneReaderDelayMS = GENERAL_FIELD "noRecordStreamNoneReaderDelayMS"; const string kMaxStreamWaitTimeMS = GENERAL_FIELD "maxStreamWaitMS"; const string kEnableVhost = GENERAL_FIELD "enableVhost"; const string kResetWhenRePlay = GENERAL_FIELD "resetWhenRePlay"; @@ -79,6 +80,7 @@ const string kUnreadyFrameCache = GENERAL_FIELD "unready_frame_cache"; static onceToken token([]() { mINI::Instance()[kFlowThreshold] = 1024; mINI::Instance()[kStreamNoneReaderDelayMS] = 20 * 1000; + mINI::Instance()[kNoRecordStreamNoneReaderDelayMS] = 20 * 1000; mINI::Instance()[kMaxStreamWaitTimeMS] = 15 * 1000; mINI::Instance()[kEnableVhost] = 0; mINI::Instance()[kResetWhenRePlay] = 1; diff --git a/src/Common/config.h b/src/Common/config.h index 36177ec4..260178fd 100644 --- a/src/Common/config.h +++ b/src/Common/config.h @@ -158,6 +158,7 @@ extern const std::string kFlowThreshold; // 流无人观看并且超过若干时间后才触发kBroadcastStreamNoneReader事件 // 默认连续5秒无人观看然后触发kBroadcastStreamNoneReader事件 extern const std::string kStreamNoneReaderDelayMS; +extern const std::string kNoRecordStreamNoneReaderDelayMS; // 等待流注册超时时间,收到播放器后请求后,如果未找到相关流,服务器会等待一定时间, // 如果在这个时间内,相关流注册上了,那么服务器会立即响应播放器播放成功, // 否则会最多等待kMaxStreamWaitTimeMS毫秒,然后响应播放器播放失败