From 214cc4c505cbd72bb8229e592203be728eaf18ef Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Fri, 16 Nov 2018 15:46:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9C=89=E4=BA=9Brtmp?= =?UTF-8?q?=E5=8C=85FFmpeg=E6=97=A0=E6=B3=95=E8=A7=A3=E7=A0=81=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/RtmpMuxer/H264RtmpCodec.cpp | 43 ++++++++++++++++++--------------- src/RtmpMuxer/H264RtmpCodec.h | 1 + 2 files changed, 25 insertions(+), 19 deletions(-) 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