在网上搜索了大量资料,都没有找到适合自己的。网上大部分都是对海康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;@Overridepublic 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);}@Overridepublic 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];@Overridepublic String toString() {return "NET_DVR_IPADDR.sIpV4: " + new String(sIpV4) + "\n" + "NET_DVR_IPADDR.byRes: " + new String(byRes) + "\n";}@Overridepublic 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];@Overridepublic String toString() {return "NET_DVR_IPDEVINFO{" +"dwEnable=" + dwEnable +", sUserName=" + Arrays.toString(sUserName) +", sPassword=" + Arrays.toString(sPassword) +", struIP=" + struIP +", wDVRPort=" + wDVRPort +", byres=" + Arrays.toString(byres) +'}';}@Overridepublic 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];@Overridepublic String toString() {return "NET_DVR_IPCHANINFO{" +"byEnable=" + byEnable +", byIPID=" + byIPID +", byChannel=" + byChannel +", byres=" + Arrays.toString(byres) +'}';}@Overridepublic 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];@Overridepublic String toString() {return "NET_DVR_IPPARACFG{" +"dwSize=" + dwSize +", struIPDevInfo=" + Arrays.toString(struIPDevInfo) +", byAnalogChanEnable=" + Arrays.toString(byAnalogChanEnable) +", struIPChanInfo=" + Arrays.toString(struIPChanInfo) +'}';}@Overridepublic 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];@Overridepublic 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) +'}';}@Overridepublic 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];@Overridepublic 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) +'}';}@Overridepublic 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];@Overridepublic 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) +'}';}@Overridepublic 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;@Overridepublic 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 +'}';}@Overridepublic 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();@Overridepublic String toString() {return "NET_DVR_FILECOND{" +"lChannel=" + lChannel +", dwFileType=" + dwFileType +", dwIsLocked=" + dwIsLocked +", dwUseCardNo=" + dwUseCardNo +", sCardNumber=" + Arrays.toString(sCardNumber) +", struStartTime=" + struStartTime +", struStopTime=" + struStopTime +'}';}@Overridepublic 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];@Overridepublic 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) +'}';}@Overridepublic 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();@Overridepublic String toString() {return "NET_DVR_SPECIAL_FINDINFO_UNION{" +"byLength=" + Arrays.toString(byLength) +", struATMFindInfo=" + struATMFindInfo +'}';}@Overridepublic 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;@Overridepublic String toString() {return "NET_DVR_ATMEINDINFO{" +"byTransactionType=" + byTransactionType +", byRes=" + Arrays.toString(byRes) +", dwTransationAmount=" + dwTransationAmount +'}';}@Overridepublic 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开发时的一些体会,欢迎骚扰。

基于海康SDK的web系统开发相关推荐

  1. 基于海康SDK开发文档分析+云台控制实现+经典案例

    基于海康SDK开发文档分析+云台控制实现+经典案例 上一篇:海康威视java开发+demo运行+调用dll动态库坑 一.准备 海康的SDK下载 https://www.hikvision.com/cn ...

  2. 基于海康sdk回放下载

    项目中遇到需要从海康crv查看录像和回放功能.研究了好久,最终搞好了.总的过程大致分为以下几步: 一.下载海康sdk包 去海康官网下载sdk包,注意:linux和windows下的包是不一样的!!!! ...

  3. python基于海康设备SDK二次开发(一)

    最近做了个小项目,帮助一家企业做LED屏实时显示车间人员考勤信息和显示工作人数,前后选型了好几款最近后选择海康威视的门禁机DS-K1T673M,由于该款设备只是作为人员认证通过用的,没有内置人员考勤组 ...

  4. 基于海康EhomeDemo工具排查公网部署出现的视频播放异常问题

    针对用户现场的各种异常问题,我们的技术人员在协助排查时,都会用到一些测试工具来测试和验证一些问题,比如海康的EhomeDemo工具.我们在此前的文章中也介绍过关于海康EhomeDemo工具的使用方法, ...

  5. python基于海康设备SDK的二次开发(三)

    (最近重新修改了下SDK,因为在两个车间各安装了一台设备) 再次使用下这张图 今天是海康设备SDK二次开发的第三天,也是最后一次,因为这次将进入功能开发程序阶段,前面两次已经做好了全部的前期工作 . ...

  6. 基于海康综合管理平台web插件开发的问题

    > ## 概述 我们做视频监控开发一般就是基于后台开发语言的SDK开发,以CS形式展现,但是现在越来越多的系统都是要在web端展示视频接口,实现方式基本上分为web插件开发.API接口地接(通过 ...

  7. 海康监控系统行为识别服务器,基于海康视频监控系统的目标检测和跟踪

    摘要: 随着人民生活质量的迅速提高,工业生产.家居生活服务.公共场所等各个领域的正常工作都要求智能视频监控系统的协助,并且对于智能监控系统的性能要求也越来越高.所谓智能视频监控系统就是指在不需要人为帮 ...

  8. 基于海康NetVideoActiveX.ocx进行远程视频开发!

    int ierr = 0;             string sServerIP = ""; sServerIP = this.axNetVideoActiveX1.GetSe ...

  9. Web系统开发构架再思考-前后端的完全分离

    前言 前后端完全分离其实一直是Web开发人员的梦想,也一直是我的梦想,遥想当年,无论是直接在代码里面输出HTML,还是在HTML里面嵌入各种代码,都不能让人感到满意.期间的痛苦和纠结,我想所有Web开 ...

最新文章

  1. java stringbuilder换行_初遇Java StringBuffer 和 StringBuilder 类利用 StringBuilder 给TextView实现换行处理...
  2. javascript --- 使用对象关联简化整体设计
  3. RUNOOB python练习题29
  4. 7-8 字符串字母大小写转换 (15 分)
  5. pca主成分分析_降维:主成分分析(PCA)
  6. Codeforces Round #655 (Div. 2) B C
  7. Spring源代码解析
  8. 脑电数据预处理,eeglab预处理采集的SSVEP数据
  9. 终端使用sopcast例子
  10. 到底如何理解文本?一文读懂命名实体识别(实体消歧和实体统一)
  11. [kernel]内核日志及printk结构分析
  12. 【搬家】写一个技术博客
  13. 10个BS后台UI框架
  14. 12、ABPZero系列教程之拼多多卖家工具 拼团提醒功能登录拼多多实现
  15. Android 手机设置 Charles 代理,pem 证书安装不上?
  16. Indian English(印度英语)
  17. 爆肝!朋友做了个编程导航网站!
  18. 工程电磁场第四章总结
  19. 超大容量远距离传输解决方案如何设计?
  20. Hive的分区(partition)-动态分区

热门文章

  1. 苹果软件更新在哪里_苹果再次为已停产的AirPort发布软件更新
  2. Stream 大数据量List分批处理 java8
  3. 法拉克机器人自动怎么调_发那科机器人的正确操作方法及步骤
  4. 3D动作手游的辅助瞄准算法(三)
  5. 原生php写简单的聊天室
  6. Redis数据库简介
  7. 怎么修改数据库服务器名字,修改SQL Server数据库服务器名字
  8. i5 8250u java_i5 8250U整机综合性能_笔记本评测-中关村在线
  9. 玩转Jetson AGX Orin—— Quick Start
  10. 普通人存多少钱才能不焦虑?