diff --git a/conf/config.ini b/conf/config.ini index 713a52be..a92210fa 100644 --- a/conf/config.ini +++ b/conf/config.ini @@ -80,6 +80,14 @@ ts_demand=0 #http[s]-fmp4、ws[s]-fmp4协议是否按需生成 fmp4_demand=0 +#最多等待未初始化的Track时间,单位毫秒,超时之后会忽略未初始化的Track +wait_track_ready_ms=10000 +#如果流只有单Track,最多等待若干毫秒,超时后未收到其他Track的数据,则认为是单Track +#如果协议元数据有声明特定track数,那么无此等待时间 +wait_add_track_ms=3000 +#如果track未就绪,我们先缓存帧数据,但是有最大个数限制,防止内存溢出 +unready_frame_cache=100 + [hls] #hls写文件的buf大小,调整参数可以提高文件io性能 fileBufSize=65536 diff --git a/src/Common/MediaSink.cpp b/src/Common/MediaSink.cpp index dd1d2146..f5146707 100644 --- a/src/Common/MediaSink.cpp +++ b/src/Common/MediaSink.cpp @@ -11,15 +11,6 @@ #include "MediaSink.h" #include "Extension/AAC.h" -//最多等待未初始化的Track 10秒,超时之后会忽略未初始化的Track -static size_t constexpr kMaxWaitReadyMS= 10000; - -//如果直播流只有单Track,最多等待3秒,超时后未收到其他Track的数据,则认为是单Track -static size_t constexpr kMaxAddTrackMS = 3000; - -//如果track未就绪,我们先缓存帧数据,但是有最大个数限制(100帧时大约4秒),防止内存溢出 -static size_t constexpr kMaxUnreadyFrame = 100; - namespace mediakit{ bool MediaSink::addTrack(const Track::Ptr &track_in) { @@ -50,6 +41,8 @@ bool MediaSink::addTrack(const Track::Ptr &track_in) { return onTrackFrame(frame); } auto &frame_unread = _frame_unread[frame->getTrackType()]; + + GET_CONFIG(uint32_t, kMaxUnreadyFrame, General::kUnreadyFrameCache); if (frame_unread.size() > kMaxUnreadyFrame) { //未就绪的的track,不能缓存太多的帧,否则可能内存溢出 frame_unread.clear(); @@ -102,6 +95,7 @@ void MediaSink::checkTrackIfReady(){ } if(!_all_track_ready){ + GET_CONFIG(uint32_t, kMaxWaitReadyMS, General::kWaitTrackReadyMS); if(_ticker.elapsedTime() > kMaxWaitReadyMS){ //如果超过规定时间,那么不再等待并忽略未准备好的Track emitAllTrackReady(); @@ -119,6 +113,7 @@ void MediaSink::checkTrackIfReady(){ return; } + GET_CONFIG(uint32_t, kMaxAddTrackMS, General::kWaitAddTrackMS); if(_track_map.size() == 1 && _ticker.elapsedTime() > kMaxAddTrackMS){ //如果只有一个Track,那么在该Track添加后,我们最多还等待若干时间(可能后面还会添加Track) emitAllTrackReady(); diff --git a/src/Common/config.cpp b/src/Common/config.cpp index 1659a451..98ce831e 100644 --- a/src/Common/config.cpp +++ b/src/Common/config.cpp @@ -75,6 +75,9 @@ const string kRtmpDemand = GENERAL_FIELD"rtmp_demand"; const string kTSDemand = GENERAL_FIELD"ts_demand"; const string kFMP4Demand = GENERAL_FIELD"fmp4_demand"; const string kEnableAudio = GENERAL_FIELD"enable_audio"; +const string kWaitTrackReadyMS = GENERAL_FIELD"wait_track_ready_ms"; +const string kWaitAddTrackMS = GENERAL_FIELD"wait_add_track_ms"; +const string kUnreadyFrameCache = GENERAL_FIELD"unready_frame_cache"; onceToken token([](){ mINI::Instance()[kFlowThreshold] = 1024; @@ -94,7 +97,9 @@ onceToken token([](){ mINI::Instance()[kTSDemand] = 0; mINI::Instance()[kFMP4Demand] = 0; mINI::Instance()[kEnableAudio] = 1; - + mINI::Instance()[kWaitTrackReadyMS] = 10000; + mINI::Instance()[kWaitAddTrackMS] = 3000; + mINI::Instance()[kUnreadyFrameCache] = 100; },nullptr); }//namespace General diff --git a/src/Common/config.h b/src/Common/config.h index e4c5d76f..ab35a566 100644 --- a/src/Common/config.h +++ b/src/Common/config.h @@ -186,6 +186,13 @@ extern const string kTSDemand; extern const string kFMP4Demand; //转协议是否全局开启或忽略音频 extern const string kEnableAudio; +//最多等待未初始化的Track 10秒,超时之后会忽略未初始化的Track +extern const string kWaitTrackReadyMS; +//如果直播流只有单Track,最多等待3秒,超时后未收到其他Track的数据,则认为是单Track +//如果协议元数据有声明特定track数,那么无此等待时间 +extern const string kWaitAddTrackMS; +//如果track未就绪,我们先缓存帧数据,但是有最大个数限制(100帧时大约4秒),防止内存溢出 +extern const string kUnreadyFrameCache; }//namespace General