diff --git a/src/Extension/H264Rtmp.cpp b/src/Extension/H264Rtmp.cpp index 6765b476..f3c7734c 100644 --- a/src/Extension/H264Rtmp.cpp +++ b/src/Extension/H264Rtmp.cpp @@ -182,8 +182,8 @@ void H264RtmpEncoder::inputFrame(const Frame::Ptr &frame) { break; } } - if((frame->configFrame() || frame->keyFrame()) && _lastPacket){ - // key frame or sps pps flush frame + if(frame->configFrame() && _lastPacket &&_lastPacketHasVCL){ + //sps pps flush frame RtmpCodec::inputRtmp(_lastPacket); _lastPacket = nullptr; _lastPacketHasVCL = false; diff --git a/src/Extension/H265Rtmp.cpp b/src/Extension/H265Rtmp.cpp index 84dddad6..cc46905b 100644 --- a/src/Extension/H265Rtmp.cpp +++ b/src/Extension/H265Rtmp.cpp @@ -169,9 +169,21 @@ void H265RtmpEncoder::inputFrame(const Frame::Ptr &frame) { return;// 防止sei aud 作为一帧 } - if (_lastPacket && (_lastPacket->time_stamp != frame->dts() || (type >=H264Frame::NAL_B_P && type<=H264Frame::NAL_IDR && (pcData[2]>>7 &0x01) !=0))) { + if(frame->configFrame() && _lastPacket &&_lastPacketHasVCL){ + // sps pps flush frame RtmpCodec::inputRtmp(_lastPacket); _lastPacket = nullptr; + _lastPacketHasVCL = false; + } + + if (_lastPacket && (_lastPacket->time_stamp != frame->dts() || (_lastPacketHasVCL &&type>=H265Frame::NAL_TRAIL_R &&type<= H265Frame::NAL_RSV_IRAP_VCL23 && (pcData[2]>>7 &0x01) !=0))) { + RtmpCodec::inputRtmp(_lastPacket); + _lastPacket = nullptr; + _lastPacketHasVCL = false; + } + + if(type>=H265Frame::NAL_TRAIL_R &&type<= H265Frame::NAL_RSV_IRAP_VCL23){ + _lastPacketHasVCL = true; } if(!_lastPacket) { diff --git a/src/Extension/H265Rtmp.h b/src/Extension/H265Rtmp.h index e4f97a08..6ba0f8a1 100644 --- a/src/Extension/H265Rtmp.h +++ b/src/Extension/H265Rtmp.h @@ -84,6 +84,7 @@ private: string _pps; H265Track::Ptr _track; RtmpPacket::Ptr _lastPacket; + bool _lastPacketHasVCL = false; }; }//namespace mediakit