From ccbd1d4a831433d88c31757067793b1c714c17a2 Mon Sep 17 00:00:00 2001
From: xiongziliang <771730766@qq.com>
Date: Tue, 5 Nov 2019 10:27:28 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0hls.segRetain=E9=85=8D?=
=?UTF-8?q?=E7=BD=AE=E9=A1=B9=EF=BC=8C=E4=BF=AE=E5=A4=8Dhls=E5=88=87?=
=?UTF-8?q?=E7=89=87=E7=AD=89=E4=BA=8EsegNum+1=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
conf/config.ini | 4 +-
src/Common/config.cpp | 130 ++++++++++++-------------------------
src/Common/config.h | 4 +-
src/MediaFile/HlsMaker.cpp | 9 +--
4 files changed, 51 insertions(+), 96 deletions(-)
diff --git a/conf/config.ini b/conf/config.ini
index cbbcb96d..048971f2 100644
--- a/conf/config.ini
+++ b/conf/config.ini
@@ -44,10 +44,12 @@ fileBufSize=65536
#可以为相对(相对于本可执行程序目录)或绝对路径
filePath=./httpRoot
#hls最大切片时间
-segDur=3
+segDur=2
#m3u8索引中,hls保留切片个数(实际保留切片个数大2~3个)
#如果设置为0,则不删除切片,而是保存为点播
segNum=3
+#HLS切片从m3u8文件中移除后,继续保留在磁盘上的个数
+segRetain=5
[hook]
#在推流时,如果url参数匹对admin_params,那么可以不经过hook鉴权直接推流成功,播放时亦然
diff --git a/src/Common/config.cpp b/src/Common/config.cpp
index 15540bcd..8991d768 100644
--- a/src/Common/config.cpp
+++ b/src/Common/config.cpp
@@ -95,57 +95,44 @@ onceToken token([](){
////////////HTTP配置///////////
namespace Http {
#define HTTP_FIELD "http."
-
//http 文件发送缓存大小
-#define HTTP_SEND_BUF_SIZE (64 * 1024)
const string kSendBufSize = HTTP_FIELD"sendBufSize";
-
//http 最大请求字节数
-#define HTTP_MAX_REQ_SIZE (4*1024)
const string kMaxReqSize = HTTP_FIELD"maxReqSize";
-
//http keep-alive秒数
-#define HTTP_KEEP_ALIVE_SECOND 10
const string kKeepAliveSecond = HTTP_FIELD"keepAliveSecond";
-
//http keep-alive最大请求数
-#define HTTP_MAX_REQ_CNT 100
const string kMaxReqCount = HTTP_FIELD"maxReqCount";
-
-
//http 字符编码
-#if defined(_WIN32)
-#define HTTP_CHAR_SET "gb2312"
-#else
-#define HTTP_CHAR_SET "utf-8"
-#endif
const string kCharSet = HTTP_FIELD"charSet";
-
//http 服务器根目录
-#define HTTP_ROOT_PATH "./httpRoot"
const string kRootPath = HTTP_FIELD"rootPath";
-
//http 404错误提示内容
-#define HTTP_NOT_FOUND ""\
- "
404 Not Found"\
- ""\
- "您访问的资源不存在!
"\
- "
"\
- SERVER_NAME\
- ""\
- ""\
- ""
const string kNotFound = HTTP_FIELD"notFound";
-
onceToken token([](){
- mINI::Instance()[kSendBufSize] = HTTP_SEND_BUF_SIZE;
- mINI::Instance()[kMaxReqSize] = HTTP_MAX_REQ_SIZE;
- mINI::Instance()[kKeepAliveSecond] = HTTP_KEEP_ALIVE_SECOND;
- mINI::Instance()[kMaxReqCount] = HTTP_MAX_REQ_CNT;
- mINI::Instance()[kCharSet] = HTTP_CHAR_SET;
- mINI::Instance()[kRootPath] = HTTP_ROOT_PATH;
- mINI::Instance()[kNotFound] = HTTP_NOT_FOUND;
+ mINI::Instance()[kSendBufSize] = 64 * 1024;
+ mINI::Instance()[kMaxReqSize] = 4*1024;
+ mINI::Instance()[kKeepAliveSecond] = 15;
+ mINI::Instance()[kMaxReqCount] = 100;
+
+#if defined(_WIN32)
+ mINI::Instance()[kCharSet] = "gb2312";
+#else
+ mINI::Instance()[kCharSet] ="utf-8";
+#endif
+
+ mINI::Instance()[kRootPath] = "./httpRoot";
+ mINI::Instance()[kNotFound] =
+ ""
+ "404 Not Found"
+ ""
+ "您访问的资源不存在!
"
+ "
"
+ SERVER_NAME
+ ""
+ ""
+ "";
},nullptr);
}//namespace Http
@@ -153,12 +140,10 @@ onceToken token([](){
////////////SHELL配置///////////
namespace Shell {
#define SHELL_FIELD "shell."
-
-#define SHELL_MAX_REQ_SIZE 1024
const string kMaxReqSize = SHELL_FIELD"maxReqSize";
onceToken token([](){
- mINI::Instance()[kMaxReqSize] = SHELL_MAX_REQ_SIZE;
+ mINI::Instance()[kMaxReqSize] = 1024;
},nullptr);
} //namespace Shell
@@ -179,7 +164,6 @@ onceToken token([](){
mINI::Instance()[kDirectProxy] = 1;
mINI::Instance()[kModifyStamp] = false;
},nullptr);
-
} //namespace Rtsp
////////////RTMP服务器配置///////////
@@ -194,40 +178,28 @@ onceToken token([](){
mINI::Instance()[kHandshakeSecond] = 15;
mINI::Instance()[kKeepAliveSecond] = 15;
},nullptr);
-
} //namespace RTMP
////////////RTP配置///////////
namespace Rtp {
#define RTP_FIELD "rtp."
-
//RTP打包最大MTU,公网情况下更小
-#define RTP_VIDOE_MTU_SIZE 1400
const string kVideoMtuSize = RTP_FIELD"videoMtuSize";
-
-#define RTP_Audio_MTU_SIZE 600
const string kAudioMtuSize = RTP_FIELD"audioMtuSize";
-
//RTP排序缓存最大个数
-#define RTP_MAX_RTP_COUNT 50
const string kMaxRtpCount = RTP_FIELD"maxRtpCount";
-
//如果RTP序列正确次数累计达到该数字就启动清空排序缓存
-#define RTP_CLEAR_COUNT 10
const string kClearCount = RTP_FIELD"clearCount";
-
//最大RTP时间为13个小时,每13小时回环一次
-#define RTP_CYCLE_MS (13*60*60*1000)
const string kCycleMS = RTP_FIELD"cycleMS";
-
onceToken token([](){
- mINI::Instance()[kVideoMtuSize] = RTP_VIDOE_MTU_SIZE;
- mINI::Instance()[kAudioMtuSize] = RTP_Audio_MTU_SIZE;
- mINI::Instance()[kMaxRtpCount] = RTP_MAX_RTP_COUNT;
- mINI::Instance()[kClearCount] = RTP_CLEAR_COUNT;
- mINI::Instance()[kCycleMS] = RTP_CYCLE_MS;
+ mINI::Instance()[kVideoMtuSize] = 1400;
+ mINI::Instance()[kAudioMtuSize] = 600;
+ mINI::Instance()[kMaxRtpCount] = 50;
+ mINI::Instance()[kClearCount] = 10;
+ mINI::Instance()[kCycleMS] = 13*60*60*1000;
},nullptr);
} //namespace Rtsp
@@ -239,88 +211,67 @@ const string kAddrMin = MULTI_FIELD"addrMin";
//组播分配截止地址
const string kAddrMax = MULTI_FIELD"addrMax";
//组播TTL
-#define MULTI_UDP_TTL 64
const string kUdpTTL = MULTI_FIELD"udpTTL";
onceToken token([](){
mINI::Instance()[kAddrMin] = "239.0.0.0";
mINI::Instance()[kAddrMax] = "239.255.255.255";
- mINI::Instance()[kUdpTTL] = MULTI_UDP_TTL;
+ mINI::Instance()[kUdpTTL] = 64;
},nullptr);
-
} //namespace MultiCast
////////////录像配置///////////
namespace Record {
#define RECORD_FIELD "record."
-
//查看录像的应用名称
-#define RECORD_APP_NAME "record"
const string kAppName = RECORD_FIELD"appName";
-
//每次流化MP4文件的时长,单位毫秒
-#define RECORD_SAMPLE_MS 500
const string kSampleMS = RECORD_FIELD"sampleMS";
-
//MP4文件录制大小,默认一个小时
-#define RECORD_FILE_SECOND (60*60)
const string kFileSecond = RECORD_FIELD"fileSecond";
-
//录制文件路径
-#define RECORD_FILE_PATH HTTP_ROOT_PATH
const string kFilePath = RECORD_FIELD"filePath";
-
//mp4文件写缓存大小
const string kFileBufSize = RECORD_FIELD"fileBufSize";
-
//mp4录制完成后是否进行二次关键帧索引写入头部
const string kFastStart = RECORD_FIELD"fastStart";
-
//mp4文件是否重头循环读取
const string kFileRepeat = RECORD_FIELD"fileRepeat";
onceToken token([](){
- mINI::Instance()[kAppName] = RECORD_APP_NAME;
- mINI::Instance()[kSampleMS] = RECORD_SAMPLE_MS;
- mINI::Instance()[kFileSecond] = RECORD_FILE_SECOND;
- mINI::Instance()[kFilePath] = RECORD_FILE_PATH;
+ mINI::Instance()[kAppName] = "record";
+ mINI::Instance()[kSampleMS] = 500;
+ mINI::Instance()[kFileSecond] = 60*60;
+ mINI::Instance()[kFilePath] = "./httpRoot";
mINI::Instance()[kFileBufSize] = 64 * 1024;
mINI::Instance()[kFastStart] = false;
mINI::Instance()[kFileRepeat] = false;
},nullptr);
-
} //namespace Record
////////////HLS相关配置///////////
namespace Hls {
#define HLS_FIELD "hls."
-
//HLS切片时长,单位秒
-#define HLS_SEGMENT_DURATION 3
const string kSegmentDuration = HLS_FIELD"segDur";
-
//HLS切片个数
-#define HLS_SEGMENT_NUM 3
const string kSegmentNum = HLS_FIELD"segNum";
-
+//HLS切片从m3u8文件中移除后,继续保留在磁盘上的个数
+const string kSegmentRetain = HLS_FIELD"segRetain";
//HLS文件写缓存大小
-#define HLS_FILE_BUF_SIZE (64 * 1024)
const string kFileBufSize = HLS_FIELD"fileBufSize";
-
//录制文件路径
-#define HLS_FILE_PATH (HTTP_ROOT_PATH)
const string kFilePath = HLS_FIELD"filePath";
onceToken token([](){
- mINI::Instance()[kSegmentDuration] = HLS_SEGMENT_DURATION;
- mINI::Instance()[kSegmentNum] = HLS_SEGMENT_NUM;
- mINI::Instance()[kFileBufSize] = HLS_FILE_BUF_SIZE;
- mINI::Instance()[kFilePath] = HLS_FILE_PATH;
+ mINI::Instance()[kSegmentDuration] = 2;
+ mINI::Instance()[kSegmentNum] = 3;
+ mINI::Instance()[kSegmentRetain] = 5;
+ mINI::Instance()[kFileBufSize] = 64 * 1024;
+ mINI::Instance()[kFilePath] = "./httpRoot";
},nullptr);
-
} //namespace Hls
-
namespace Client {
const string kNetAdapter = "net_adapter";
const string kRtpType = "rtp_type";
@@ -331,7 +282,6 @@ const string kTimeoutMS = "protocol_timeout_ms";
const string kMediaTimeoutMS = "media_timeout_ms";
const string kBeatIntervalMS = "beat_interval_ms";
const string kMaxAnalysisMS = "max_analysis_ms";
-
}
} // namespace mediakit
diff --git a/src/Common/config.h b/src/Common/config.h
index a4557ea1..5658bd53 100644
--- a/src/Common/config.h
+++ b/src/Common/config.h
@@ -283,8 +283,10 @@ extern const string kFileRepeat;
namespace Hls {
//HLS切片时长,单位秒
extern const string kSegmentDuration;
-//HLS切片个数,如果设置为0,则不删除切片,而是保存为点播
+//m3u8文件中HLS切片个数,如果设置为0,则不删除切片,而是保存为点播
extern const string kSegmentNum;
+//HLS切片从m3u8文件中移除后,继续保留在磁盘上的个数
+extern const string kSegmentRetain;
//HLS文件写缓存大小
extern const string kFileBufSize;
//录制文件路径
diff --git a/src/MediaFile/HlsMaker.cpp b/src/MediaFile/HlsMaker.cpp
index 959fcc36..3788f139 100644
--- a/src/MediaFile/HlsMaker.cpp
+++ b/src/MediaFile/HlsMaker.cpp
@@ -93,13 +93,14 @@ void HlsMaker::delOldSegment() {
return;
}
//在hls m3u8索引文件中,我们保存的切片个数跟_seg_number相关设置一致
- if (_file_index >= _seg_number + 2) {
+ if (_file_index > _seg_number) {
_seg_dur_list.pop_front();
}
- //但是实际保存的切片个数比m3u8所述多两个,这样做的目的是防止播放器在切片删除前能下载完毕
- if (_file_index >= _seg_number + 4) {
- onDelSegment(_file_index - _seg_number - 4);
+ GET_CONFIG(uint32_t,segRetain,Hls::kSegmentRetain);
+ //但是实际保存的切片个数比m3u8所述多若干个,这样做的目的是防止播放器在切片删除前能下载完毕
+ if (_file_index > _seg_number + segRetain) {
+ onDelSegment(_file_index - _seg_number - segRetain - 1);
}
}