From b9006a90d44641e3cb960fb50bfe5ec2008d36df Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Thu, 11 Jun 2020 17:40:09 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96rtmp=E6=8E=A8=E6=B5=81?= =?UTF-8?q?=E6=97=B6=EF=BC=8Caac=20config=E8=8E=B7=E5=8F=96=E4=B8=8D?= =?UTF-8?q?=E5=AE=8C=E6=95=B4=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Extension/AAC.h | 13 ++++++++++--- src/Extension/AACRtmp.cpp | 25 ++++++++++++++++--------- src/Extension/AACRtmp.h | 11 +++++++---- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/Extension/AAC.h b/src/Extension/AAC.h index d53b7f49..6a3bd8ba 100644 --- a/src/Extension/AAC.h +++ b/src/Extension/AAC.h @@ -71,10 +71,17 @@ public: /** * 构造aac类型的媒体 - * @param aac_cfg aac两个字节的配置信息 + * @param aac_cfg aac配置信息 */ AACTrack(const string &aac_cfg){ - if(aac_cfg.size() < 2){ + setAacCfg(aac_cfg); + } + + /** + * 设置aac 配置信息 + */ + void setAacCfg(const string &aac_cfg){ + if (aac_cfg.size() < 2) { throw std::invalid_argument("adts配置必须最少2个字节"); } _cfg = aac_cfg; @@ -82,7 +89,7 @@ public: } /** - * 获取aac两个字节的配置 + * 获取aac 配置信息 */ const string &getAacCfg() const{ return _cfg; diff --git a/src/Extension/AACRtmp.cpp b/src/Extension/AACRtmp.cpp index 2009dbc9..05a5af52 100644 --- a/src/Extension/AACRtmp.cpp +++ b/src/Extension/AACRtmp.cpp @@ -13,8 +13,9 @@ namespace mediakit{ -AACRtmpDecoder::AACRtmpDecoder() { - _adts = obtainFrame(); +AACRtmpDecoder::AACRtmpDecoder(const Track::Ptr &track) { + _frame = obtainFrame(); + _track = dynamic_pointer_cast(track); } AACFrame::Ptr AACRtmpDecoder::obtainFrame() { @@ -38,13 +39,19 @@ static string getAacCfg(const RtmpPacket &thiz) { WarnL << "bad aac cfg!"; return ret; } - ret = thiz.strBuf.substr(2, 2); + ret = thiz.strBuf.substr(2); return ret; } bool AACRtmpDecoder::inputRtmp(const RtmpPacket::Ptr &pkt, bool) { if (pkt->isCfgFrame()) { _aac_cfg = getAacCfg(*pkt); + if (_track) { + //设置aac config + _track->setAacCfg(_aac_cfg); + //不再强引用 + _track = nullptr; + } return false; } if (!_aac_cfg.empty()) { @@ -54,20 +61,20 @@ bool AACRtmpDecoder::inputRtmp(const RtmpPacket::Ptr &pkt, bool) { } void AACRtmpDecoder::onGetAAC(const char* data, int len, uint32_t stamp) { - _adts->_dts = stamp; + _frame->_dts = stamp; //先追加数据 - _adts->_buffer.append(data, len); + _frame->_buffer.append(data, len); //覆盖adts头 - dumpAacConfig(_aac_cfg, _adts->size(), (uint8_t *) _adts->data()); + dumpAacConfig(_aac_cfg, _frame->size(), (uint8_t *) _frame->data()); //写入环形缓存 - RtmpCodec::inputFrame(_adts); - _adts = obtainFrame(); + RtmpCodec::inputFrame(_frame); + _frame = obtainFrame(); } ///////////////////////////////////////////////////////////////////////////////////// -AACRtmpEncoder::AACRtmpEncoder(const Track::Ptr &track) { +AACRtmpEncoder::AACRtmpEncoder(const Track::Ptr &track): AACRtmpDecoder(track) { _track = dynamic_pointer_cast(track); } diff --git a/src/Extension/AACRtmp.h b/src/Extension/AACRtmp.h index 653ac122..0f5d2f4b 100644 --- a/src/Extension/AACRtmp.h +++ b/src/Extension/AACRtmp.h @@ -23,7 +23,7 @@ class AACRtmpDecoder : public RtmpCodec , public ResourcePoolHelper { public: typedef std::shared_ptr Ptr; - AACRtmpDecoder(); + AACRtmpDecoder(const Track::Ptr &track); ~AACRtmpDecoder() {} /** @@ -38,10 +38,12 @@ public: } protected: - void onGetAAC(const char* data, int len, uint32_t stamp); + void onGetAAC(const char *data, int len, uint32_t stamp); AACFrame::Ptr obtainFrame(); + protected: - AACFrame::Ptr _adts; + AACFrame::Ptr _frame; + AACTrack::Ptr _track; string _aac_cfg; }; @@ -72,11 +74,12 @@ public: * 生成config包 */ void makeConfigPacket() override; + private: void makeAudioConfigPkt(); + private: uint8_t _audio_flv_flags; - AACTrack::Ptr _track; }; }//namespace mediakit