海康摄像头二次开发详解,包含海康摄像头登录、海康云台控制、视频下载等功能
海康摄像头二次开发详解
- 准备
- 海康摄像头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;}
}
视频下载、回放、视频直播、抓图等功能
视频下载、回放、视频直播、抓图等功能可以参考上述方法并按照开发文档的描述进行开发
如果开发遇到什么问题请留言评论呀。
▄█▀█●各位同仁,如果我的代码对你有帮助,请给我一个赞吧!
海康摄像头二次开发详解,包含海康摄像头登录、海康云台控制、视频下载等功能相关推荐
- 微信公众号 开发详解01【目的、起名、准备工作、注册流程、后台功能】
[微信公众号--零基础全面系统教学] [P01-P07]微信公众号 开发详解01[目的.起名.准备工作.注册流程.后台功能] [P08-P12]微信公众号 开发详解02[自动回复.发布文章.自定义菜单 ...
- JAVA使用摄像头录制_JavaCV开发详解之1:调用本机摄像头视频(建议使用javaCV最新版本)...
引入依赖 org.bytedeco javacv 1.5.3 org.bytedeco javacv-platform 1.5.3 代码实现 package com.java.mmzsblog; im ...
- 【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csd ...
- JavaCV开发详解专栏文章目录(JavaCV速查手册)
本章作为**JavaCV开发详解**专栏的目录. 为了方便大家分类查找,我们把分为两个目录: 第一个分类目录,根据文章技术类型进行分类. 第二个目录,按照博主更新顺序排列. 有些文章既是设备采集又实现 ...
- 微信公众号 开发详解02【自动回复、发布文章、自定义菜单、3种链接跳转】
[微信公众号--零基础全面系统教学] [P01-P07]微信公众号 开发详解01[目的.起名.准备工作.注册流程.后台功能] [P08-P12]微信公众号 开发详解02[自动回复.发布文章.自定义菜单 ...
- JavaCV开发详解之32:使用filter滤镜实现中文字符叠加
javacv实战专栏目录: JavaCV实战专栏文章目录(JavaCV速查手册) 前言 我们在 javaCV开发详解之13:使用FFmpeg Filter过滤器处理音视频中已经简单介绍过如何使用jav ...
- JavaCV开发详解之34:使用filter滤镜实现字符滚动和无限循环滚动字符叠加,跑马灯特效制作
javacv实战专栏目录: JavaCV实战专栏文章目录(JavaCV速查手册) 前言 我们在 javaCV开发详解之13:使用FFmpeg Filter过滤器处理音视频中已经简单介绍过如何使用jav ...
- 海康摄像头二次开发python_python实现海康sdk二次开发,移动侦测事件(一)
1.概述 最近一段时间要从海康摄像头读取数据,作为程序的输入源,c++版本有海康有自己的demo,较为简单,很容易就实现了,但是为我们其他的程序都是基于python的,因此,需要使用Python调用海 ...
- 【海康摄像头二次开发】移植海康摄像头Android SDK并实现多屏显示
文章目录 前言 一.看海康的例程 二.重要的函数分析 HCNetSDK PlayerSDK 三.移植 1.引入库 3.写一个设备信息管理的类 4.设备登录的类 5.视频显示的控件 6.通用的工具类 7 ...
最新文章
- 关于Background-size的几个参数区别
- Android系统(221)---O版自定义开关机动画
- Linux虚拟文件系统(安装根文件系统)
- 字节跳动薪酬体系最全揭晓|看完我是真酸了,不服不行
- 如何查看电脑里的隐藏文件?
- 新能源车牌识别技术发展到哪一步了?
- win10 插上有线耳机 无声音:装上声卡驱动【检查】
- [Python从零到壹] 五十八.图像增强及运算篇之图像锐化Sobel、Laplacian算子实现边缘检测
- 火车头采集ajax网址的技巧,使用post方法获得采集网址
- Android 编译之make基础(转)
- office 所有后缀对应的 content-type
- 中视典编辑器 输出html5,虚拟现实软件|VRP-BUILDER 虚拟现实编辑器 - 【中视典数字科技】...
- Android笔记:Dialog显示图片
- 赠与今年的大学毕业生 胡适
- JAVA判断时间是否过期
- 窄带物联网技术(NB-IoT)在智慧消防建设方面的应用
- h5 rtmp推荐控件_H5浏览器播放RTMP直播流
- 中国计算机学会推荐国际学术期刊 (计算机系统与高性能计算)
- 极限的保号性、无穷小运算法则、七种未定型
- 九鼎X210 tftp服务器搭建