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)); });