From 0878f776b381280ba0f50f52ed41781993e529d5 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Sun, 6 Sep 2020 18:22:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9F=90=E4=BA=9B=E5=9C=BA?= =?UTF-8?q?=E6=99=AF=E4=B8=8Brtmp=E5=AE=9A=E4=BD=8D=E5=85=B3=E9=94=AE?= =?UTF-8?q?=E5=B8=A7=E4=B8=8D=E5=87=86=E7=A1=AE=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Extension/AACRtmp.cpp | 9 ++++----- src/Extension/AACRtmp.h | 5 ++--- src/Extension/CommonRtmp.cpp | 5 ++--- src/Extension/CommonRtmp.h | 3 +-- src/Extension/H264Rtmp.cpp | 13 ++++--------- src/Extension/H264Rtmp.h | 6 +++--- src/Extension/H265Rtmp.cpp | 13 ++++--------- src/Extension/H265Rtmp.h | 6 +++--- src/Rtmp/RtmpCodec.h | 7 ++----- src/Rtmp/RtmpDemuxer.cpp | 22 ++++++++++------------ src/Rtmp/RtmpDemuxer.h | 3 +-- src/Rtmp/RtmpMediaSource.h | 5 ++--- src/Rtmp/RtmpMediaSourceImp.h | 13 +++++-------- 13 files changed, 43 insertions(+), 67 deletions(-) diff --git a/src/Extension/AACRtmp.cpp b/src/Extension/AACRtmp.cpp index ec9bd7e0..759687d7 100644 --- a/src/Extension/AACRtmp.cpp +++ b/src/Extension/AACRtmp.cpp @@ -29,17 +29,16 @@ static string getAacCfg(const RtmpPacket &thiz) { return ret; } -bool AACRtmpDecoder::inputRtmp(const RtmpPacket::Ptr &pkt, bool) { +void AACRtmpDecoder::inputRtmp(const RtmpPacket::Ptr &pkt) { if (pkt->isCfgFrame()) { _aac_cfg = getAacCfg(*pkt); onGetAAC(nullptr, 0, 0); - return false; + return; } if (!_aac_cfg.empty()) { onGetAAC(pkt->buffer.data() + 2, pkt->buffer.size() - 2, pkt->time_stamp); } - return false; } void AACRtmpDecoder::onGetAAC(const char* data, int len, uint32_t stamp) { @@ -112,7 +111,7 @@ void AACRtmpEncoder::inputFrame(const Frame::Ptr &frame) { rtmpPkt->stream_index = STREAM_MEDIA; rtmpPkt->time_stamp = frame->dts(); rtmpPkt->type_id = MSG_AUDIO; - RtmpCodec::inputRtmp(rtmpPkt, false); + RtmpCodec::inputRtmp(rtmpPkt); } } @@ -133,7 +132,7 @@ void AACRtmpEncoder::makeAudioConfigPkt() { rtmpPkt->stream_index = STREAM_MEDIA; rtmpPkt->time_stamp = 0; rtmpPkt->type_id = MSG_AUDIO; - RtmpCodec::inputRtmp(rtmpPkt, false); + RtmpCodec::inputRtmp(rtmpPkt); } }//namespace mediakit \ No newline at end of file diff --git a/src/Extension/AACRtmp.h b/src/Extension/AACRtmp.h index 2e4ef271..741da220 100644 --- a/src/Extension/AACRtmp.h +++ b/src/Extension/AACRtmp.h @@ -28,10 +28,9 @@ public: /** * 输入Rtmp并解码 - * @param Rtmp Rtmp数据包 - * @param key_pos 此参数内部强制转换为false,请忽略之 + * @param rtmp Rtmp数据包 */ - bool inputRtmp(const RtmpPacket::Ptr &Rtmp, bool key_pos = false) override; + void inputRtmp(const RtmpPacket::Ptr &rtmp) override; CodecId getCodecId() const override{ return CodecAAC; diff --git a/src/Extension/CommonRtmp.cpp b/src/Extension/CommonRtmp.cpp index 783c4f37..41fec6ec 100644 --- a/src/Extension/CommonRtmp.cpp +++ b/src/Extension/CommonRtmp.cpp @@ -29,7 +29,7 @@ void CommonRtmpDecoder::obtainFrame() { _frame->_prefix_size = 0; } -bool CommonRtmpDecoder::inputRtmp(const RtmpPacket::Ptr &rtmp, bool) { +void CommonRtmpDecoder::inputRtmp(const RtmpPacket::Ptr &rtmp) { //拷贝负载 _frame->_buffer.assign(rtmp->buffer.data() + 1, rtmp->buffer.size() - 1); _frame->_dts = rtmp->time_stamp; @@ -37,7 +37,6 @@ bool CommonRtmpDecoder::inputRtmp(const RtmpPacket::Ptr &rtmp, bool) { RtmpCodec::inputFrame(_frame); //创建下一帧 obtainFrame(); - return false; } ///////////////////////////////////////////////////////////////////////////////////// @@ -61,7 +60,7 @@ void CommonRtmpEncoder::inputFrame(const Frame::Ptr &frame) { rtmp->stream_index = STREAM_MEDIA; rtmp->time_stamp = frame->dts(); rtmp->type_id = MSG_AUDIO; - RtmpCodec::inputRtmp(rtmp, false); + RtmpCodec::inputRtmp(rtmp); } }//namespace mediakit \ No newline at end of file diff --git a/src/Extension/CommonRtmp.h b/src/Extension/CommonRtmp.h index b65e9209..1f676507 100644 --- a/src/Extension/CommonRtmp.h +++ b/src/Extension/CommonRtmp.h @@ -39,9 +39,8 @@ public: /** * 输入Rtmp并解码 * @param rtmp Rtmp数据包 - * @param key_pos 此参数内部强制转换为false,请忽略之 */ - bool inputRtmp(const RtmpPacket::Ptr &rtmp, bool key_pos = false) override; + void inputRtmp(const RtmpPacket::Ptr &rtmp) override; private: void obtainFrame(); diff --git a/src/Extension/H264Rtmp.cpp b/src/Extension/H264Rtmp.cpp index 9a24a8b9..c1a94b96 100644 --- a/src/Extension/H264Rtmp.cpp +++ b/src/Extension/H264Rtmp.cpp @@ -23,10 +23,6 @@ H264Frame::Ptr H264RtmpDecoder::obtainFrame() { return frame; } -bool H264RtmpDecoder::inputRtmp(const RtmpPacket::Ptr &rtmp, bool key_pos) { - return decodeRtmp(rtmp); -} - /** * 返回不带0x00 00 00 01头的sps * @return @@ -90,14 +86,14 @@ static string getH264PPS(const RtmpPacket &thiz) { return ret; } -bool H264RtmpDecoder::decodeRtmp(const RtmpPacket::Ptr &pkt) { +void H264RtmpDecoder::inputRtmp(const RtmpPacket::Ptr &pkt) { if (pkt->isCfgFrame()) { //缓存sps pps,后续插入到I帧之前 _sps = getH264SPS(*pkt); _pps = getH264PPS(*pkt); onGetH264(_sps.data(), _sps.size(), pkt->time_stamp , pkt->time_stamp); onGetH264(_pps.data(), _pps.size(), pkt->time_stamp , pkt->time_stamp); - return false; + return; } if (pkt->buffer.size() > 9) { @@ -119,7 +115,6 @@ bool H264RtmpDecoder::decodeRtmp(const RtmpPacket::Ptr &pkt) { iOffset += iFrameLen; } } - return pkt->isVideoKeyFrame(); } inline void H264RtmpDecoder::onGetH264(const char* pcData, int iLen, uint32_t dts,uint32_t pts) { @@ -191,7 +186,7 @@ void H264RtmpEncoder::inputFrame(const Frame::Ptr &frame) { } if(_lastPacket && _lastPacket->time_stamp != frame->dts()) { - RtmpCodec::inputRtmp(_lastPacket, _lastPacket->isVideoKeyFrame()); + RtmpCodec::inputRtmp(_lastPacket); _lastPacket = nullptr; } @@ -259,7 +254,7 @@ void H264RtmpEncoder::makeVideoConfigPkt() { rtmpPkt->stream_index = STREAM_MEDIA; rtmpPkt->time_stamp = 0; rtmpPkt->type_id = MSG_VIDEO; - RtmpCodec::inputRtmp(rtmpPkt, false); + RtmpCodec::inputRtmp(rtmpPkt); } }//namespace mediakit diff --git a/src/Extension/H264Rtmp.h b/src/Extension/H264Rtmp.h index cf8f4dbe..3921fc79 100644 --- a/src/Extension/H264Rtmp.h +++ b/src/Extension/H264Rtmp.h @@ -32,17 +32,17 @@ public: /** * 输入264 Rtmp包 * @param rtmp Rtmp包 - * @param key_pos 此参数忽略之 */ - bool inputRtmp(const RtmpPacket::Ptr &rtmp, bool key_pos = true) override; + void inputRtmp(const RtmpPacket::Ptr &rtmp) override; CodecId getCodecId() const override{ return CodecH264; } + protected: - bool decodeRtmp(const RtmpPacket::Ptr &Rtmp); void onGetH264(const char *pcData, int iLen, uint32_t dts,uint32_t pts); H264Frame::Ptr obtainFrame(); + protected: H264Frame::Ptr _h264frame; string _sps; diff --git a/src/Extension/H265Rtmp.cpp b/src/Extension/H265Rtmp.cpp index f91d83f2..dddf5379 100644 --- a/src/Extension/H265Rtmp.cpp +++ b/src/Extension/H265Rtmp.cpp @@ -27,10 +27,6 @@ H265Frame::Ptr H265RtmpDecoder::obtainFrame() { return frame; } -bool H265RtmpDecoder::inputRtmp(const RtmpPacket::Ptr &rtmp, bool key_pos) { - return decodeRtmp(rtmp); -} - #ifdef ENABLE_MP4 /** * 返回不带0x00 00 00 01头的sps @@ -65,7 +61,7 @@ static bool getH265ConfigFrame(const RtmpPacket &thiz,string &frame) { } #endif -bool H265RtmpDecoder::decodeRtmp(const RtmpPacket::Ptr &pkt) { +void H265RtmpDecoder::inputRtmp(const RtmpPacket::Ptr &pkt) { if (pkt->isCfgFrame()) { #ifdef ENABLE_MP4 string config; @@ -75,7 +71,7 @@ bool H265RtmpDecoder::decodeRtmp(const RtmpPacket::Ptr &pkt) { #else WarnL << "请开启MP4相关功能并使能\"ENABLE_MP4\",否则对H265-RTMP支持不完善"; #endif - return false; + return; } if (pkt->buffer.size() > 9) { @@ -97,7 +93,6 @@ bool H265RtmpDecoder::decodeRtmp(const RtmpPacket::Ptr &pkt) { iOffset += iFrameLen; } } - return pkt->isVideoKeyFrame(); } inline void H265RtmpDecoder::onGetH265(const char* pcData, int iLen, uint32_t dts,uint32_t pts) { @@ -177,7 +172,7 @@ void H265RtmpEncoder::inputFrame(const Frame::Ptr &frame) { } if(_lastPacket && _lastPacket->time_stamp != frame->dts()) { - RtmpCodec::inputRtmp(_lastPacket, _lastPacket->isVideoKeyFrame()); + RtmpCodec::inputRtmp(_lastPacket); _lastPacket = nullptr; } @@ -242,7 +237,7 @@ void H265RtmpEncoder::makeVideoConfigPkt() { rtmpPkt->stream_index = STREAM_MEDIA; rtmpPkt->time_stamp = 0; rtmpPkt->type_id = MSG_VIDEO; - RtmpCodec::inputRtmp(rtmpPkt, false); + RtmpCodec::inputRtmp(rtmpPkt); #else WarnL << "请开启MP4相关功能并使能\"ENABLE_MP4\",否则对H265-RTMP支持不完善"; #endif diff --git a/src/Extension/H265Rtmp.h b/src/Extension/H265Rtmp.h index 4a151251..c46396ff 100644 --- a/src/Extension/H265Rtmp.h +++ b/src/Extension/H265Rtmp.h @@ -32,17 +32,17 @@ public: /** * 输入265 Rtmp包 * @param rtmp Rtmp包 - * @param key_pos 此参数忽略之 */ - bool inputRtmp(const RtmpPacket::Ptr &rtmp, bool key_pos = true) override; + void inputRtmp(const RtmpPacket::Ptr &rtmp) override; CodecId getCodecId() const override{ return CodecH265; } + protected: - bool decodeRtmp(const RtmpPacket::Ptr &Rtmp); void onGetH265(const char *pcData, int iLen, uint32_t dts,uint32_t pts); H265Frame::Ptr obtainFrame(); + protected: H265Frame::Ptr _h265frame; }; diff --git a/src/Rtmp/RtmpCodec.h b/src/Rtmp/RtmpCodec.h index 29cdc768..15a4496a 100644 --- a/src/Rtmp/RtmpCodec.h +++ b/src/Rtmp/RtmpCodec.h @@ -45,14 +45,11 @@ public: /** * 输入rtmp包 * @param rtmp rtmp包 - * @param key_pos 是否为关键帧 - * @return 是否为关键帧 */ - virtual bool inputRtmp(const RtmpPacket::Ptr &rtmp, bool key_pos) { + virtual void inputRtmp(const RtmpPacket::Ptr &rtmp) { if (_rtmpRing) { - _rtmpRing->write(rtmp, key_pos); + _rtmpRing->write(rtmp, rtmp->isVideoKeyFrame()); } - return key_pos; } protected: diff --git a/src/Rtmp/RtmpDemuxer.cpp b/src/Rtmp/RtmpDemuxer.cpp index f50c4920..53ce4c87 100644 --- a/src/Rtmp/RtmpDemuxer.cpp +++ b/src/Rtmp/RtmpDemuxer.cpp @@ -65,34 +65,32 @@ bool RtmpDemuxer::loadMetaData(const AMFValue &val){ return ret; } -bool RtmpDemuxer::inputRtmp(const RtmpPacket::Ptr &pkt) { +void RtmpDemuxer::inputRtmp(const RtmpPacket::Ptr &pkt) { switch (pkt->type_id) { case MSG_VIDEO: { - if(!_try_get_video_track){ + if (!_try_get_video_track) { _try_get_video_track = true; auto codec = AMFValue(pkt->getMediaType()); makeVideoTrack(codec); } - if(_video_rtmp_decoder){ - return _video_rtmp_decoder->inputRtmp(pkt, true); + if (_video_rtmp_decoder) { + _video_rtmp_decoder->inputRtmp(pkt); } - return false; + break; } case MSG_AUDIO: { - if(!_try_get_audio_track) { + if (!_try_get_audio_track) { _try_get_audio_track = true; auto codec = AMFValue(pkt->getMediaType()); makeAudioTrack(codec, pkt->getAudioSampleRate(), pkt->getAudioChannel(), pkt->getAudioSampleBit()); } - if(_audio_rtmp_decoder){ - _audio_rtmp_decoder->inputRtmp(pkt, false); - return false; + if (_audio_rtmp_decoder) { + _audio_rtmp_decoder->inputRtmp(pkt); } - return false; + break; } - default: - return false; + default : break; } } diff --git a/src/Rtmp/RtmpDemuxer.h b/src/Rtmp/RtmpDemuxer.h index 90f98cff..253cad69 100644 --- a/src/Rtmp/RtmpDemuxer.h +++ b/src/Rtmp/RtmpDemuxer.h @@ -35,9 +35,8 @@ public: /** * 开始解复用 * @param pkt rtmp包 - * @return true 代表是i帧 */ - bool inputRtmp(const RtmpPacket::Ptr &pkt); + void inputRtmp(const RtmpPacket::Ptr &pkt); private: void makeVideoTrack(const AMFValue &val); diff --git a/src/Rtmp/RtmpMediaSource.h b/src/Rtmp/RtmpMediaSource.h index f37918e3..284ef686 100644 --- a/src/Rtmp/RtmpMediaSource.h +++ b/src/Rtmp/RtmpMediaSource.h @@ -117,9 +117,8 @@ public: /** * 输入rtmp包 * @param pkt rtmp包 - * @param key 是否为关键帧 */ - void onWrite(const RtmpPacket::Ptr &pkt, bool key = true) override { + void onWrite(const RtmpPacket::Ptr &pkt, bool = true) override { //保存当前时间戳 switch (pkt->type_id) { case MSG_VIDEO : _track_stamps[TrackVideo] = pkt->time_stamp, _have_video = true; break; @@ -152,7 +151,7 @@ public: regist(); } } - PacketCache::inputPacket(pkt->type_id == MSG_VIDEO, pkt, key); + PacketCache::inputPacket(pkt->type_id == MSG_VIDEO, pkt, pkt->isVideoKeyFrame()); } /** diff --git a/src/Rtmp/RtmpMediaSourceImp.h b/src/Rtmp/RtmpMediaSourceImp.h index 9517b384..f9695330 100644 --- a/src/Rtmp/RtmpMediaSourceImp.h +++ b/src/Rtmp/RtmpMediaSourceImp.h @@ -60,15 +60,12 @@ public: /** * 输入rtmp并解析 */ - void onWrite(const RtmpPacket::Ptr &pkt,bool key_pos = true) override { - if (_all_track_ready && !_muxer->isEnabled()) { - //获取到所有Track后,并且未开启转协议,那么不需要解复用rtmp - key_pos = pkt->isVideoKeyFrame(); - } else { - //需要解复用rtmp - key_pos = _demuxer->inputRtmp(pkt); + void onWrite(const RtmpPacket::Ptr &pkt, bool = true) override { + if (!_all_track_ready || _muxer->isEnabled()) { + //未获取到所有Track后,或者开启转协议,那么需要解复用rtmp + _demuxer->inputRtmp(pkt); } - RtmpMediaSource::onWrite(pkt, key_pos); + RtmpMediaSource::onWrite(pkt); } /**