通过海康sdk实现指定时间段内的录像文件下载
- 实现方式
- 录像文件下载实现流程
- 实现方式
- 下载录像文件接口
- 提供获取录像文件下载进度
实现方式
录像文件下载实现流程
根据海康sdk文档描述的流程来实现下载功能:
实现方式
- 初始化sdk和用户注册设备流程自行事项,本篇文章暂时略过该过程。
- 调用录像文件查找接口NET_DVR_FindFile,判断该时间段内是否存在录像。
- 调用NET_DVR_FindNextFile_V30按时间逐个获取查找到的文件信息。
- 调用NET_DVR_FindClose_V30关闭文件查找,释放资源。
- 组织下载信息结构体NET_DVR_PLAYCOND
- 检测下载路径是否存在,如果不存在则创建下载路径。
- 调用NET_DVR_GetFileByTime_V40按时间下载录像文件。
- 调用HCNetSDK.INSTANCE.NET_DVR_PlayBackControl(net_DVR_GetFileByTime_V40, HCNetSDK.NET_DVR_PLAYSTART, 0, null);控制录像下载状态 开始下载
- 提供获取录像文件下载进度的接口。
下载录像文件接口
/**
* @Title: download
* @Description: 下载指定时间录像文件
* @param pojo
* @return: JSONObject
**/
@PostMapping(value = "/download")
public JSONObject download(@RequestBody @Valid CameraPojo pojo) {
JSONObject json = new JSONObject(true);
// 自行调用注册设备的接口获取注册句柄
HCLoginSDK login = null;
// 将接口传入的yyyy-MM-dd HH:mm:ss格式的时间转为sdk接口时间的结构体
NET_DVR_TIME lpStartTime = Utils.getNvrTime(pojo.getStarttime());
NET_DVR_TIME lpStopTime = Utils.getNvrTime(pojo.getEndtime());
// 查找录像文件
NativeLong lFindFileHandle = HCNetSDK.INSTANCE.NET_DVR_FindFile(login.getLUserID(),
new NativeLong(Integer.valueOf(pojo.getChannel())), 0, lpStartTime, lpStopTime);
if (lFindFileHandle.intValue() < 0) {
int errorcode = HCNetSDK.INSTANCE.NET_DVR_GetLastError();
logger.error("hcsdk 按时间查找录像文件失败,错误码:" + errorcode);
json.put("message", "按时间查找录像文件失败 错误码:" + errorcode);
return json;
}
// 按时间逐个获取查找到的文件信息
HCNetSDK.NET_DVR_FINDDATA_V30 findData = new HCNetSDK.NET_DVR_FINDDATA_V30();
NativeLong lFindFileNextHandle;
while (true) {
lFindFileNextHandle = HCNetSDK.INSTANCE.NET_DVR_FindNextFile_V30(lFindFileHandle, findData);
if (lFindFileNextHandle.intValue() != 1002) {
break;
}
}
if (lFindFileNextHandle.intValue() != 1000) {
int errorcode = HCNetSDK.INSTANCE.NET_DVR_GetLastError();
logger.error("hcsdk 按时间逐个获取查找到的文件信息失败,错误码:" + errorcode);
json.put("message", "按时间逐个获取查找到的文件信息失败 错误码:" + errorcode);
return json;
}
// 关闭文件查找,释放资源。
HCNetSDK.INSTANCE.NET_DVR_FindClose_V30(lFindFileHandle);
// 下载条件结构体
HCNetSDK.NET_DVR_PLAYCOND pDownloadCond = new HCNetSDK.NET_DVR_PLAYCOND();
pDownloadCond.dwChannel = Integer.valueOf(pojo.getChannel());
pDownloadCond.struStartTime = lpStartTime;
pDownloadCond.struStopTime = lpStopTime;
pDownloadCond.byDrawFrame = 0;
pDownloadCond.byStreamType = (byte) ("sub".equals(pojo.getStream()) ? 1 : 0);
String videopath = null;
try {
String starttime = new SimpleDateFormat("yyyyMMddHHmmss")
.format(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(pojo.getStarttime()));
String endtime = new SimpleDateFormat("yyyyMMddHHmmss")
.format(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(pojo.getEndtime()));
videopath = config.getVideopath() + starttime + "-" + endtime + ".mp4";
} catch (ParseException e) {
e.printStackTrace();
}
// 检测下载路径是否存在,如果不存在则创建下载路径
Utils.checkPath(config.getVideopath());
// 按时间下载录像文件
NativeLong net_DVR_GetFileByTime_V40 = HCNetSDK.INSTANCE.NET_DVR_GetFileByTime_V40(login.getLUserID(),
videopath, pDownloadCond);
if (net_DVR_GetFileByTime_V40.intValue() == -1) {
int errorcode = HCNetSDK.INSTANCE.NET_DVR_GetLastError();
logger.error("hcsdk 按时间下载录像文件失败 错误码:" + errorcode);
json.put("message", "hcsdk 按时间下载录像文件失败 错误码:" + errorcode);
return json;
}
// 控制录像下载状态 开始下载
HCNetSDK.INSTANCE.NET_DVR_PlayBackControl(net_DVR_GetFileByTime_V40, HCNetSDK.NET_DVR_PLAYSTART, 0, null);
IntByReference LPOutValue = new IntByReference();
// 通过key来获取下载句柄和下载路径
String key = UUID.randomUUID().toString();
CacheUtil.DWONLOADHANDLE.put(key, net_DVR_GetFileByTime_V40);
CacheUtil.DWONLOADPATH.put(key, videopath);
logger.info("hcsdk 开始下载录像文件:" + videopath);
json.put("message", "开始下载录像文件");
json.put("key", key);
return json;
}
提供获取录像文件下载进度
/**
* @Title: getDownloadProgress
* @Description: 获取录像文件下载进度
* @param key
* @return: JSONObject
**/
@GetMapping(value = "downprogress")
public JSONObject getDownloadProgress(@NotBlank(message = "key不能为空") String key) {
JSONObject json = new JSONObject(true);
IntByReference LPOutValue = new IntByReference();
HCNetSDK.INSTANCE.NET_DVR_PlayBackControl(CacheUtil.DWONLOADHANDLE.get(key), HCNetSDK.NET_DVR_PLAYGETPOS, 0,
LPOutValue);
if (LPOutValue.getValue() == 100) {
logger.info("hcsdk 录像文件下载成功 下载路径:" + CacheUtil.DWONLOADPATH.get(key));
json.put("message", "录像文件下载成功");
json.put("videopath", CacheUtil.DWONLOADPATH.get(key));
return json;
}
json.put("message", "录像文件正在下载");
json.put("downprogress", LPOutValue.getValue() + "%");
return json;
}