diff --git a/src/Common/MultiMediaSourceMuxer.cpp b/src/Common/MultiMediaSourceMuxer.cpp index 01b9c1bc..0395e717 100644 --- a/src/Common/MultiMediaSourceMuxer.cpp +++ b/src/Common/MultiMediaSourceMuxer.cpp @@ -457,13 +457,16 @@ std::string MultiMediaSourceMuxer::startRecord(const std::string &file_path, uin auto reader = _ring->attach(MultiMediaSourceMuxer::getOwnerPoller(MediaSource::NullMediaSource()), false); uint64_t now_dts = 0; int selected_index = -1; - reader->setReadCB([muxer, now_dts, selected_index, forward_time_ms, reader, path](const Frame::Ptr &frame) mutable { + Ticker ticker; + bool is_live_stream = _dur_sec < 0.01; + reader->setReadCB([muxer, now_dts, selected_index, forward_time_ms, reader, path, ticker, is_live_stream](const Frame::Ptr &frame) mutable { // 循环引用自身 if (!now_dts) { now_dts = frame->dts(); selected_index = frame->getIndex(); } - if (frame->getIndex() == selected_index && now_dts + forward_time_ms < frame->dts()) { + // 新增兜底机制,如果直播录制任务时长超过预期时间3秒,不管数据时间戳是否增长是否达到预期,都强制停止录制 + if ((frame->getIndex() == selected_index && now_dts + forward_time_ms < frame->dts()) || (is_live_stream && ticker.createdTime() > forward_time_ms + 3000)) { InfoL << "stop record: " << path << ", end dts: " << frame->dts(); WorkThreadPool::Instance().getPoller()->async([muxer]() { muxer->closeMP4(); }); reader = nullptr;