diff --git a/src/Extension/Frame.cpp b/src/Extension/Frame.cpp index 5864908b..f51f5945 100644 --- a/src/Extension/Frame.cpp +++ b/src/Extension/Frame.cpp @@ -192,7 +192,7 @@ bool FrameMerger::willFlush(const Frame::Ptr &frame) const{ switch (frame->getCodecId()) { case CodecH264 : { auto type = H264_TYPE(frame->data()[frame->prefixSize()]); - if (frame->data()[frame->prefixSize()+1]&0x80 !=0 && type >=H264Frame::NAL_B_P && type<=H264Frame::NAL_IDR ) {// sei aud pps sps 不判断 + if ((frame->data()[frame->prefixSize()+1]&0x80) !=0 && type >=H264Frame::NAL_B_P && type<=H264Frame::NAL_IDR ) {// sei aud pps sps 不判断 //264 新一帧的开始,刷新输出 return true; }else{ @@ -202,9 +202,12 @@ bool FrameMerger::willFlush(const Frame::Ptr &frame) const{ break; } case CodecH265 : { - if (H265_TYPE(frame->data()[frame->prefixSize()]) == H265Frame::NAL_TRAIL_R) { - //如果是265的TRAIL_R帧,那么也刷新输出 + auto type = H265_TYPE(frame->data()[frame->prefixSize()]); + if ((type>=H265Frame::NAL_TRAIL_R &&type<= H265Frame::NAL_RSV_IRAP_VCL23) && ( (frame->data()[frame->prefixSize()+2]>>7 & 0x01) != 0)) { + //first_slice_segment_in_pic_flag is frame start return true; + }else{ + return false; } break; } diff --git a/src/Extension/H264Rtmp.cpp b/src/Extension/H264Rtmp.cpp index 47f5192e..b3426fe8 100644 --- a/src/Extension/H264Rtmp.cpp +++ b/src/Extension/H264Rtmp.cpp @@ -183,7 +183,7 @@ void H264RtmpEncoder::inputFrame(const Frame::Ptr &frame) { } } - if(_lastPacket && (_lastPacket->time_stamp != frame->dts() || (pcData[1]&0x80 != 0 && type>=H264Frame::NAL_B_P && type<=H264Frame::NAL_IDR))) { + if(_lastPacket && (_lastPacket->time_stamp != frame->dts() || ((pcData[1]&0x80) != 0 && type>=H264Frame::NAL_B_P && type<=H264Frame::NAL_IDR))) { RtmpCodec::inputRtmp(_lastPacket); _lastPacket = nullptr; } diff --git a/src/Extension/H265.cpp b/src/Extension/H265.cpp index 76df36a7..a4b2dde6 100644 --- a/src/Extension/H265.cpp +++ b/src/Extension/H265.cpp @@ -64,10 +64,11 @@ bool H265Frame::configFrame() const { } bool H265Frame::isKeyFrame(int type, const char *ptr) { - if (!ptr || type != NAL_IDR_W_RADL) { - return type >= NAL_BLA_W_LP && type <= NAL_RSV_IRAP_VCL23; + if(ptr){ + return (((*((uint8_t *) ptr + 2)) >> 7) & 0x01) == 1 && (type == NAL_IDR_N_LP || type == NAL_IDR_W_RADL); } - return (((*((uint8_t *) ptr + 2)) >> 7) & 0x01) == 1; + return false; + } H265Frame::H265Frame(){ diff --git a/src/Extension/H265Rtmp.cpp b/src/Extension/H265Rtmp.cpp index 3a8c32ab..f863b502 100644 --- a/src/Extension/H265Rtmp.cpp +++ b/src/Extension/H265Rtmp.cpp @@ -169,7 +169,7 @@ void H265RtmpEncoder::inputFrame(const Frame::Ptr &frame) { return; } - if (_lastPacket && (_lastPacket->time_stamp != frame->dts() || type == H265Frame::NAL_TRAIL_R)) { + if (_lastPacket && (_lastPacket->time_stamp != frame->dts() || (type >=H264Frame::NAL_B_P && type<=H264Frame::NAL_IDR && (pcData[2]>>7 &0x01) !=0))) { RtmpCodec::inputRtmp(_lastPacket); _lastPacket = nullptr; }