From 98816aebadc3e748a5623922663892774a347b13 Mon Sep 17 00:00:00 2001 From: AlphaWu Date: Mon, 9 May 2022 03:13:38 +0000 Subject: [PATCH 1/2] =?UTF-8?q?!14=20=E5=A2=9E=E5=8A=A0=E9=95=BF=E6=9C=9F?= =?UTF-8?q?=E4=BF=9D=E5=AD=98hls=E5=88=87=E7=89=87=E5=8A=9F=E8=83=BD=20*?= =?UTF-8?q?=20=E5=A2=9E=E5=8A=A0=E9=95=BF=E6=9C=9F=E4=BF=9D=E5=AD=98hls?= =?UTF-8?q?=E5=88=87=E7=89=87=E7=9A=84=E5=8A=9F=E8=83=BD=EF=BC=8CsegKeep?= =?UTF-8?q?=3D0=E4=B8=BA=E4=B8=8D=E9=95=BF=E6=9C=9F=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=EF=BC=8CsegKeep=3D1=E4=B8=BA=E9=95=BF=E6=9C=9F=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E3=80=82=E6=AD=A4=E5=8A=9F=E8=83=BD=E9=83=A8=E5=88=86?= =?UTF-8?q?=E7=AD=89=E6=95=88=E4=BA=8EsegNum=3D0=E7=9A=84=E6=83=85?= =?UTF-8?q?=E5=86=B5=EF=BC=8C=E4=B8=8D=E5=90=8C=E7=9A=84=E6=98=AF=E2=80=A6?= =?UTF-8?q?=20*=20=E5=BF=BD=E7=95=A5Windows=E4=B8=8B=E7=BC=96=E8=AF=91?= =?UTF-8?q?=E7=94=9F=E6=88=90=E7=9A=84out=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ conf/config.ini | 6 +++++- src/Common/config.cpp | 2 ++ src/Common/config.h | 2 ++ src/Record/HlsMaker.cpp | 11 +++++++++-- src/Record/HlsMaker.h | 8 +++++++- src/Record/HlsMakerImp.cpp | 5 +++-- src/Record/HlsMakerImp.h | 3 ++- src/Record/HlsRecorder.h | 3 ++- 9 files changed, 34 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 482e4a61..67a93be5 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,5 @@ /ios/ /cmake-build-* /3rdpart/ZLToolKit/cmake-build-mq/ +/out/ +/CMakeSettings.json diff --git a/conf/config.ini b/conf/config.ini index 28695fcb..b8e4a8fe 100644 --- a/conf/config.ini +++ b/conf/config.ini @@ -111,7 +111,11 @@ segRetain=5 broadcastRecordTs=0 #直播hls文件删除延时,单位秒,issue: #913 deleteDelaySec=0 - +#是否保留hls文件,此功能部分等效于segNum=0的情况 +#不同的是这个保留不会在m3u8文件中体现 +#0为不保留,不起作用 +#1为保留,则不删除hls文件,如果开启此功能,注意磁盘大小,或者定期手动清理hls文件 +segKeep=0 [hook] #在推流时,如果url参数匹对admin_params,那么可以不经过hook鉴权直接推流成功,播放时亦然 #该配置项的目的是为了开发者自己调试测试,该参数暴露后会有泄露隐私的安全隐患 diff --git a/src/Common/config.cpp b/src/Common/config.cpp index 47148054..e870bcc5 100644 --- a/src/Common/config.cpp +++ b/src/Common/config.cpp @@ -252,6 +252,7 @@ namespace Hls { #define HLS_FIELD "hls." const string kSegmentDuration = HLS_FIELD"segDur"; const string kSegmentNum = HLS_FIELD"segNum"; +const string kSegmentKeep = HLS_FIELD"segKeep"; const string kSegmentRetain = HLS_FIELD"segRetain"; const string kFileBufSize = HLS_FIELD"fileBufSize"; const string kFilePath = HLS_FIELD"filePath"; @@ -261,6 +262,7 @@ const string kDeleteDelaySec = HLS_FIELD"deleteDelaySec"; static onceToken token([](){ mINI::Instance()[kSegmentDuration] = 2; mINI::Instance()[kSegmentNum] = 3; + mINI::Instance()[kSegmentKeep] = 0; mINI::Instance()[kSegmentRetain] = 5; mINI::Instance()[kFileBufSize] = 64 * 1024; mINI::Instance()[kFilePath] = "./www"; diff --git a/src/Common/config.h b/src/Common/config.h index bc185cd9..d49ddc6a 100644 --- a/src/Common/config.h +++ b/src/Common/config.h @@ -295,6 +295,8 @@ namespace Hls { extern const std::string kSegmentDuration; //m3u8文件中HLS切片个数,如果设置为0,则不删除切片,而是保存为点播 extern const std::string kSegmentNum; +//如果设置为0,则不保留切片,设置为1则一直保留切片 +extern const std::string kSegmentKeep; //HLS切片从m3u8文件中移除后,继续保留在磁盘上的个数 extern const std::string kSegmentRetain; //HLS文件写缓存大小 diff --git a/src/Record/HlsMaker.cpp b/src/Record/HlsMaker.cpp index 091667c0..358fecb1 100644 --- a/src/Record/HlsMaker.cpp +++ b/src/Record/HlsMaker.cpp @@ -14,10 +14,11 @@ using namespace std; namespace mediakit { -HlsMaker::HlsMaker(float seg_duration, uint32_t seg_number) { +HlsMaker::HlsMaker(float seg_duration, uint32_t seg_number, uint32_t seg_keep) { //最小允许设置为0,0个切片代表点播 _seg_number = seg_number; _seg_duration = seg_duration; + _seg_keep = seg_keep; } HlsMaker::~HlsMaker() { @@ -105,7 +106,10 @@ void HlsMaker::delOldSegment() { if (_file_index > _seg_number) { _seg_dur_list.pop_front(); } - + if (_seg_keep == 1) { + //如果设置为一直保存,就不删除 + return; + } GET_CONFIG(uint32_t, segRetain, Hls::kSegmentRetain); //但是实际保存的切片个数比m3u8所述多若干个,这样做的目的是防止播放器在切片删除前能下载完毕 if (_file_index > _seg_number + segRetain) { @@ -149,6 +153,9 @@ bool HlsMaker::isLive() { return _seg_number != 0; } +bool HlsMaker::isKeep() { + return _seg_keep == 1; +} void HlsMaker::clear() { _file_index = 0; _last_timestamp = 0; diff --git a/src/Record/HlsMaker.h b/src/Record/HlsMaker.h index f3223d77..7db62c58 100644 --- a/src/Record/HlsMaker.h +++ b/src/Record/HlsMaker.h @@ -26,8 +26,9 @@ public: /** * @param seg_duration 切片文件长度 * @param seg_number 切片个数 + * @param seg_keep 是否保留切片文件 */ - HlsMaker(float seg_duration = 5, uint32_t seg_number = 3); + HlsMaker(float seg_duration = 5, uint32_t seg_number = 3, uint32_t seg_keep = 0); virtual ~HlsMaker(); /** @@ -43,6 +44,10 @@ public: * 是否为直播 */ bool isLive(); + /** + * 是否保留切片文件 + */ + bool isKeep(); /** * 清空记录 @@ -108,6 +113,7 @@ private: private: float _seg_duration = 0; uint32_t _seg_number = 0; + uint32_t _seg_keep = 0; uint32_t _last_timestamp = 0; uint32_t _last_seg_timestamp = 0; uint64_t _file_index = 0; diff --git a/src/Record/HlsMakerImp.cpp b/src/Record/HlsMakerImp.cpp index 525e64b5..aabaeebc 100644 --- a/src/Record/HlsMakerImp.cpp +++ b/src/Record/HlsMakerImp.cpp @@ -23,7 +23,8 @@ HlsMakerImp::HlsMakerImp(const string &m3u8_file, const string ¶ms, uint32_t bufSize, float seg_duration, - uint32_t seg_number) : HlsMaker(seg_duration, seg_number) { + uint32_t seg_number, + uint32_t seg_keep):HlsMaker(seg_duration, seg_number, seg_keep) { _poller = EventPollerPool::Instance().getPoller(); _path_prefix = m3u8_file.substr(0, m3u8_file.rfind('/')); _path_hls = m3u8_file; @@ -47,7 +48,7 @@ void HlsMakerImp::clearCache() { void HlsMakerImp::clearCache(bool immediately, bool eof) { //录制完了 flushLastSegment(eof); - if (!isLive()) { + if (!isLive()||isKeep()) { return; } diff --git a/src/Record/HlsMakerImp.h b/src/Record/HlsMakerImp.h index 8de756b1..d23810e0 100644 --- a/src/Record/HlsMakerImp.h +++ b/src/Record/HlsMakerImp.h @@ -25,7 +25,8 @@ public: const std::string ¶ms, uint32_t bufSize = 64 * 1024, float seg_duration = 5, - uint32_t seg_number = 3); + uint32_t seg_number = 3, + uint32_t seg_keep = 0); ~HlsMakerImp() override; diff --git a/src/Record/HlsRecorder.h b/src/Record/HlsRecorder.h index 84b7dda2..91f5f6f7 100644 --- a/src/Record/HlsRecorder.h +++ b/src/Record/HlsRecorder.h @@ -22,9 +22,10 @@ public: HlsRecorder(const std::string &m3u8_file, const std::string ¶ms) : MpegMuxer(false) { GET_CONFIG(uint32_t, hlsNum, Hls::kSegmentNum); + GET_CONFIG(uint32_t, hlsKeep, Hls::kSegmentKeep); GET_CONFIG(uint32_t, hlsBufSize, Hls::kFileBufSize); GET_CONFIG(float, hlsDuration, Hls::kSegmentDuration); - _hls = std::make_shared(m3u8_file, params, hlsBufSize, hlsDuration, hlsNum); + _hls = std::make_shared(m3u8_file, params, hlsBufSize, hlsDuration, hlsNum, hlsKeep); //清空上次的残余文件 _hls->clearCache(); } From 41faf6ba615730fce3f5fc99eab5b31a16cb8df7 Mon Sep 17 00:00:00 2001 From: WuPeng Date: Mon, 9 May 2022 21:09:01 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=B0=86hls=E9=85=8D=E7=BD=AE=E9=A1=B9?= =?UTF-8?q?=E7=9A=84segKeep=E6=9C=89int=E7=B1=BB=E5=9E=8B=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E4=B8=BAbool=E7=B1=BB=E5=9E=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Common/config.cpp | 2 +- src/Record/HlsMaker.cpp | 6 +++--- src/Record/HlsMaker.h | 4 ++-- src/Record/HlsMakerImp.cpp | 2 +- src/Record/HlsMakerImp.h | 2 +- src/Record/HlsRecorder.h | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Common/config.cpp b/src/Common/config.cpp index e870bcc5..c1613af0 100644 --- a/src/Common/config.cpp +++ b/src/Common/config.cpp @@ -262,7 +262,7 @@ const string kDeleteDelaySec = HLS_FIELD"deleteDelaySec"; static onceToken token([](){ mINI::Instance()[kSegmentDuration] = 2; mINI::Instance()[kSegmentNum] = 3; - mINI::Instance()[kSegmentKeep] = 0; + mINI::Instance()[kSegmentKeep] = false; mINI::Instance()[kSegmentRetain] = 5; mINI::Instance()[kFileBufSize] = 64 * 1024; mINI::Instance()[kFilePath] = "./www"; diff --git a/src/Record/HlsMaker.cpp b/src/Record/HlsMaker.cpp index 358fecb1..df92ca74 100644 --- a/src/Record/HlsMaker.cpp +++ b/src/Record/HlsMaker.cpp @@ -14,7 +14,7 @@ using namespace std; namespace mediakit { -HlsMaker::HlsMaker(float seg_duration, uint32_t seg_number, uint32_t seg_keep) { +HlsMaker::HlsMaker(float seg_duration, uint32_t seg_number, bool seg_keep) { //最小允许设置为0,0个切片代表点播 _seg_number = seg_number; _seg_duration = seg_duration; @@ -106,7 +106,7 @@ void HlsMaker::delOldSegment() { if (_file_index > _seg_number) { _seg_dur_list.pop_front(); } - if (_seg_keep == 1) { + if (_seg_keep) { //如果设置为一直保存,就不删除 return; } @@ -154,7 +154,7 @@ bool HlsMaker::isLive() { } bool HlsMaker::isKeep() { - return _seg_keep == 1; + return _seg_keep; } void HlsMaker::clear() { _file_index = 0; diff --git a/src/Record/HlsMaker.h b/src/Record/HlsMaker.h index 7db62c58..ea972d60 100644 --- a/src/Record/HlsMaker.h +++ b/src/Record/HlsMaker.h @@ -28,7 +28,7 @@ public: * @param seg_number 切片个数 * @param seg_keep 是否保留切片文件 */ - HlsMaker(float seg_duration = 5, uint32_t seg_number = 3, uint32_t seg_keep = 0); + HlsMaker(float seg_duration = 5, uint32_t seg_number = 3, bool seg_keep = false); virtual ~HlsMaker(); /** @@ -113,7 +113,7 @@ private: private: float _seg_duration = 0; uint32_t _seg_number = 0; - uint32_t _seg_keep = 0; + bool _seg_keep = false; uint32_t _last_timestamp = 0; uint32_t _last_seg_timestamp = 0; uint64_t _file_index = 0; diff --git a/src/Record/HlsMakerImp.cpp b/src/Record/HlsMakerImp.cpp index aabaeebc..cde0f129 100644 --- a/src/Record/HlsMakerImp.cpp +++ b/src/Record/HlsMakerImp.cpp @@ -24,7 +24,7 @@ HlsMakerImp::HlsMakerImp(const string &m3u8_file, uint32_t bufSize, float seg_duration, uint32_t seg_number, - uint32_t seg_keep):HlsMaker(seg_duration, seg_number, seg_keep) { + bool seg_keep):HlsMaker(seg_duration, seg_number, seg_keep) { _poller = EventPollerPool::Instance().getPoller(); _path_prefix = m3u8_file.substr(0, m3u8_file.rfind('/')); _path_hls = m3u8_file; diff --git a/src/Record/HlsMakerImp.h b/src/Record/HlsMakerImp.h index d23810e0..645302ba 100644 --- a/src/Record/HlsMakerImp.h +++ b/src/Record/HlsMakerImp.h @@ -26,7 +26,7 @@ public: uint32_t bufSize = 64 * 1024, float seg_duration = 5, uint32_t seg_number = 3, - uint32_t seg_keep = 0); + bool seg_keep = false); ~HlsMakerImp() override; diff --git a/src/Record/HlsRecorder.h b/src/Record/HlsRecorder.h index 91f5f6f7..0762a3e4 100644 --- a/src/Record/HlsRecorder.h +++ b/src/Record/HlsRecorder.h @@ -22,7 +22,7 @@ public: HlsRecorder(const std::string &m3u8_file, const std::string ¶ms) : MpegMuxer(false) { GET_CONFIG(uint32_t, hlsNum, Hls::kSegmentNum); - GET_CONFIG(uint32_t, hlsKeep, Hls::kSegmentKeep); + GET_CONFIG(bool, hlsKeep, Hls::kSegmentKeep); GET_CONFIG(uint32_t, hlsBufSize, Hls::kFileBufSize); GET_CONFIG(float, hlsDuration, Hls::kSegmentDuration); _hls = std::make_shared(m3u8_file, params, hlsBufSize, hlsDuration, hlsNum, hlsKeep);