From a35444f27e3c27be68f69f0a7dd6e79e3a1ab6da Mon Sep 17 00:00:00 2001 From: xia-chu <771730766@qq.com> Date: Sun, 29 Jun 2025 18:00:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96SEI/AUD=E5=B8=A7=E5=A4=84?= =?UTF-8?q?=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ext-codec/H264.cpp | 6 +++++- src/Extension/Frame.cpp | 14 +++++++++++++- src/Extension/Frame.h | 2 ++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/ext-codec/H264.cpp b/ext-codec/H264.cpp index 38c1d9bc..72605812 100644 --- a/ext-codec/H264.cpp +++ b/ext-codec/H264.cpp @@ -153,7 +153,11 @@ bool H264Track::ready() const { bool H264Track::inputFrame(const Frame::Ptr &frame) { using H264FrameInternal = FrameInternal; int type = H264_TYPE(frame->data()[frame->prefixSize()]); - + if (type == H264Frame::NAL_AUD) { + // AUD帧丢弃 + return false; + } + if ((type == H264Frame::NAL_B_P || type == H264Frame::NAL_IDR) && ready()) { return inputFrame_l(frame); } diff --git a/src/Extension/Frame.cpp b/src/Extension/Frame.cpp index 63891ce6..899c0e9f 100644 --- a/src/Extension/Frame.cpp +++ b/src/Extension/Frame.cpp @@ -205,7 +205,11 @@ bool FrameMerger::willFlush(const Frame::Ptr &frame) const{ case mp4_nal_size: case h264_prefix: { - if (!_have_decode_able_frame) { + if (frame->dropAble() && !_have_config_frame) { + // 遇到SEI帧且未缓存配置帧,flush之前的帧 + return true; + } + if (!_have_decode_able_frame && !_have_drop_able_frame) { // 缓存中没有有效的能解码的帧,所以这次不flush [AUTO-TRANSLATED:5d860722] // There are no valid frames that can be decoded in the cache, so no flush this time. return _frame_cache.size() > kMaxFrameCacheSize; @@ -290,6 +294,8 @@ bool FrameMerger::inputFrame(const Frame::Ptr &frame, onOutput cb, BufferLikeStr cb(back->dts(), back->pts(), merged_frame, have_key_frame); _frame_cache.clear(); _have_decode_able_frame = false; + _have_drop_able_frame = false; + _have_config_frame = false; } if (!frame) { @@ -299,6 +305,12 @@ bool FrameMerger::inputFrame(const Frame::Ptr &frame, onOutput cb, BufferLikeStr if (frame->decodeAble()) { _have_decode_able_frame = true; } + if (frame->dropAble()) { + _have_drop_able_frame = true; + } + if (frame->configFrame()) { + _have_config_frame = true; + } _cb = std::move(cb); _frame_cache.emplace_back(Frame::getCacheAbleFrame(frame)); return true; diff --git a/src/Extension/Frame.h b/src/Extension/Frame.h index 99d665fe..b394fe81 100644 --- a/src/Extension/Frame.h +++ b/src/Extension/Frame.h @@ -660,6 +660,8 @@ private: private: int _type; bool _have_decode_able_frame = false; + bool _have_drop_able_frame = false; + bool _have_config_frame = false; onOutput _cb; toolkit::List _frame_cache; };