Commit b9006a90 by xiongziliang

优化rtmp推流时,aac config获取不完整的bug

parent 0e47dc94
...@@ -71,10 +71,17 @@ public: ...@@ -71,10 +71,17 @@ public:
/** /**
* 构造aac类型的媒体 * 构造aac类型的媒体
* @param aac_cfg aac两个字节的配置信息 * @param aac_cfg aac配置信息
*/ */
AACTrack(const string &aac_cfg){ 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个字节"); throw std::invalid_argument("adts配置必须最少2个字节");
} }
_cfg = aac_cfg; _cfg = aac_cfg;
...@@ -82,7 +89,7 @@ public: ...@@ -82,7 +89,7 @@ public:
} }
/** /**
* 获取aac两个字节的配置 * 获取aac 配置信息
*/ */
const string &getAacCfg() const{ const string &getAacCfg() const{
return _cfg; return _cfg;
......
...@@ -13,8 +13,9 @@ ...@@ -13,8 +13,9 @@
namespace mediakit{ namespace mediakit{
AACRtmpDecoder::AACRtmpDecoder() { AACRtmpDecoder::AACRtmpDecoder(const Track::Ptr &track) {
_adts = obtainFrame(); _frame = obtainFrame();
_track = dynamic_pointer_cast<AACTrack>(track);
} }
AACFrame::Ptr AACRtmpDecoder::obtainFrame() { AACFrame::Ptr AACRtmpDecoder::obtainFrame() {
...@@ -38,13 +39,19 @@ static string getAacCfg(const RtmpPacket &thiz) { ...@@ -38,13 +39,19 @@ static string getAacCfg(const RtmpPacket &thiz) {
WarnL << "bad aac cfg!"; WarnL << "bad aac cfg!";
return ret; return ret;
} }
ret = thiz.strBuf.substr(2, 2); ret = thiz.strBuf.substr(2);
return ret; return ret;
} }
bool AACRtmpDecoder::inputRtmp(const RtmpPacket::Ptr &pkt, bool) { bool AACRtmpDecoder::inputRtmp(const RtmpPacket::Ptr &pkt, bool) {
if (pkt->isCfgFrame()) { if (pkt->isCfgFrame()) {
_aac_cfg = getAacCfg(*pkt); _aac_cfg = getAacCfg(*pkt);
if (_track) {
//设置aac config
_track->setAacCfg(_aac_cfg);
//不再强引用
_track = nullptr;
}
return false; return false;
} }
if (!_aac_cfg.empty()) { if (!_aac_cfg.empty()) {
...@@ -54,20 +61,20 @@ bool AACRtmpDecoder::inputRtmp(const RtmpPacket::Ptr &pkt, bool) { ...@@ -54,20 +61,20 @@ bool AACRtmpDecoder::inputRtmp(const RtmpPacket::Ptr &pkt, bool) {
} }
void AACRtmpDecoder::onGetAAC(const char* data, int len, uint32_t stamp) { 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头 //覆盖adts头
dumpAacConfig(_aac_cfg, _adts->size(), (uint8_t *) _adts->data()); dumpAacConfig(_aac_cfg, _frame->size(), (uint8_t *) _frame->data());
//写入环形缓存 //写入环形缓存
RtmpCodec::inputFrame(_adts); RtmpCodec::inputFrame(_frame);
_adts = obtainFrame(); _frame = obtainFrame();
} }
///////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////
AACRtmpEncoder::AACRtmpEncoder(const Track::Ptr &track) { AACRtmpEncoder::AACRtmpEncoder(const Track::Ptr &track): AACRtmpDecoder(track) {
_track = dynamic_pointer_cast<AACTrack>(track); _track = dynamic_pointer_cast<AACTrack>(track);
} }
......
...@@ -23,7 +23,7 @@ class AACRtmpDecoder : public RtmpCodec , public ResourcePoolHelper<AACFrame> { ...@@ -23,7 +23,7 @@ class AACRtmpDecoder : public RtmpCodec , public ResourcePoolHelper<AACFrame> {
public: public:
typedef std::shared_ptr<AACRtmpDecoder> Ptr; typedef std::shared_ptr<AACRtmpDecoder> Ptr;
AACRtmpDecoder(); AACRtmpDecoder(const Track::Ptr &track);
~AACRtmpDecoder() {} ~AACRtmpDecoder() {}
/** /**
...@@ -38,10 +38,12 @@ public: ...@@ -38,10 +38,12 @@ public:
} }
protected: protected:
void onGetAAC(const char* data, int len, uint32_t stamp); void onGetAAC(const char *data, int len, uint32_t stamp);
AACFrame::Ptr obtainFrame(); AACFrame::Ptr obtainFrame();
protected: protected:
AACFrame::Ptr _adts; AACFrame::Ptr _frame;
AACTrack::Ptr _track;
string _aac_cfg; string _aac_cfg;
}; };
...@@ -72,11 +74,12 @@ public: ...@@ -72,11 +74,12 @@ public:
* 生成config包 * 生成config包
*/ */
void makeConfigPacket() override; void makeConfigPacket() override;
private: private:
void makeAudioConfigPkt(); void makeAudioConfigPkt();
private: private:
uint8_t _audio_flv_flags; uint8_t _audio_flv_flags;
AACTrack::Ptr _track;
}; };
}//namespace mediakit }//namespace mediakit
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论