海康摄像头二次开发详解
准备
海康摄像头SDK开发下载路径:
https://www.hikvision.com/cn/download_61.html
下载解压之后的目录结构:
1 中为需要加载的库文件;2中有所需的jar包及HCNetSDK.java文件
开发过程中遇到的问题记录:
- 一定要记得开启日志打印与及时获取最后一次的错误状态码
- 一个ip下面会有多个摄像头
- 如果返回的错误状态码为10:有可能是端口不对,改用8000试试
- 如果可以登陆却无法控制,有可能是通道错误,有的摄像机通道从1开始,有的从33开始【可通过NET_DVR_GetDVRConfig/NET_DVR_SetDVRConfig来查询和修改相关配置】
- 查询保存的历史视频的起始时间时:NET_DVR_RECORD_TIME_SPAN_INQUIRY结构体占用内存的大小是68个字节
添加maven依赖
<!--海康录像机二次开发依赖jar包-->
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>3.0.9</version>
</dependency>
<!--海康录像机sdk官方提供jar包-->
<dependency>
<groupId>com.qy</groupId>
<artifactId>examples</artifactId><!--需要在maven自行安装这个jar包-->
<version>1.0.0</version>
</dependency>
下面代码中会出现的实体类
CameraManage实体类:
private String deviceIp;
private Integer devicePort;
private String username;
private String password;
ControlDto实体类:
private Long controlUserId;//用户id
private Long channel;//通道【有的类型通道从1开始,有的则从33开始,具体看摄像头配置】
private Integer command;//命令
private Integer motionSpeed;//运动速度
private Integer runOrStop;//0启动/1停止
HCNetSDK.java文件中缺失的部分类/方法
//加载库文件时使用
public static class BYTE_ARRAY extends Structure
{
public byte[] byValue;
public BYTE_ARRAY(int iLen) {
byValue = new byte[iLen];
}
@Override
protected List<String> getFieldOrder() {
// TODO Auto-generated method stub
return Arrays.asList("byValue");
}
}
public static class NET_DVR_RECORD_TIME_SPAN_INQUIRY extends Structure
{
public int dwSize; //结构体大小
public byte byType; //0 正常音视频录像, 1图片通道录像, 2ANR通道录像, 3抽帧通道录像
public byte[] byRes = new byte[63]; //保留
}
public static class NET_DVR_RECORD_TIME_SPAN extends Structure
{
public int dwSize; //结构体大小
public NET_DVR_TIME strBeginTime; //开始时间
public NET_DVR_TIME strEndTime; //结束时间
public byte byType; //0 正常音视频录像, 1图片通道录像, 2ANR通道录像, 3抽帧通道录像
public byte[] byRes = new byte[35]; //保留
@Override
public String toString() {
return "NET_DVR_RECORD_TIME_SPAN{" +
"dwSize=" + dwSize +
", strBeginTime=" + strBeginTime +
", strEndTime=" + strEndTime +
", byType=" + byType +
", byRes=" + Arrays.toString(byRes) +
'}';
}
}
boolean NET_DVR_InquiryRecordTimeSpan(NativeLong lUserID, int dwChannel, NET_DVR_RECORD_TIME_SPAN_INQUIRY lpInquiry, NET_DVR_RECORD_TIME_SPAN lpResult);
加载库文件:
//修改HCNetSDK.java文件中的加载路径
//如果是jar包可能找不到jar包中的文件,所以需要单独存放
HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary("此处为linux存放库文件libhcnetsdk.so的路径",HCNetSDK.class);
hcNetSDK = HCNetSDK.INSTANCE;
//如果某些文件加载不到需要手动加载,加载过程如下
//设置HCNetSDKCom组件库所在路径
String strPathCom = "/opt/project/yc/yc-video/HCNetLib";
HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();
System.out.println(strPathCom.getBytes());
System.out.println(struComPath.sPath);
System.