package com.boying.controller; import com.boying.common.osSelect; import com.boying.entity.Dvr; import com.boying.service.HCNetSDK; import com.sun.jna.Native; import com.sun.jna.ptr.IntByReference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; public class VideoDownLoad { private static Logger logger = LoggerFactory.getLogger(VideoDownLoad.class); private static HCNetSDK hcNetSDK = null; private int userId;//用户句柄 private int loadHandle;//下载句柄 private Timer downloadTimer; /** * 动态库加载 * * @return */ private static boolean createSDKInstance() { if (hcNetSDK == null) { synchronized (HCNetSDK.class) { String strDllPath = ""; try { if (osSelect.isWindows()) //win系统加载库路径 strDllPath = "E:\\HK\\HCNetSDK.dll"; else if (osSelect.isLinux()) //Linux系统加载库路径 strDllPath = "E:\\HK\\HCNetSDK.so"; hcNetSDK = (HCNetSDK) Native.loadLibrary(strDllPath, HCNetSDK.class); } catch (Exception ex) { System.out.println("loadLibrary: " + strDllPath + " Error: " + ex.getMessage()); return false; } } } return true; } /** * * @param m_sDeviceIP 设备ip地址 * @param wPort 端口号,设备网络SDK登录默认端口8000 * @param m_sUsername 用户名 * @param m_sPassword 密码 */ public void Login_V40(String m_sDeviceIP,short wPort,String m_sUsername,String m_sPassword) { /* 注册 */ // 设备登录信息 HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO(); // 设备信息 HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40(); m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN]; System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length()); m_strLoginInfo.wPort =wPort ; m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN]; System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length()); m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN]; System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length()); // 是否异步登录:false- 否,true- 是 m_strLoginInfo.bUseAsynLogin = false; // write()调用后数据才写入到内存中 m_strLoginInfo.write(); userId = hcNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo); if (userId == -1) { System.out.println("登录失败,错误码为" + hcNetSDK.NET_DVR_GetLastError()); return; } else { System.out.println("登录成功!"); // read()后,结构体中才有对应的数据 m_strDeviceInfo.read(); return; } } /** * 按时间下载视频 */ private boolean downloadVideo(Dvr dvr, Date startTime, Date endTime, String filePath, int channel) { if(hcNetSDK == null){ if (!createSDKInstance()) { System.out.println("Load SDK fail"); return false; } } if (userId > -1) { //先注销 hcNetSDK.NET_DVR_Logout_V30(userId); userId = -1; } boolean initFlag = hcNetSDK.NET_DVR_Init(); if (!initFlag) { //返回值为布尔值 fasle初始化失败 logger.warn("hksdk(视频)-海康sdk初始化失败!"); return false; } //启动SDK写日志 hcNetSDK.NET_DVR_SetLogToFile(3, "./sdkLog", false); HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30(); userId = hcNetSDK.NET_DVR_Login_V30(dvr.getDvrip(),(short) dvr.getDvrport(), dvr.getDvrusername(), new String(dvr.getDvrpassword()), m_strDeviceInfo); logger.info("hksdk(视频)-登录海康录像机信息,状态值:" + hcNetSDK.NET_DVR_GetLastError()); long lUserId = userId; if (lUserId == -1) { logger.warn("hksdk(视频)-海康sdk登录失败!"); return false; } // loadHandle = new NativeLong(-1); if (loadHandle == -1) { loadHandle = hcNetSDK.NET_DVR_GetFileByTime(userId, channel, getHkTime(startTime), getHkTime(endTime), filePath); logger.info("hksdk(视频)-获取播放句柄信息,状态值:" + hcNetSDK.NET_DVR_GetLastError()); if (loadHandle >= 0) { // 判断文件夹是否存在 File files = new File(filePath); if(!files.exists()){ files.mkdirs(); } boolean downloadFlag = hcNetSDK.NET_DVR_PlayBackControl(loadHandle, hcNetSDK.NET_DVR_PLAYSTART, 0, null); int tmp = -1; IntByReference pos = new IntByReference(); while (true) { boolean backFlag = hcNetSDK.NET_DVR_PlayBackControl(loadHandle, hcNetSDK.NET_DVR_PLAYGETPOS, 0, pos); if (!backFlag) {//防止单个线程死循环 return downloadFlag; } int produce = pos.getValue(); if ((produce % 10) == 0 && tmp != produce) {//输出进度 tmp = produce; logger.info("hksdk(视频)-视频下载进度:" + "==" + produce + "%"); } if (produce == 100) {//下载成功 hcNetSDK.NET_DVR_StopGetFile(loadHandle); loadHandle=-1; hcNetSDK.NET_DVR_Logout(userId);//退出录像机 logger.info("hksdk(视频)-退出状态" + hcNetSDK.NET_DVR_GetLastError()); hcNetSDK.NET_DVR_Cleanup(); // Media media = new Media(); // media.setDisasterId(disasterId); // media.setType(MediaType.VIDEO); // media.setCreateDate(new Date()); // media.setUploadTime(new Date()); // media.setAttachmentName("z" + fileName); // media.setIsDeleted(false); // media.setUpdate_rhtx(1); // media.setFlag("OTHER"); // media.setNewsFeedId(0); // String http_path = restUrlLocalhost; // media.setUrl(http_path + "/urgentlogistic/file/mp4/" + newDate + "/z" +fileName); // mediaService.create(media); // // try { // // 视频进行转码 // ConvetorUtil.convetor(filePath + fileName,filePath + "z" +fileName); // File file = new File(filePath + fileName); // // 如果文件路径所对应的文件存在,并且是一个文件,则直接删除 // file.delete(); // } catch (Exception e) { // e.printStackTrace(); // } return true; } if (produce > 100) {//下载失败 hcNetSDK.NET_DVR_StopGetFile(loadHandle); loadHandle=-1; logger.warn("hksdk(视频)-海康sdk由于网络原因或DVR忙,下载异常终止!错误原因:" + hcNetSDK.NET_DVR_GetLastError()); //hcNetSDK.NET_DVR_Logout(userId);//退出录像机 //logger.info("hksdk(视频)-退出状态"+hcNetSDK.NET_DVR_GetLastError()); return false; } } } else { System.out.println("hksdk(视频)-下载失败" + hcNetSDK.NET_DVR_GetLastError()); return false; } } return false; } /** * 获取海康录像机格式的时间 */ private HCNetSDK.NET_DVR_TIME getHkTime(Date time) { HCNetSDK.NET_DVR_TIME structTime = new HCNetSDK.NET_DVR_TIME(); String str = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(time); String[] times = str.split("-"); structTime.dwYear = Integer.parseInt(times[0]); structTime.dwMonth = Integer.parseInt(times[1]); structTime.dwDay = Integer.parseInt(times[2]); structTime.dwHour = Integer.parseInt(times[3]); structTime.dwMinute = Integer.parseInt(times[4]); structTime.dwSecond = Integer.parseInt(times[5]); return structTime; } public static void main(String[] args) { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); Date startTime = null; Date endTime = null; try { startTime = sdf.parse("20240625153300"); //开始时间 endTime = sdf.parse("20240625153500"); //结束时间 } catch (ParseException e) { e.printStackTrace(); } VideoDownLoad test = new VideoDownLoad(); Dvr dvr = new Dvr("http://192.168.0.180",8000,"admin","Boying123"); int channel = 33;//通道 System.out.print(test.downloadVideo(dvr, startTime, endTime, "E:\\HK\\test.mp4", channel)); } }