diff --git a/src/Http/HlsPlayer.cpp b/src/Http/HlsPlayer.cpp index 946cb29e..42e0d9d7 100644 --- a/src/Http/HlsPlayer.cpp +++ b/src/Http/HlsPlayer.cpp @@ -104,6 +104,11 @@ void HlsPlayer::fetchSegment() { } if (err) { WarnL << "download ts segment " << url << " failed:" << err.what(); + if (err.getErrCode() == Err_timeout) { + strong_self->_timeout_multiple = MAX(strong_self->_timeout_multiple + 1, MAX_TIMEOUT_MULTIPLE); + }else{ + strong_self->_timeout_multiple = MAX(strong_self->_timeout_multiple -1 , MIN_TIMEOUT_MULTIPLE); + } } //提前半秒下载好 auto delay = duration - ticker.elapsedTime() / 1000.0f - 0.5; @@ -122,8 +127,8 @@ void HlsPlayer::fetchSegment() { }); _http_ts_player->setMethod("GET"); - //ts切片必须在其时长的3倍内下载完毕 - _http_ts_player->setCompleteTimeout(3 * duration * 1000); + //ts切片必须在其时长的2-5倍内下载完毕 + _http_ts_player->setCompleteTimeout(_timeout_multiple * duration * 1000); _http_ts_player->sendRequest(url); } diff --git a/src/Http/HlsPlayer.h b/src/Http/HlsPlayer.h index dd69e3bc..4ffb143c 100644 --- a/src/Http/HlsPlayer.h +++ b/src/Http/HlsPlayer.h @@ -17,6 +17,9 @@ #include "HlsParser.h" #include "Rtp/TSDecoder.h" +#define MIN_TIMEOUT_MULTIPLE 2 +#define MAX_TIMEOUT_MULTIPLE 5 + namespace mediakit { class HlsDemuxer : public MediaSinkInterface , public TrackSource, public std::enable_shared_from_this { @@ -101,6 +104,7 @@ private: std::list _ts_url_sort; std::set _ts_url_cache; HttpTSPlayer::Ptr _http_ts_player; + int _timeout_multiple = MIN_TIMEOUT_MULTIPLE; }; class HlsPlayerImp : public PlayerImp, private TrackListener {