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/xiongziliang/ZLMediaKit).
|
|
|
|
|
*
|
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
|
|
|
|
*/
|
|
|
|
|
|
2019-04-01 12:57:33 +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>
|
2019-04-01 12:57:33 +08:00
|
|
|
|
#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
|
|
|
|
|
2020-09-13 14:08:05 +08:00
|
|
|
|
class TsInfo {
|
|
|
|
|
public:
|
|
|
|
|
time_t ui64StartedTime; // GMT 标准时间,单位秒
|
|
|
|
|
time_t ui64TimeLen; // 录像长度,单位毫秒
|
|
|
|
|
off_t ui64FileSize; // 文件大小,单位 BYTE
|
|
|
|
|
string strFilePath; // 文件路径
|
|
|
|
|
string strFileName; // 文件名称
|
|
|
|
|
string strFolder; // 文件夹路径
|
|
|
|
|
string strUrl; // 播放路径
|
|
|
|
|
string strAppName; // 应用名称
|
|
|
|
|
string strStreamId; // 流 ID
|
|
|
|
|
string strVhost; // vhost
|
|
|
|
|
};
|
|
|
|
|
|
2019-04-01 12:57:33 +08:00
|
|
|
|
class HlsMaker {
|
2017-04-01 16:35:56 +08:00
|
|
|
|
public:
|
2019-04-01 12:57:33 +08:00
|
|
|
|
/**
|
|
|
|
|
* @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
|
|
|
|
|
2019-04-01 12:57:33 +08:00
|
|
|
|
/**
|
|
|
|
|
* 写入ts数据
|
|
|
|
|
* @param data 数据
|
|
|
|
|
* @param len 数据长度
|
|
|
|
|
* @param timestamp 毫秒时间戳
|
2020-01-24 22:00:55 +08:00
|
|
|
|
* @param is_idr_fast_packet 是否为关键帧第一个包
|
2019-04-01 12:57:33 +08:00
|
|
|
|
*/
|
2020-01-24 22:00:55 +08:00
|
|
|
|
void inputData(void *data, uint32_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:
|
2019-04-01 12:57:33 +08:00
|
|
|
|
/**
|
|
|
|
|
* 创建ts切片文件回调
|
|
|
|
|
* @param index
|
|
|
|
|
* @return
|
2018-10-28 00:15:27 +08:00
|
|
|
|
*/
|
2019-10-12 10:29:40 +08:00
|
|
|
|
virtual string onOpenSegment(int index) = 0;
|
2018-10-28 00:15:27 +08:00
|
|
|
|
|
2019-04-01 12:57:33 +08:00
|
|
|
|
/**
|
|
|
|
|
* 删除ts切片文件回调
|
|
|
|
|
* @param index
|
|
|
|
|
*/
|
2019-10-12 10:29:40 +08:00
|
|
|
|
virtual void onDelSegment(int index) = 0;
|
2017-04-01 16:35:56 +08:00
|
|
|
|
|
2019-04-01 12:57:33 +08:00
|
|
|
|
/**
|
|
|
|
|
* 写ts切片文件回调
|
|
|
|
|
* @param data
|
|
|
|
|
* @param len
|
|
|
|
|
*/
|
2019-10-12 10:29:40 +08:00
|
|
|
|
virtual void onWriteSegment(const char *data, int len) = 0;
|
2018-10-28 00:15:27 +08:00
|
|
|
|
|
2019-04-01 12:57:33 +08:00
|
|
|
|
/**
|
|
|
|
|
* 写m3u8文件回调
|
|
|
|
|
* @param data
|
|
|
|
|
* @param len
|
|
|
|
|
*/
|
|
|
|
|
virtual void onWriteHls(const char *data, int len) = 0;
|
2019-09-26 14:21:20 +08:00
|
|
|
|
|
2019-10-12 10:29:40 +08:00
|
|
|
|
/**
|
|
|
|
|
* 关闭上个ts切片并且写入m3u8索引
|
2020-09-20 10:56:54 +08:00
|
|
|
|
* @param eof HLS直播是否已结束
|
2019-10-12 10:29:40 +08:00
|
|
|
|
*/
|
2020-09-20 10:56:54 +08:00
|
|
|
|
void flushLastSegment(bool eof);
|
2019-12-17 09:18:11 +08:00
|
|
|
|
|
2020-09-13 14:08:05 +08:00
|
|
|
|
/**
|
|
|
|
|
* 上一个 ts 切片写入完成, 可在这里进行通知处理
|
|
|
|
|
* @param duration 上一个 ts 切片的时长, 单位为毫秒
|
|
|
|
|
*/
|
|
|
|
|
virtual void onFlushLastSegment(uint32_t duration);
|
|
|
|
|
|
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
|
|
|
|
|
2019-04-01 12:57:33 +08:00
|
|
|
|
private:
|
|
|
|
|
float _seg_duration = 0;
|
2020-09-12 20:49:00 +08:00
|
|
|
|
uint32_t _seg_number = 0;
|
2020-09-20 10:56:54 +08:00
|
|
|
|
uint32_t _last_timestamp = 0;
|
2020-09-12 20:49:00 +08:00
|
|
|
|
uint32_t _last_seg_timestamp = 0;
|
2019-04-01 12:57:33 +08:00
|
|
|
|
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
|
|
|
|
};
|
|
|
|
|
|
2019-04-01 12:57:33 +08:00
|
|
|
|
}//namespace mediakit
|
|
|
|
|
#endif //HLSMAKER_H
|