SkeyeRMS作为面向云端的录播服务器,目前正处于开发阶段,以往的SkeyeRMS查找通常只能精确到M3U8列表,而不能实现精确到时间点的查询,为了能实现精确到点的查询,我将M3U8列表从新遍历一遍,重新生成一个精确到在关键位置开始和结束的切片文件(ts)的M3U8列表,然后返回,我们先不讨论这个方法效率如何,但是确实可以将精确度提高到切片文件单位级。
精确查找流程如下:
-
遍历本地(数据库)指定录像存储路径,找出在指定开始时间和结束时间范围内的M3U8列表,注意:这里找到的M3U8列表的区间是要小于开始时间,和大于结束时间的最接近值,以确保指定时间范围在查找到的M3U8列表队列中;
-
再在指定的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