SkeyeRMS录像服务器如何实现精确查找: HLS+M3U8录像回放

本文介绍了SkeyeRMS录像服务器如何通过遍历M3U8列表并重新生成精确到时间点的切片文件(TS)的M3U8列表,从而实现精确查找和回放功能。首先在指定时间范围内找出M3U8列表,然后在这些列表中查找对应时间的TS,重新生成TS列表,如果可能,将TS文件连接成一个新的M3U8列表,便于播放器连续播放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SkeyeRMS作为面向云端的录播服务器,目前正处于开发阶段,以往的SkeyeRMS查找通常只能精确到M3U8列表,而不能实现精确到时间点的查询,为了能实现精确到点的查询,我将M3U8列表从新遍历一遍,重新生成一个精确到在关键位置开始和结束的切片文件(ts)的M3U8列表,然后返回,我们先不讨论这个方法效率如何,但是确实可以将精确度提高到切片文件单位级。

精确查找流程如下:

  1. 遍历本地(数据库)指定录像存储路径,找出在指定开始时间和结束时间范围内的M3U8列表,注意:这里找到的M3U8列表的区间是要小于开始时间,和大于结束时间的最接近值,以确保指定时间范围在查找到的M3U8列表队列中;

  2. 再在指定的M3U8列表里面查找在开始时间和结束时间内的TS,并重新生成TS列表,如果时间戳连续,甚至可以将TS文件连接成一个M3U8列表,从而播放器播放可以不用跨M3U8列表直接播放;

实现代码如下:(基于本地查找)

bool SkeyeRecordQuery::GetExactM3U8(const char *beginDif, const char *endDif, vector<string> *records)
{
	namespace fs = boost::filesystem;
	fs::path fullpath = fs::path(SkeyeRecordSession::sLocalRecordPath) / name_;

	if (!fs::exists(fullpath))
	{
		return false;
	}

	string begin = beginDif;
	string end = endDif;
	// 通过时间戳和开始结束时间差计算开始时间和结束时间 [12/30/2016 dingshuai]
	//时间戳字串转换成 
	time_t nBegin = StringToTime(begin);
	time_t nEnd	 = StringToTime(end);

	// 算法描述:获取包含begin-end录像开始的时间命名文件夹以及录像结束的时间命名文件夹 [12/30/2016 dingshuai]
	vector<string>* m3u8List = new vector<string>;

	string sStartURL;
	char split = '/';
#ifdef _WIN32
	split = '\\';
#endif

	fs::recursive_directory_iterator end_iter;
	for (fs::recursive_directory_iterator iter(fullpath); iter != end_iter; iter++)
	{
		try
		{			//cout << iter->path().string() << endl;
			if (!fs::is_directory(*iter))
			{
				string file = iter->path().string();
				boost::string_ref m3u8_file(file);
				//cout 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SwordTwelve

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值