ZLMediaKit/src/Record/HlsMaker.h

123 lines
2.7 KiB
C++
Raw Normal View History

2019-08-08 19:01:45 +08:00
/*
2020-04-04 20:30:09 +08:00
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
2017-09-27 16:20:30 +08:00
*
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
2017-09-27 16:20:30 +08:00
*
2020-04-04 20:30:09 +08:00
* Use of this source code is governed by MIT license that can be found in the
* LICENSE file in the root of the source tree. All contributing project authors
* may be found in the AUTHORS file in the root of the source tree.
2017-04-01 16:35:56 +08:00
*/
#ifndef HLSMAKER_H
#define HLSMAKER_H
2017-04-01 16:35:56 +08:00
2018-10-28 00:15:27 +08:00
#include <deque>
#include <tuple>
#include "Common/config.h"
2017-04-01 16:35:56 +08:00
#include "Util/TimeTicker.h"
#include "Util/File.h"
#include "Util/util.h"
#include "Util/logger.h"
2018-10-24 17:17:55 +08:00
using namespace toolkit;
2017-04-25 11:35:41 +08:00
2018-10-24 17:17:55 +08:00
namespace mediakit {
2017-04-01 16:35:56 +08:00
class HlsMaker {
2017-04-01 16:35:56 +08:00
public:
/**
* @param seg_duration
* @param seg_number
*/
HlsMaker(float seg_duration = 5, uint32_t seg_number = 3);
virtual ~HlsMaker();
2017-04-01 16:35:56 +08:00
/**
* ts数据
* @param data
* @param len
* @param timestamp
2020-01-24 22:00:55 +08:00
* @param is_idr_fast_packet
*/
void inputData(void *data, size_t len, uint32_t timestamp, bool is_idr_fast_packet);
2020-09-12 19:20:18 +08:00
/**
*
*/
bool isLive();
/**
*
*/
void clear();
2018-10-28 00:15:27 +08:00
protected:
/**
* ts切片文件回调
* @param index
* @return
2018-10-28 00:15:27 +08:00
*/
virtual string onOpenSegment(uint64_t index) = 0;
2018-10-28 00:15:27 +08:00
/**
* ts切片文件回调
* @param index
*/
virtual void onDelSegment(uint64_t index) = 0;
2017-04-01 16:35:56 +08:00
/**
* ts切片文件回调
* @param data
* @param len
*/
virtual void onWriteSegment(const char *data, size_t len) = 0;
2018-10-28 00:15:27 +08:00
/**
* m3u8文件回调
* @param data
* @param len
*/
virtual void onWriteHls(const char *data, size_t len) = 0;
2019-09-26 14:21:20 +08:00
2019-10-12 10:29:40 +08:00
/**
* ts ,
* @param duration_ms ts ,
2019-10-12 10:29:40 +08:00
*/
virtual void onFlushLastSegment(uint32_t duration_ms) {};
2019-12-17 09:18:11 +08:00
2020-09-13 14:08:05 +08:00
/**
* ts切片并且写入m3u8索引
* @param eof HLS直播是否已结束
2020-09-13 14:08:05 +08:00
*/
void flushLastSegment(bool eof);
2020-09-13 14:08:05 +08:00
2019-10-12 10:29:40 +08:00
private:
2019-09-26 14:21:20 +08:00
/**
* m3u8文件
* @param eof true代表点播
*/
void makeIndexFile(bool eof = false);
2019-10-12 10:29:40 +08:00
/**
* ts切片
*/
void delOldSegment();
/**
* ts切片
* @param timestamp
*/
void addNewSegment(uint32_t timestamp);
2020-09-12 19:20:18 +08:00
private:
float _seg_duration = 0;
uint32_t _seg_number = 0;
uint32_t _last_timestamp = 0;
uint32_t _last_seg_timestamp = 0;
uint64_t _file_index = 0;
string _last_file_name;
std::deque<tuple<int,string> > _seg_dur_list;
2017-04-01 16:35:56 +08:00
};
}//namespace mediakit
#endif //HLSMAKER_H