diff --git a/src/Extension/Frame.cpp b/src/Extension/Frame.cpp index f51f5945..62753f59 100644 --- a/src/Extension/Frame.cpp +++ b/src/Extension/Frame.cpp @@ -244,8 +244,33 @@ void FrameMerger::doMerge(BufferLikeString &merged, const Frame::Ptr &frame) con default: /*不可达*/ assert(0); break; } } - +bool FrameMerger::shouldDrop(const Frame::Ptr &frame) const{ + switch (frame->getCodecId()) { + case CodecH264:{ + auto type = H264_TYPE(frame->data()[frame->prefixSize()]); + if(type == H264Frame::NAL_SEI || type == H264Frame::NAL_AUD){ + // 防止吧AUD或者SEI当成一帧 + return true; + } + break; + } + case CodecH265: { + //如果是新的一帧,前面的缓存需要输出 + auto type = H265_TYPE(frame->data()[frame->prefixSize()]); + if(type == H265Frame::NAL_AUD || type == H265Frame::NAL_SEI_PREFIX || type == H265Frame::NAL_SEI_SUFFIX){ + // 防止吧AUD或者SEI当成一帧 + return true; + } + break; + } + default: break; + } + return false; +} void FrameMerger::inputFrame(const Frame::Ptr &frame, const onOutput &cb) { + if(shouldDrop(frame)){ + return; + } if (willFlush(frame)) { Frame::Ptr back = _frameCached.back(); Buffer::Ptr merged_frame = back; diff --git a/src/Extension/Frame.h b/src/Extension/Frame.h index ca8a2b39..95a5ec6d 100644 --- a/src/Extension/Frame.h +++ b/src/Extension/Frame.h @@ -475,6 +475,7 @@ public: private: bool willFlush(const Frame::Ptr &frame) const; void doMerge(BufferLikeString &buffer, const Frame::Ptr &frame) const; + bool shouldDrop(const Frame::Ptr &frame) const; private: int _type; diff --git a/src/Extension/H265Rtmp.cpp b/src/Extension/H265Rtmp.cpp index f863b502..84dddad6 100644 --- a/src/Extension/H265Rtmp.cpp +++ b/src/Extension/H265Rtmp.cpp @@ -165,8 +165,8 @@ void H265RtmpEncoder::inputFrame(const Frame::Ptr &frame) { } } - if(type == H265Frame::NAL_SEI_PREFIX || type == H265Frame::NAL_SEI_SUFFIX){ - return; + if(type == H265Frame::NAL_SEI_PREFIX || type == H265Frame::NAL_SEI_SUFFIX || type == H265Frame::NAL_AUD){ + return;// 防止sei aud 作为一帧 } if (_lastPacket && (_lastPacket->time_stamp != frame->dts() || (type >=H264Frame::NAL_B_P && type<=H264Frame::NAL_IDR && (pcData[2]>>7 &0x01) !=0))) {