diff --git a/src/RtmpMuxer/H264RtmpCodec.cpp b/src/RtmpMuxer/H264RtmpCodec.cpp index 701c3e0c..443ad3be 100644 --- a/src/RtmpMuxer/H264RtmpCodec.cpp +++ b/src/RtmpMuxer/H264RtmpCodec.cpp @@ -153,28 +153,33 @@ void H264RtmpEncoder::inputFrame(const Frame::Ptr &frame) { switch (type){ case H264Frame::NAL_IDR: case H264Frame::NAL_B_P:{ - //I or P or B frame - int8_t flags = 7; //h.264 - bool is_config = false; - bool keyFrame = frame->keyFrame(); - flags |= ((keyFrame ? FLV_KEY_FRAME : FLV_INTER_FRAME) << 4); + if(_lastPacket && _lastPacket->timeStamp != frame->stamp()) { + RtmpCodec::inputRtmp(_lastPacket, _lastPacket->isVideoKeyFrame()); + _lastPacket = nullptr; + } - RtmpPacket::Ptr rtmpPkt = ResourcePoolHelper::obtainObj(); - rtmpPkt->strBuf.clear(); + if(!_lastPacket) { + //I or P or B frame + int8_t flags = 7; //h.264 + bool is_config = false; + flags |= ((frame->keyFrame() ? FLV_KEY_FRAME : FLV_INTER_FRAME) << 4); - rtmpPkt->strBuf.push_back(flags); - rtmpPkt->strBuf.push_back(!is_config); - rtmpPkt->strBuf.append("\x0\x0\x0", 3); + _lastPacket = ResourcePoolHelper::obtainObj(); + _lastPacket->strBuf.clear(); + _lastPacket->strBuf.push_back(flags); + _lastPacket->strBuf.push_back(!is_config); + _lastPacket->strBuf.append("\x0\x0\x0", 3); + + _lastPacket->chunkId = CHUNK_VIDEO; + _lastPacket->streamId = STREAM_MEDIA; + _lastPacket->timeStamp = frame->stamp(); + _lastPacket->typeId = MSG_VIDEO; + + } auto size = htonl(iLen); - rtmpPkt->strBuf.append((char *) &size, 4); - rtmpPkt->strBuf.append(pcData, iLen); - - rtmpPkt->bodySize = rtmpPkt->strBuf.size(); - rtmpPkt->chunkId = CHUNK_VIDEO; - rtmpPkt->streamId = STREAM_MEDIA; - rtmpPkt->timeStamp = frame->stamp(); - rtmpPkt->typeId = MSG_VIDEO; - RtmpCodec::inputRtmp(rtmpPkt,keyFrame); + _lastPacket->strBuf.append((char *) &size, 4); + _lastPacket->strBuf.append(pcData, iLen); + _lastPacket->bodySize = _lastPacket->strBuf.size(); } break; diff --git a/src/RtmpMuxer/H264RtmpCodec.h b/src/RtmpMuxer/H264RtmpCodec.h index aef99fcd..5d08081a 100644 --- a/src/RtmpMuxer/H264RtmpCodec.h +++ b/src/RtmpMuxer/H264RtmpCodec.h @@ -95,6 +95,7 @@ private: private: H264Track::Ptr _track; bool _gotSpsPps = false; + RtmpPacket::Ptr _lastPacket; }; }//namespace mediakit