海康摄像头二次开发详解

  • 准备
    • 海康摄像头SDK开发下载路径:
    • 开发过程中遇到的问题记录:
    • 添加maven依赖
  • 下面代码中会出现的实体类
    • CameraManage实体类:
    • ControlDto实体类:
  • HCNetSDK.java文件中缺失的部分类/方法
  • 加载库文件:
  • 初始化:
  • 登录
  • 控制:
  • 查询历史视频保存时间:
  • 退出登陆释放资源:
  • 完整代码:
  • 视频下载、回放、视频直播、抓图等功能

准备

海康摄像头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];}@Overrideprotected List<String> getFieldOrder() {// TODO Auto-generated method stubreturn 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];     //保留@Overridepublic 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.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());struComPath.write();hcNetSDK.NET_DVR_SetSDKInitCfg(2, struComPath.getPointer());//设置libcrypto.so所在路径HCNetSDK.BYTE_ARRAY ptrByteArrayCrypto = new HCNetSDK.BYTE_ARRAY(256);String strPathCrypto = "/opt/project/yc/yc-video/HCNetLib/libcrypto.so";System.arraycopy(strPathCrypto.getBytes(), 0, ptrByteArrayCrypto.byValue, 0, strPathCrypto.length());ptrByteArrayCrypto.write();hcNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArrayCrypto.getPointer());//设置libssl.so所在路径HCNetSDK.BYTE_ARRAY ptrByteArraySsl = new HCNetSDK.BYTE_ARRAY(256);String strPathSsl = "/opt/project/yc/yc-video/HCNetLib/libssl.so";System.arraycopy(strPathSsl.getBytes(), 0, ptrByteArraySsl.byValue, 0, strPathSsl.length());ptrByteArraySsl.write();hcNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArraySsl.getPointer());

初始化:

 //设置连接超时时间及尝试次数if (!StringUtils.isEmpty(dwWaitTime) && !StringUtils.isEmpty(dwTryTimes)){boolean b1 = hcNetSDK.NET_DVR_SetConnectTime(Integer.parseInt(dwWaitTime), Integer.parseInt(dwTryTimes));}//开启日志hcNetSDK.NET_DVR_SetLogToFile(true,"/logs-video/",true);//初始化boolean initFlag = hcNetSDK.NET_DVR_Init();if(!initFlag) {return new ResultMoudel(ResultMoudel.ERROR_FLAG,"初始化失败NET_DVR_Init,状态码为"+hcNetSDK.NET_DVR_GetLastError());}

登录

 //登陆HCNetSDK.NET_DVR_DEVICEINFO_V30 deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();NativeLong userId = hcNetSDK.NET_DVR_Login_V30(cameraManage.getDeviceIp(), (short) cameraManage.getDevicePort().shortValue(), cameraManage.getUsername(), cameraManage.getPassword(), deviceInfo);long lUserId = userId.intValue();if(lUserId !=-1 || 4294967295L != lUserId) {Map<String, Long> hashMap = new HashMap<>();hashMap.put("controlUserId",lUserId);hashMap.put("channel",Long.parseLong(cameraManage.getDeviceNumber()) + 32);MAP_USERID_AND_CHANNEL.put(cameraManage.getDeviceIp(), hashMap);return new ResultMoudel(ResultMoudel.SUCCESS_FLAG,hashMap);}return new ResultMoudel(ResultMoudel.ERROR_FLAG,"登陆失败,状态码为"+hcNetSDK.NET_DVR_GetLastError());

控制:

 NativeLong channel = new NativeLong(controlDto.getChannel());NativeLong controlUserId = new NativeLong(controlDto.getControlUserId());boolean b = hcNetSDK.NET_DVR_PTZControlWithSpeed_Other(controlUserId, channel, controlDto.getCommand(), controlDto.getRunOrStop(), controlDto.getMotionSpeed());if (b){return new ResultMoudel(ResultMoudel.SUCCESS_FLAG,"正在控制,状态码为"+hcNetSDK.NET_DVR_GetLastError());}return new ResultMoudel(ResultMoudel.ERROR_FLAG,"控制失败,状态码为"+hcNetSDK.NET_DVR_GetLastError());

查询历史视频保存时间:

 NativeLong userIdn = new NativeLong(controlUserId);HCNetSDK.NET_DVR_RECORD_TIME_SPAN_INQUIRY ipInquiry = new  HCNetSDK.NET_DVR_RECORD_TIME_SPAN_INQUIRY();ipInquiry.dwSize = 68;//68为结构体大小ipInquiry.byType = 0;HCNetSDK.NET_DVR_RECORD_TIME_SPAN ipResult = new HCNetSDK.NET_DVR_RECORD_TIME_SPAN();boolean b = hcNetSDK.NET_DVR_InquiryRecordTimeSpan(userIdn, channel, ipInquiry, ipResult);//获取开始时间HCNetSDK.NET_DVR_TIME strBeginTime = ipResult.strBeginTime;//获取结束时间HCNetSDK.NET_DVR_TIME strEndTime = ipResult.strEndTime;

退出登陆释放资源:

//退出登陆
boolean b = hcNetSDK.NET_DVR_Logout(new NativeLong(manageUserId));//释放资源
boolean b1 = hcNetSDK.NET_DVR_Cleanup();

完整代码:

public class VideoUtils {private static HCNetSDK hcNetSDK;// 用于缓存登陆信息,以防止短时间内重复登陆private static final Map<String,Map<String,Long>> MAP_USERID_AND_CHANNEL = new HashMap<>();//登陆public static ResultMoudel login(CameraManage cameraManage){//加载所需文件ResultMoudel resultMoudel = initHCNetSDK();if (ResultMoudel.ERROR_FLAG.equals(resultMoudel.getResultFlag())){return resultMoudel;}if (!StringUtils.isEmpty(cameraManage.getDeviceIp()) && MAP_USERID_AND_CHANNEL.containsKey(cameraManage.getDeviceIp())){Map<String, Long> stringLongMap = MAP_USERID_AND_CHANNEL.get(cameraManage.getDeviceIp());stringLongMap.put("channel",Long.parseLong(cameraManage.getDeviceNumber()) + 32);return  new ResultMoudel(ResultMoudel.SUCCESS_FLAG, stringLongMap);}//登陆HCNetSDK.NET_DVR_DEVICEINFO_V30 deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();NativeLong userId = hcNetSDK.NET_DVR_Login_V30(cameraManage.getDeviceIp(), (short) cameraManage.getDevicePort().shortValue(), cameraManage.getUsername(), cameraManage.getPassword(), deviceInfo);long lUserId = userId.intValue();if(lUserId !=-1 || 4294967295L != lUserId) {Map<String, Long> hashMap = new HashMap<>();hashMap.put("controlUserId",lUserId);hashMap.put("channel",Long.parseLong(cameraManage.getDeviceNumber()) + 32);MAP_USERID_AND_CHANNEL.put(cameraManage.getDeviceIp(), hashMap);return new ResultMoudel(ResultMoudel.SUCCESS_FLAG,hashMap);}return new ResultMoudel(ResultMoudel.ERROR_FLAG,"登陆失败,状态码为"+hcNetSDK.NET_DVR_GetLastError());}//控制public static ResultMoudel commandControl(ControlDto controlDto) {NativeLong channel = new NativeLong(controlDto.getChannel());NativeLong controlUserId = new NativeLong(controlDto.getControlUserId());boolean b = hcNetSDK.NET_DVR_PTZControlWithSpeed_Other(controlUserId, channel, controlDto.getCommand(), controlDto.getRunOrStop(), controlDto.getMotionSpeed());if (b){return new ResultMoudel(ResultMoudel.SUCCESS_FLAG,"正在控制,状态码为"+hcNetSDK.NET_DVR_GetLastError());}return new ResultMoudel(ResultMoudel.ERROR_FLAG,"控制失败,状态码为"+hcNetSDK.NET_DVR_GetLastError());}//退出登陆public static ResultMoudel logout(Long manageUserId) {//退出登陆boolean b = hcNetSDK.NET_DVR_Logout(new NativeLong(manageUserId));return null;}//释放资源public static ResultMoudel release() {boolean b1 = hcNetSDK.NET_DVR_Cleanup();hcNetSDK = null;return null;}//初始化private static ResultMoudel initHCNetSDK() {if (hcNetSDK == null){System.out.println(HCNetSDK.MAX_NAMELEN);hcNetSDK = HCNetSDK.INSTANCE;//设置HCNetSDKCom组件库所在路径String strPathCom = File.separator +"opt"+ File.separator +"project"+ File.separator +"yc-other" + File.separator + "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.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());struComPath.write();hcNetSDK.NET_DVR_SetSDKInitCfg(2, struComPath.getPointer());//设置libcrypto.so所在路径HCNetSDK.BYTE_ARRAY ptrByteArrayCrypto = new HCNetSDK.BYTE_ARRAY(256);String strPathCrypto = File.separator +"opt"+ File.separator +"project"+ File.separator +"yc-other" + File.separator + "HCNetLib" + File.separator+"libcrypto.so";System.arraycopy(strPathCrypto.getBytes(), 0, ptrByteArrayCrypto.byValue, 0, strPathCrypto.length());ptrByteArrayCrypto.write();hcNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArrayCrypto.getPointer());//设置libssl.so所在路径HCNetSDK.BYTE_ARRAY ptrByteArraySsl = new HCNetSDK.BYTE_ARRAY(256);String strPathSsl = File.separator +"opt"+ File.separator +"project"+ File.separator +"yc-other" + File.separator + "HCNetLib" + File.separator+"libssl.so";System.arraycopy(strPathSsl.getBytes(), 0, ptrByteArraySsl.byValue, 0, strPathSsl.length());ptrByteArraySsl.write();hcNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArraySsl.getPointer());//开启日志hcNetSDK.NET_DVR_SetLogToFile(true,"/logs-video/",true);//初始化boolean initFlag = hcNetSDK.NET_DVR_Init();if(!initFlag) {return new ResultMoudel(ResultMoudel.ERROR_FLAG,"初始化失败NET_DVR_Init,状态码为"+hcNetSDK.NET_DVR_GetLastError());}}return new ResultMoudel(ResultMoudel.SUCCESS_FLAG,"初始化成功,状态码为:"+hcNetSDK.NET_DVR_GetLastError());}//获取历史视频起始时间public static List<String> getHistoryVideoMonthlyCalendar(Long controlUserId, Integer channel) {NativeLong userIdn = new NativeLong(controlUserId);HCNetSDK.NET_DVR_RECORD_TIME_SPAN_INQUIRY ipInquiry = new  HCNetSDK.NET_DVR_RECORD_TIME_SPAN_INQUIRY();ipInquiry.dwSize = 68;ipInquiry.byType = 0;HCNetSDK.NET_DVR_RECORD_TIME_SPAN ipResult = new HCNetSDK.NET_DVR_RECORD_TIME_SPAN();boolean b = hcNetSDK.NET_DVR_InquiryRecordTimeSpan(userIdn, channel, ipInquiry, ipResult);//获取开始时间HCNetSDK.NET_DVR_TIME strBeginTime = ipResult.strBeginTime;//获取结束时间HCNetSDK.NET_DVR_TIME strEndTime = ipResult.strEndTime;//获取起始时间和结束时间List<String> strings = bingMonthlyCalendar(strBeginTime, strEndTime);return dateList;}private static List<String> bingMonthlyCalendar(HCNetSDK.NET_DVR_TIME strBeginTime, HCNetSDK.NET_DVR_TIME strEndTime) {int yearStart = strBeginTime.dwYear;int monthStart = strBeginTime.dwMonth;int dayStart = strBeginTime.dwDay;int yearEnd = strEndTime.dwYear;int monthEnd = strEndTime.dwMonth;int dayEnd = strEndTime.dwDay;String start = yearStart+"-"+monthStart+"-"+dayStart;String end = yearEnd+"-"+monthEnd+"-"+dayEnd;List<String> list1 = new ArrayList<>();list1.add(start);list1.add(end);return list1;}
}

视频下载、回放、视频直播、抓图等功能

视频下载、回放、视频直播、抓图等功能可以参考上述方法并按照开发文档的描述进行开发

如果开发遇到什么问题请留言评论呀。

▄█▀█●各位同仁,如果我的代码对你有帮助,请给我一个赞吧!

海康摄像头二次开发详解,包含海康摄像头登录、海康云台控制、视频下载等功能相关推荐

  1. 微信公众号 开发详解01【目的、起名、准备工作、注册流程、后台功能】

    [微信公众号--零基础全面系统教学] [P01-P07]微信公众号 开发详解01[目的.起名.准备工作.注册流程.后台功能] [P08-P12]微信公众号 开发详解02[自动回复.发布文章.自定义菜单 ...

  2. JAVA使用摄像头录制_JavaCV开发详解之1:调用本机摄像头视频(建议使用javaCV最新版本)...

    引入依赖 org.bytedeco javacv 1.5.3 org.bytedeco javacv-platform 1.5.3 代码实现 package com.java.mmzsblog; im ...

  3. 【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)

    作者 : 韩曙亮  博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csd ...

  4. JavaCV开发详解专栏文章目录(JavaCV速查手册)

    本章作为**JavaCV开发详解**专栏的目录. 为了方便大家分类查找,我们把分为两个目录: 第一个分类目录,根据文章技术类型进行分类. 第二个目录,按照博主更新顺序排列. 有些文章既是设备采集又实现 ...

  5. 微信公众号 开发详解02【自动回复、发布文章、自定义菜单、3种链接跳转】

    [微信公众号--零基础全面系统教学] [P01-P07]微信公众号 开发详解01[目的.起名.准备工作.注册流程.后台功能] [P08-P12]微信公众号 开发详解02[自动回复.发布文章.自定义菜单 ...

  6. JavaCV开发详解之32:使用filter滤镜实现中文字符叠加

    javacv实战专栏目录: JavaCV实战专栏文章目录(JavaCV速查手册) 前言 我们在 javaCV开发详解之13:使用FFmpeg Filter过滤器处理音视频中已经简单介绍过如何使用jav ...

  7. JavaCV开发详解之34:使用filter滤镜实现字符滚动和无限循环滚动字符叠加,跑马灯特效制作

    javacv实战专栏目录: JavaCV实战专栏文章目录(JavaCV速查手册) 前言 我们在 javaCV开发详解之13:使用FFmpeg Filter过滤器处理音视频中已经简单介绍过如何使用jav ...

  8. 海康摄像头二次开发python_python实现海康sdk二次开发,移动侦测事件(一)

    1.概述 最近一段时间要从海康摄像头读取数据,作为程序的输入源,c++版本有海康有自己的demo,较为简单,很容易就实现了,但是为我们其他的程序都是基于python的,因此,需要使用Python调用海 ...

  9. 【海康摄像头二次开发】移植海康摄像头Android SDK并实现多屏显示

    文章目录 前言 一.看海康的例程 二.重要的函数分析 HCNetSDK PlayerSDK 三.移植 1.引入库 3.写一个设备信息管理的类 4.设备登录的类 5.视频显示的控件 6.通用的工具类 7 ...

最新文章

  1. 关于Background-size的几个参数区别
  2. Android系统(221)---O版自定义开关机动画
  3. Linux虚拟文件系统(安装根文件系统)
  4. 字节跳动薪酬体系最全揭晓|看完我是真酸了,不服不行
  5. 如何查看电脑里的隐藏文件?
  6. 新能源车牌识别技术发展到哪一步了?
  7. win10 插上有线耳机 无声音:装上声卡驱动【检查】
  8. [Python从零到壹] 五十八.图像增强及运算篇之图像锐化Sobel、Laplacian算子实现边缘检测
  9. 火车头采集ajax网址的技巧,使用post方法获得采集网址
  10. Android 编译之make基础(转)
  11. office 所有后缀对应的 content-type
  12. 中视典编辑器 输出html5,虚拟现实软件|VRP-BUILDER 虚拟现实编辑器 - 【中视典数字科技】...
  13. Android笔记:Dialog显示图片
  14. 赠与今年的大学毕业生 胡适
  15. JAVA判断时间是否过期
  16. 窄带物联网技术(NB-IoT)在智慧消防建设方面的应用
  17. h5 rtmp推荐控件_H5浏览器播放RTMP直播流
  18. 中国计算机学会推荐国际学术期刊  (计算机系统与高性能计算)
  19. 极限的保号性、无穷小运算法则、七种未定型
  20. 九鼎X210 tftp服务器搭建

热门文章

  1. adb按键精灵_雷电安卓模拟器修改信息及常用adb命令整理贴
  2. 游戏服务器——中心服
  3. C语言:va_list
  4. IOS端使用WebRTC实现一对一音视频通话
  5. wav文件格式分析与详解
  6. Java的abstract
  7. 树莓派通过MFRC522写UIC卡0扇区
  8. VUE activated,deactivated使用
  9. 微软 Build 2016年开发者大会发布多项功能升级
  10. phobos 调试 javascript