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));
|
}
|
}
|