From 276f763c089ae5d27339bf243ba3c99440035d29 Mon Sep 17 00:00:00 2001 From: alexliyu7352 Date: Sat, 12 Mar 2022 09:39:33 +0800 Subject: [PATCH] =?UTF-8?q?hls=E6=8B=89=E6=B5=81=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E5=88=87=E7=89=87=E8=B6=85=E6=97=B6=E6=97=B6?= =?UTF-8?q?=E9=97=B4=20(#1477)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 动态计算切片超时时间 设置最大超时时间倍数和最小倍数,然后根据上一个切片的下载情况动态增加或者减少切片的超时时间. * Update HlsPlayer.cpp --- src/Http/HlsPlayer.cpp | 9 +++++++-- src/Http/HlsPlayer.h | 4 ++++ 2 files changed, 11 insertions(+), 2 deletions(-) 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 {