From d6fc56d95012dd63ccbbbf73a799af0d530516af Mon Sep 17 00:00:00 2001 From: xia-chu <771730766@qq.com> Date: Thu, 4 Feb 2021 18:14:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=88=B3=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E6=97=B6,=E7=A1=AE=E4=BF=9D=E5=90=88=E5=B9=B6=E5=B8=A7?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E6=AD=A3=E5=B8=B8=EF=BC=9A#724?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Rtp/Decoder.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/Rtp/Decoder.cpp b/src/Rtp/Decoder.cpp index a2e3f88a..dcf1ba0d 100644 --- a/src/Rtp/Decoder.cpp +++ b/src/Rtp/Decoder.cpp @@ -101,7 +101,17 @@ static const char *getCodecName(int codec_id) { } void FrameMerger::inputFrame(const Frame::Ptr &frame,const function &cb){ - if (!_frameCached.empty() && _frameCached.back()->dts() != frame->dts()) { + bool flush = false; + switch (frame->getCodecId()) { + case CodecH264: + case CodecH265:{ + //如果是新的一帧,前面的缓存需要输出 + flush = frame->prefixSize(); + break; + } + default: break; + } + if (!_frameCached.empty() && (flush || _frameCached.back()->dts() != frame->dts())) { Frame::Ptr back = _frameCached.back(); Buffer::Ptr merged_frame = back; if(_frameCached.size() != 1){ @@ -177,7 +187,7 @@ void DecoderImp::onDecode(int stream,int codecid,int flags,int64_t pts,int64_t d switch (codecid) { case PSI_STREAM_H264: { - auto frame = std::make_shared((char *) data, bytes, (uint32_t)dts, (uint32_t)pts,0); + auto frame = std::make_shared((char *) data, bytes, (uint32_t)dts, (uint32_t)pts, prefixSize((char *) data, bytes)); _merger.inputFrame(frame,[this](uint32_t dts, uint32_t pts, const Buffer::Ptr &buffer) { onFrame(std::make_shared >(buffer, dts, pts, prefixSize(buffer->data(), buffer->size()), 0)); }); @@ -185,7 +195,7 @@ void DecoderImp::onDecode(int stream,int codecid,int flags,int64_t pts,int64_t d } case PSI_STREAM_H265: { - auto frame = std::make_shared((char *) data, bytes, (uint32_t)dts, (uint32_t)pts, 0); + auto frame = std::make_shared((char *) data, bytes, (uint32_t)dts, (uint32_t)pts, prefixSize((char *) data, bytes)); _merger.inputFrame(frame,[this](uint32_t dts, uint32_t pts, const Buffer::Ptr &buffer) { onFrame(std::make_shared >(buffer, dts, pts, prefixSize(buffer->data(), buffer->size()), 0)); });