大家好,欢迎来到IT知识分享网。
在网上搜索了大量资料,都没有找到适合自己的。网上大部分都是对海康SDK的讲解,或者是图形化界面的运行。涉及到web开发时,也是通过WebComponents.exe进行开发,与我所需的功能均不一致,所以还是打算自己尝试并最终上线使用。这里进行一下整理,希望对其他人也能有所帮助。
首先步骤都是一样的,到官网下载自己需要的SDK开发包,官网地址如下,自取。
https://www.hikvision.com/cn/download_61.html
我这里用到的是linux64,将/lib和/lib/HCNetSDKCom下自己需要的.so库文件到拷贝到linux /usr/lib/目录下,如果不知道哪些是自己需要的,全丢进去就好。
在官方的LinuxJavaDemo中,提供了两个jar包,自行导入并build path即可。由于我的项目通过maven进行管理,所以需要导入依赖。
jna.jar在仓库中可以搜索到,选择sun公司的最新版本导入即可。examples.jar仓库中是搜不到的,所以要加到自己的仓库中并增加依赖,这一步需要自行完成。
下面才开始进入开发阶段。官方的demo中有一个至关重要的文件,对于初次进行海康SDK二次开发的人来说,是非常有帮助的。HCNetSDK.java中涵盖了海康大部分的SDK及相应的Structure,后续的开发主要基于这些接口和Structure来完成。
同时需要注意的是,要弄清楚自己的开发平台,当基于linux进行开发时,该类需要继承Library来对.so库文件进行加载,而当基于windows进行开发时要继承StdCallLibrary对.dll进行加载,否则可能会出现部分SDK不可用或内存字段赋值错误的情况。Native.loadLibrary用来指定库文件路径及转换之后的类。windows下可以指定全路径。
下面直接放上我自己写的sdk文件,由于我的项目中只需要实现视频的查找、下载等相关功能,所以代码中的接口及Structure肯定是没有demo中全的。只是为了给大家提供个思路和方向,毕竟coder最擅长的就是根据API码砖了。这里有一点需要注意的是,在实际的项目开发中,demo中HCNetSDK.java是不能拿来直接用的,编译器会报错,根据报错提示,需要将为override的方法补全。主要涉及到的方法是父类Structure中的public List getFieldOrder();方法,该方法是为了以正确的顺序返回此Structure的字段名称,因此override此方法时,需要根据当前Structure的字段来完成,否则会报错。
import com.sun.jna.*;
import com.sun.jna.examples.win32.W32API.HWND;
import com.sun.jna.ptr.IntByReference;
import java.util.Arrays;
import java.util.List;
/**
* SDK接口说明
*
* @author DiCaprito
*/
public interface HcNetSdk extends Library {
HcNetSdk INSTANCE = (HcNetSdk) Native.loadLibrary(
"hcnetsdk",
HcNetSdk.class);
/**
* 正在查找文件
*/
public static final int NET_DVR_IS_FINDING = 1002;
/**
* 用户名长度
*/
public static final int NAME_LEN = 32;
/**
* 密码长度
*/
public static final int PWD_LEN = 16;
/**
* 序列号长度
*/
public static final int SERIAL_NUM_LEN = 48;
/**
* 最大32个模拟通道
*/
public static final int MAX_ANALOG_CHAN_NUM = 32;
/**
* 允许接入的最大IP设备数
*/
public static final int MAX_IP_DEVICE = 32;
/**
* 允许加入的最多IP通道数
*/
public static final int MAX_IP_CHANNEL = 32;
/**
* 最大支持的通道数 最大模拟加上最大IP支持64
*/
public static final int MAX_CHAN_NUM_V30 = (MAX_ANALOG_CHAN_NUM + MAX_IP_CHANNEL);
/**
* 开始播放
*/
public static final int NET_DVR_PLAY_START = 1;
/**
* 获取文件回放的进度
*/
public static final int NET_DVR_PLAY_GET_POS = 13;
/**
* 获取IP接入配置信息
*/
public static final int NET_DVR_GET_IPPARACFG = 1048;
/**
* 用户交互时异常
*/
public static final int EXCEPTION_EXCHANGE = 0x8000;
/**
* 校时结构参数
*/
public static class NET_DVR_TIME extends Structure {
/**
* 年
*/
public int dwYear;
/**
* 月
*/
public int dwMonth;
/**
* 日
*/
public int dwDay;
/**
* 时
*/
public int dwHour;
/**
* 分
*/
public int dwMinute;
/**
* 秒
*/
public int dwSecond;
@Override
public String toString() {
return "NET_DVR_TIME.dwYear: " + dwYear + "\n" + "NET_DVR_TIME.dwMonth: \n" + dwMonth + "\n" + "NET_DVR_TIME.dwDay: \n" + dwDay + "\n" + "NET_DVR_TIME.dwHour: \n" + dwHour + "\n" + "NET_DVR_TIME.dwMinute: \n" + dwMinute + "\n" + "NET_DVR_TIME.dwSecond: \n" + dwSecond;
}
public String toStringTime() {
return String.format("%02d/%02d/%02d%02d:%02d:%02d", dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond);
}
public String toStringTitle() {
return String.format("Time%02d%02d%02d%02d%02d%02d", dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond);
}
@Override
public List<String> getFieldOrder() {
return Arrays.asList("dwYear", "dwMonth", "dwDay", "dwHour", "dwMinute", "dwSecond");
}
}
/**
* ip结构体
*/
public static class NET_DVR_IPADDR extends Structure {
public byte[] sIpV4 = new byte[16];
public byte[] byRes = new byte[128];
@Override
public String toString() {
return "NET_DVR_IPADDR.sIpV4: " + new String(sIpV4) + "\n" + "NET_DVR_IPADDR.byRes: " + new String(byRes) + "\n";
}
@Override
public List<String> getFieldOrder() {
return Arrays.asList("sIpV4", "byRes");
}
}
/**
* IP设备结构
*/
public static class NET_DVR_IPDEVINFO extends Structure {
/**
* 该IP设备是否启用
*/
public int dwEnable;
/**
* 用户名
*/
public byte[] sUserName = new byte[NAME_LEN];
/**
* 密码
*/
public byte[] sPassword = new byte[PWD_LEN];
/**
* IP地址
*/
public NET_DVR_IPADDR struIP = new NET_DVR_IPADDR();
/**
* 端口号
*/
public short wDVRPort;
/**
* 保留
*/
public byte[] byres = new byte[34];
@Override
public String toString() {
return "NET_DVR_IPDEVINFO{" +
"dwEnable=" + dwEnable +
", sUserName=" + Arrays.toString(sUserName) +
", sPassword=" + Arrays.toString(sPassword) +
", struIP=" + struIP +
", wDVRPort=" + wDVRPort +
", byres=" + Arrays.toString(byres) +
'}';
}
@Override
public List<String> getFieldOrder() {
return Arrays.asList("dwEnable", "sUserName", "sPassword", "struIP", "wDVRPort", "byres");
}
}
/**
* IP通道匹配参数
*/
public static class NET_DVR_IPCHANINFO extends Structure {
/**
* 该通道是否启用
*/
public byte byEnable;
/**
* IP设备ID 取值1- MAX_IP_DEVICE
*/
public byte byIPID;
/**
* 通道号
*/
public byte byChannel;
/**
* 保留
*/
public byte[] byres = new byte[33];
@Override
public String toString() {
return "NET_DVR_IPCHANINFO{" +
"byEnable=" + byEnable +
", byIPID=" + byIPID +
", byChannel=" + byChannel +
", byres=" + Arrays.toString(byres) +
'}';
}
@Override
public List<String> getFieldOrder() {
return Arrays.asList("byEnable", "byIPID", "byChannel", "byres");
}
}
/**
* IP接入配置结构
*/
public static class NET_DVR_IPPARACFG extends Structure {
/**
* 结构大小
*/
public int dwSize;
/**
* IP设备
*/
public NET_DVR_IPDEVINFO[] struIPDevInfo = new NET_DVR_IPDEVINFO[MAX_IP_DEVICE];
/**
* 模拟通道是否启用,从低到高表示1-32通道,0表示无效 1有效
*/
public byte[] byAnalogChanEnable = new byte[MAX_ANALOG_CHAN_NUM];
/**
* IP通道
*/
public NET_DVR_IPCHANINFO[] struIPChanInfo = new NET_DVR_IPCHANINFO[MAX_IP_CHANNEL];
@Override
public String toString() {
return "NET_DVR_IPPARACFG{" +
"dwSize=" + dwSize +
", struIPDevInfo=" + Arrays.toString(struIPDevInfo) +
", byAnalogChanEnable=" + Arrays.toString(byAnalogChanEnable) +
", struIPChanInfo=" + Arrays.toString(struIPChanInfo) +
'}';
}
@Override
public List<String> getFieldOrder() {
return Arrays.asList("dwSize", "struIPDevInfo", "byAnalogChanEnable", "struIPChanInfo");
}
}
/**
* NET_DVR_Login_V30()参数结构
*/
public static class NET_DVR_DEVICEINFO_V30 extends Structure {
/**
* 序列号
*/
public byte[] sSerialNumber = new byte[SERIAL_NUM_LEN];
/**
* 报警输入个数
*/
public byte byAlarmInPortNum;
/**
* 报警输出个数
*/
public byte byAlarmOutPortNum;
/**
* 硬盘个数
*/
public byte byDiskNum;
/**
* 设备类型, 1:DVR 2:ATM DVR 3:DVS ......
*/
public byte byDVRType;
/**
* 模拟通道个数
*/
public byte byChanNum;
/**
* 起始通道号,例如DVS-1,DVR - 1
*/
public byte byStartChan;
/**
* 语音通道数
*/
public byte byAudioChanNum;
/**
* 最大数字通道个数
*/
public byte byIPChanNum;
public byte byZeroChanNum;
public byte byMainProto;
public byte bySubProto;
public byte bySupport;
public byte bySupport1;
public byte bySupport2;
public int wDevType;
public byte bySupport3;
public byte byMultiStreamProto;
public byte byStartDChan;
public byte byStartDTalkChan;
public byte byHighDChanNum;
public byte bySupport4;
public byte byLanguageType;
public byte byVoiceInChanNum;
public byte byStartVoiceInChanNo;
public byte[] byRes3 = new byte[2];
public byte byMirrorChanNum;
public int wStartMirrorChanNo;
public byte[] byRes2 = new byte[2];
@Override
public String toString() {
return "NET_DVR_DEVICEINFO_V30{" +
"sSerialNumber=" + Arrays.toString(sSerialNumber) +
", byAlarmInPortNum=" + byAlarmInPortNum +
", byAlarmOutPortNum=" + byAlarmOutPortNum +
", byDiskNum=" + byDiskNum +
", byDVRType=" + byDVRType +
", byChanNum=" + byChanNum +
", byStartChan=" + byStartChan +
", byAudioChanNum=" + byAudioChanNum +
", byIPChanNum=" + byIPChanNum +
", byZeroChanNum=" + byZeroChanNum +
", byMainProto=" + byMainProto +
", bySubProto=" + bySubProto +
", bySupport=" + bySupport +
", bySupport1=" + bySupport1 +
", bySupport2=" + bySupport2 +
", wDevType=" + wDevType +
", bySupport3=" + bySupport3 +
", byMultiStreamProto=" + byMultiStreamProto +
", byStartDChan=" + byStartDChan +
", byStartDTalkChan=" + byStartDTalkChan +
", byHighDChanNum=" + byHighDChanNum +
", bySupport4=" + bySupport4 +
", byLanguageType=" + byLanguageType +
", byVoiceInChanNum=" + byVoiceInChanNum +
", byStartVoiceInChanNo=" + byStartVoiceInChanNo +
", byRes3=" + Arrays.toString(byRes3) +
", byMirrorChanNum=" + byMirrorChanNum +
", wStartMirrorChanNo=" + wStartMirrorChanNo +
", byRes2=" + Arrays.toString(byRes2) +
'}';
}
@Override
public List<String> getFieldOrder() {
return Arrays.asList("sSerialNumber", "byAlarmInPortNum", "byAlarmOutPortNum", "byDiskNum", "byDVRType",
"byChanNum", "byStartChan", "byAudioChanNum", "byIPChanNum", "byZeroChanNum", "byMainProto",
"bySubProto", "bySupport", "bySupport1", "bySupport2", "wDevType", "bySupport3", "byMultiStreamProto",
"byStartDChan", "byStartDTalkChan", "byHighDChanNum", "bySupport4", "byLanguageType",
"byVoiceInChanNum", "byStartVoiceInChanNo", "byRes3", "byMirrorChanNum", "wStartMirrorChanNo",
"byRes2");
}
}
/**
* NET_DVR_Login_V40()参数
*/
public static class NET_DVR_DEVICEINFO_V40 extends Structure {
public NET_DVR_DEVICEINFO_V30 struDeviceV30 = new NET_DVR_DEVICEINFO_V30();
public byte bySupportLock;
public byte byRetryLoginTime;
public byte byPasswordLevel;
public byte byProxyType;
public byte dwSurplusLockTime;
public byte byCharEncodeType;
public byte bySupportDev5;
public byte byLoginMode;
public byte[] byRes2 = new byte[253];
@Override
public String toString() {
return "NET_DVR_DEVICEINFO_V40{" +
"struDeviceV30=" + struDeviceV30 +
", bySupportLock=" + bySupportLock +
", byRetryLoginTime=" + byRetryLoginTime +
", byPasswordLevel=" + byPasswordLevel +
", byProxyType=" + byProxyType +
", dwSurplusLockTime=" + dwSurplusLockTime +
", byCharEncodeType=" + byCharEncodeType +
", bySupportDev5=" + bySupportDev5 +
", byLoginMode=" + byLoginMode +
", byRes2=" + Arrays.toString(byRes2) +
'}';
}
@Override
public List<String> getFieldOrder() {
return Arrays.asList("struDeviceV30", "bySupportLock", "byRetryLoginTime", "byPasswordLevel",
"byProxyType", "dwSurplusLockTime", "byCharEncodeType", "bySupportDev5", "byLoginMode", "byRes2");
}
}
/**
* 录象文件参数
*/
public static class NET_DVR_FINDDATA_V30 extends Structure {
/**
* 文件名
*/
public byte[] sFileName = new byte[100];
/**
* 文件的开始时间
*/
public NET_DVR_TIME struStartTime = new NET_DVR_TIME();
/**
* 文件的结束时间
*/
public NET_DVR_TIME struStopTime = new NET_DVR_TIME();
/**
* 文件的大小
*/
public int dwFileSize;
public byte[] sCardNum = new byte[32];
/**
* 9000设备支持,1表示此文件已经被锁定,0表示正常的文件
*/
public byte byLocked;
public byte[] byRes = new byte[3];
@Override
public String toString() {
return "NET_DVR_FINDDATA_V30{" +
"sFileName=" + Arrays.toString(sFileName) +
", struStartTime=" + struStartTime +
", struStopTime=" + struStopTime +
", dwFileSize=" + dwFileSize +
", sCardNum=" + Arrays.toString(sCardNum) +
", byLocked=" + byLocked +
", byRes=" + Arrays.toString(byRes) +
'}';
}
@Override
public List<String> getFieldOrder() {
return Arrays.asList("sFileName", "struStartTime", "struStopTime", "dwFileSize", "sCardNum", "byLocked", "byRes");
}
}
public static class NET_DVR_FINDDATA_V40 extends Structure {
public byte[] sFileName = new byte[100];
public NET_DVR_TIME struStartTime = new NET_DVR_TIME();
public NET_DVR_TIME struStopTime = new NET_DVR_TIME();
public int dwFileSize;
public byte[] sCardNum = new byte[32];
public byte byLocked;
public byte[] byRes1 = new byte[127];
public byte byFileType;
public byte byQuickSearch;
public byte byRes;
public int dwFileIndex;
public byte byStreamType;
@Override
public String toString() {
return "NET_DVR_FINDDATA_V40{" +
"sFileName=" + Arrays.toString(sFileName) +
", struStartTime=" + struStartTime +
", struStopTime=" + struStopTime +
", dwFileSize=" + dwFileSize +
", sCardNum=" + Arrays.toString(sCardNum) +
", byLocked=" + byLocked +
", byRes1=" + Arrays.toString(byRes1) +
", byFileType=" + byFileType +
", byQuickSearch=" + byQuickSearch +
", byRes=" + byRes +
", dwFileIndex=" + dwFileIndex +
", byStreamType=" + byStreamType +
'}';
}
@Override
public List<String> getFieldOrder() {
return Arrays.asList("sFileName", "struStartTime", "struStopTime", "dwFileSize", "sCardNum", "byLocked",
"byRes1", "byFileType", "byQuickSearch", "byRes", "dwFileIndex", "byStreamType");
}
}
/**
* 录象文件查找条件结构
*/
public static class NET_DVR_FILECOND extends Structure {
/**
* 通道号
*/
public int lChannel;
/**
* 录象文件类型0xff-全部,0-定时录像,1-移动侦测 ,2-报警触发,3-报警|移动侦测 4-报警&移动侦测 5-命令触发 6-手动录像
*/
public int dwFileType;
/**
* 是否锁定 0-正常文件,1-锁定文件, 0xff表示所有文件
*/
public int dwIsLocked;
/**
* 是否使用卡号
*/
public int dwUseCardNo;
/**
* 卡号
*/
public byte[] sCardNumber = new byte[32];
/**
* 开始时间
*/
public NET_DVR_TIME struStartTime = new NET_DVR_TIME();
/**
* 结束时间
*/
public NET_DVR_TIME struStopTime = new NET_DVR_TIME();
@Override
public String toString() {
return "NET_DVR_FILECOND{" +
"lChannel=" + lChannel +
", dwFileType=" + dwFileType +
", dwIsLocked=" + dwIsLocked +
", dwUseCardNo=" + dwUseCardNo +
", sCardNumber=" + Arrays.toString(sCardNumber) +
", struStartTime=" + struStartTime +
", struStopTime=" + struStopTime +
'}';
}
@Override
public List<String> getFieldOrder() {
return Arrays.asList("lChannel", "dwFileType", "dwIsLocked", "dwUseCardNo", "sCardNumber", "struStartTime", "struStopTime");
}
}
public static class NET_DVR_FILECOND_V40 extends Structure {
public int lChannel;
public int dwFileType;
public int dwIsLocked;
public int dwUseCardNo;
public byte[] sCardNumber = new byte[32];
public NET_DVR_TIME struStartTime = new NET_DVR_TIME();
public NET_DVR_TIME struStopTime = new NET_DVR_TIME();
public byte byDrawFrame;
public byte byFindType;
public byte byQuickSearch;
public byte bySpecialFindInfoType;
public int dwVolumeNum;
public byte[] byWorkingDeviceGUID = new byte[16];
public NET_DVR_SPECIAL_FINDINFO_UNION uSpecialFindInfo = new NET_DVR_SPECIAL_FINDINFO_UNION();
public byte byStreamType;
public byte byAudioFile;
public byte[] byRes2 = new byte[30];
@Override
public String toString() {
return "NET_DVR_FILECOND_V40{" +
"lChannel=" + lChannel +
", dwFileType=" + dwFileType +
", dwIsLocked=" + dwIsLocked +
", dwUseCardNo=" + dwUseCardNo +
", sCardNumber=" + Arrays.toString(sCardNumber) +
", struStartTime=" + struStartTime +
", struStopTime=" + struStopTime +
", byDrawFrame=" + byDrawFrame +
", byFindType=" + byFindType +
", byQuickSearch=" + byQuickSearch +
", bySpecialFindInfoType=" + bySpecialFindInfoType +
", dwVolumeNum=" + dwVolumeNum +
", byWorkingDeviceGUID=" + Arrays.toString(byWorkingDeviceGUID) +
", uSpecialFindInfo=" + uSpecialFindInfo +
", byStreamType=" + byStreamType +
", byAudioFile=" + byAudioFile +
", byRes2=" + Arrays.toString(byRes2) +
'}';
}
@Override
public List<String> getFieldOrder() {
return Arrays.asList("lChannel", "dwFileType", "dwIsLocked", "dwUseCardNo", "sCardNumber",
"struStartTime", "struStopTime", "byDrawFrame", "byFindType", "byQuickSearch",
"bySpecialFindInfoType", "dwVolumeNum", "byWorkingDeviceGUID", "uSpecialFindInfo",
"byStreamType", "byAudioFile", "byRes2");
}
}
public static class NET_DVR_SPECIAL_FINDINFO_UNION extends Structure {
public byte[] byLength = new byte[8];
public NET_DVR_ATMEINDINFO struATMFindInfo = new NET_DVR_ATMEINDINFO();
@Override
public String toString() {
return "NET_DVR_SPECIAL_FINDINFO_UNION{" +
"byLength=" + Arrays.toString(byLength) +
", struATMFindInfo=" + struATMFindInfo +
'}';
}
@Override
public List<String> getFieldOrder() {
return Arrays.asList("byLength", "struATMFindInfo");
}
}
public static class NET_DVR_ATMEINDINFO extends Structure {
public byte byTransactionType;
public byte[] byRes = new byte[3];
public int dwTransationAmount;
@Override
public String toString() {
return "NET_DVR_ATMEINDINFO{" +
"byTransactionType=" + byTransactionType +
", byRes=" + Arrays.toString(byRes) +
", dwTransationAmount=" + dwTransationAmount +
'}';
}
@Override
public List<String> getFieldOrder() {
return Arrays.asList("byTransactionType", "byRes", "dwTransationAmount");
}
}
/**
* API函数声明,详细说明见API手册
*/
public static interface FExceptionCallBack extends Callback {
public void invoke(int dwType, NativeLong lUserID, NativeLong lHandle, Pointer pUser);
}
boolean NET_DVR_Init();
boolean NET_DVR_Cleanup();
boolean NET_DVR_SetExceptionCallBack_V30(int nMessage, int hWnd, FExceptionCallBack fExceptionCallBack, Pointer pUser);
boolean NET_DVR_SetConnectTime(int dwWaitTime, int dwTryTimes);
boolean NET_DVR_SetReconnect(int dwInterval, boolean bEnableRecon);
NativeLong NET_DVR_Login_V30(String sDVRIP, short wDVRPort, String sUserName, String sPassword, NET_DVR_DEVICEINFO_V30 lpDeviceInfo);
boolean NET_DVR_Logout(NativeLong lUserID);
int NET_DVR_GetLastError();
NativeLong NET_DVR_FindNextFile_V30(NativeLong lFindHandle, NET_DVR_FINDDATA_V30 lpFindData);
NativeLong NET_DVR_FindNextFile_V40(NativeLong lFindHandle, NET_DVR_FINDDATA_V40 lpFindData);
NativeLong NET_DVR_FindFile_V30(NativeLong lUserID, NET_DVR_FILECOND pFindCond);
NativeLong NET_DVR_FindFile_V40(NativeLong lUserID, NET_DVR_FILECOND_V40 pFindCond);
boolean NET_DVR_FindClose_V30(NativeLong lFindHandle);
NativeLong NET_DVR_PlayBackByTime(NativeLong lUserID, NativeLong lChannel, NET_DVR_TIME lpStartTime, NET_DVR_TIME lpStopTime, HWND hWnd);
boolean NET_DVR_PlayBackControl(NativeLong lPlayHandle, int dwControlCode, int dwInValue, IntByReference LPOutValue);
boolean NET_DVR_PlayBackControl_V40(NativeLong lPlayHandle, int dwControlCode, Pointer lpInBuffer, int dwInLen, Pointer lpOutBuffer, IntByReference LPOutValue);
NativeLong NET_DVR_GetFileByTime(NativeLong lUserID, NativeLong lChannel, NET_DVR_TIME lpStartTime, NET_DVR_TIME lpStopTime, String sSavedFileName);
boolean NET_DVR_StopGetFile(NativeLong lFileHandle);
boolean NET_DVR_GetDVRConfig(NativeLong lUserID, int dwCommand, NativeLong lChannel, Pointer lpOutBuffer, int dwOutBufferSize, IntByReference lpBytesReturned);
}
上述代码比较多,可以只看思路,没必要全看,因为每个人的需求不同,用到的SDK也不尽相同。下面以下载视频的代码为例演示如何在项目中使用SDK。
import com.sun.jna.NativeLong;
import com.sun.jna.ptr.IntByReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.time.LocalDateTime;
/**
* @author DiCaprito
*/
public class Test {
private static final Logger LOGGER = LoggerFactory.getLogger(Test.class);
private static HcNetSdk hCNetSDK = HcNetSdk.INSTANCE;
public Boolean download(NativeLong userId, LocalDateTime startTime, LocalDateTime stopTime) throws Exception {
LOGGER.info("[HikService]#Start to download video.");
HcNetSdk.NET_DVR_TIME struStartTime = new HcNetSdk.NET_DVR_TIME();
HcNetSdk.NET_DVR_TIME struStopTime = new HcNetSdk.NET_DVR_TIME();
// 开始时间
struStartTime.dwYear = startTime.getYear();
struStartTime.dwMonth = startTime.getMonth().getValue();
struStartTime.dwDay = startTime.getDayOfMonth();
struStartTime.dwHour = startTime.getHour();
struStartTime.dwMinute = startTime.getMinute();
struStartTime.dwSecond = startTime.getSecond();
// 结束时间
struStopTime.dwYear = stopTime.getYear();
struStopTime.dwMonth = stopTime.getMonth().getValue();
struStopTime.dwDay = stopTime.getDayOfMonth();
struStopTime.dwHour = stopTime.getHour();
struStopTime.dwMinute = stopTime.getMinute();
struStopTime.dwSecond = stopTime.getSecond();
String fileName = "";
int channel = 1;
LOGGER.info("sFileName: " + fileName);
NativeLong loadHandle = hCNetSDK.NET_DVR_GetFileByTime(userId, new NativeLong(channel), struStartTime,
struStopTime, fileName);
if (loadHandle.intValue() >= 0) {
LOGGER.info("[HikService]#Start to download.");
hCNetSDK.NET_DVR_PlayBackControl(loadHandle, HcNetSdk.NET_DVR_PLAY_START, 0, null);
while (true) {
IntByReference nPos = new IntByReference(0);
boolean success = hCNetSDK.NET_DVR_PlayBackControl(loadHandle, HcNetSdk.NET_DVR_PLAY_GET_POS, 0, nPos);
if (!success) {
return null;
}
LOGGER.info("[HikService]#Download process: {}", nPos.getValue());
if (nPos.getValue() > 100) {
hCNetSDK.NET_DVR_StopGetFile(loadHandle);
loadHandle.setValue(-1);
LOGGER.error("[HikService]#Download exception.");
return false;
} else if (nPos.getValue() == 100) {
hCNetSDK.NET_DVR_StopGetFile(loadHandle);
loadHandle.setValue(-1);
break;
} else {
//下载进度
}
}
} else {
LOGGER.error("[HikService]#Download failed.");
return false;
}
LOGGER.info("[HikService]#Download success.");
return true;
}
}
以上就是我在进行海康SDK开发时的一些体会,欢迎骚扰。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/25385.html