mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2026-06-15 20:45:57 +08:00
优化hls生成
This commit is contained in:
@@ -43,11 +43,6 @@ void HlsMaker::makeIndexFile(bool eof) {
|
||||
char file_content[1024];
|
||||
int maxSegmentDuration = 0;
|
||||
|
||||
//停止写之后将最后的片段也写进m3u8文件中
|
||||
if (eof && _stampInc > 0) {
|
||||
_seg_dur_list.push_back(std::make_tuple(_stampInc, _last_file_name));
|
||||
}
|
||||
|
||||
for (auto &tp : _seg_dur_list) {
|
||||
int dur = std::get<0>(tp);
|
||||
if (dur > maxSegmentDuration) {
|
||||
@@ -83,18 +78,16 @@ void HlsMaker::makeIndexFile(bool eof) {
|
||||
void HlsMaker::inputData(void *data, uint32_t len, uint32_t timestamp) {
|
||||
//分片数据中断结束
|
||||
if (data && len) {
|
||||
addNewFile(timestamp);
|
||||
onWriteFile((char *) data, len);
|
||||
addNewSegment(timestamp);
|
||||
onWriteSegment((char *) data, len);
|
||||
//记录上次写入数据时间
|
||||
_ticker_last_data.resetTime();
|
||||
} else {
|
||||
_noData = true;
|
||||
_stampInc = _ticker.elapsedTime();
|
||||
_seg_dur_list.push_back(std::make_tuple(_stampInc, _last_file_name));
|
||||
delOldFile();
|
||||
makeIndexFile();
|
||||
flushLastSegment(true);
|
||||
}
|
||||
}
|
||||
|
||||
void HlsMaker::delOldFile() {
|
||||
void HlsMaker::delOldSegment() {
|
||||
if(_seg_number == 0){
|
||||
//如果设置为保留0个切片,则认为是保存为点播
|
||||
return;
|
||||
@@ -106,28 +99,38 @@ void HlsMaker::delOldFile() {
|
||||
|
||||
//但是实际保存的切片个数比m3u8所述多两个,这样做的目的是防止播放器在切片删除前能下载完毕
|
||||
if (_file_index >= _seg_number + 4) {
|
||||
onDelFile(_file_index - _seg_number - 4);
|
||||
onDelSegment(_file_index - _seg_number - 4);
|
||||
}
|
||||
}
|
||||
|
||||
void HlsMaker::addNewFile(uint32_t) {
|
||||
//上次分片数据中断结束,重置时间避免中途的等待
|
||||
if (_noData) {
|
||||
_ticker.resetTime();
|
||||
_last_file_name = onOpenFile(_file_index++);
|
||||
_noData = false;
|
||||
void HlsMaker::addNewSegment(uint32_t) {
|
||||
if(!_last_file_name.empty() && _ticker.elapsedTime() < _seg_duration * 1000){
|
||||
//存在上个切片,并且未到分片时间
|
||||
return;
|
||||
}
|
||||
_stampInc = _ticker.elapsedTime();
|
||||
if (_file_index == 0 || _stampInc >= _seg_duration * 1000) {
|
||||
_ticker.resetTime();
|
||||
auto file_name = onOpenFile(_file_index);
|
||||
if (_file_index++ > 0) {
|
||||
_seg_dur_list.push_back(std::make_tuple(_stampInc, _last_file_name));
|
||||
delOldFile();
|
||||
makeIndexFile();
|
||||
}
|
||||
_last_file_name = file_name;
|
||||
|
||||
//关闭并保存上一个切片
|
||||
flushLastSegment();
|
||||
//新增切片
|
||||
_last_file_name = onOpenSegment(_file_index++);
|
||||
//重置切片计时器
|
||||
_ticker.resetTime();
|
||||
}
|
||||
|
||||
void HlsMaker::flushLastSegment(bool eof){
|
||||
if(_last_file_name.empty()){
|
||||
//不存在上个切片
|
||||
return;
|
||||
}
|
||||
//文件创建到最后一次数据写入的时间即为切片长度
|
||||
auto seg_dur = _ticker.elapsedTime() - _ticker_last_data.elapsedTime();
|
||||
if(seg_dur <= 0){
|
||||
seg_dur = 100;
|
||||
}
|
||||
_seg_dur_list.push_back(std::make_tuple(seg_dur, _last_file_name));
|
||||
delOldSegment();
|
||||
makeIndexFile(eof);
|
||||
_last_file_name.clear();
|
||||
}
|
||||
|
||||
}//namespace mediakit
|
||||
Reference in New Issue
Block a user