通过海康sdk实现指定时间段内的录像文件下载

  • 实现方式
  • 录像文件下载实现流程
  • 实现方式
  • 下载录像文件接口
  • 提供获取录像文件下载进度

实现方式

录像文件下载实现流程

根据海康sdk文档描述的流程来实现下载功能:

海康平台 视频回放下载 java 海康视频录像下载器_海康NVR

实现方式

  1. 初始化sdk和用户注册设备流程自行事项,本篇文章暂时略过该过程。
  2. 调用录像文件查找接口NET_DVR_FindFile,判断该时间段内是否存在录像。
  3. 调用NET_DVR_FindNextFile_V30按时间逐个获取查找到的文件信息。
  4. 调用NET_DVR_FindClose_V30关闭文件查找,释放资源。
  5. 组织下载信息结构体NET_DVR_PLAYCOND
  6. 检测下载路径是否存在,如果不存在则创建下载路径。
  7. 调用NET_DVR_GetFileByTime_V40按时间下载录像文件。
  8. 调用HCNetSDK.INSTANCE.NET_DVR_PlayBackControl(net_DVR_GetFileByTime_V40, HCNetSDK.NET_DVR_PLAYSTART, 0, null);控制录像下载状态 开始下载
  9. 提供获取录像文件下载进度的接口。

下载录像文件接口

/**
	 * @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;
	}