19年的时候做了一个视频分析的产品,用户使用的安防摄像机基本的都是海康大华宇视,今天写一下关于Java调用海康威视摄像机的demo,当时也踩了很多坑。写个博客记录一下

测试环境:

系统:Centos 7

SDK:设备网络SDK Linux64

SDK基本的调用流程:

图中中虚线框的流程是可选部分,不会影响其他流程和模块的功能使用。按实现功能的不同可以分 成十个模块,实现每个模块的功能时初始化 SDK、用户注册设备、注销设备和释放 SDK 资源这 4 个流程是必不可少的。

SO动态库介绍:

关于so动态库大概有这么多,

主要的两个库分别是:libhcnetsdk.so 外部接口库 和libPlayCtrl.so视频播放解码库

初始化SDK(NET_DVR_Init)

/**
* 海康SDK初始化
*
* @author 云深小麦
*/
private static void getSdkInit() {
boolean response = HKNETSDK.NET_DVR_Init();
if (!response) {
log.info("sdkClient.getSdkInit.NET_DVR_Init error:{}", HKNETSDK.NET_DVR_GetLastError());
}
}

NET_DVR_Init:初始化 SDK

true 表示成功,false 表示失败。

NET_DVR_GetLastError:返回最后操作的错误码

建议没次调用SDK里的接

口都打印一下这个接口,返回0代表没有错误,就怕打印别的

用户注册设备(NET_DVR_Login_V40)

/**
* 海康设备登录
*
* @param camera
* @return NativeLong
* @author 云深小麦
*/
private NativeLong getLogin(AlgorithmParam camera) {
HCNetSDK.NET_DVR_USER_LOGIN_INFO loginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();
for (int i = 0; i < camera.getIp().length(); i++) {
loginInfo.sDeviceAddress[i] = (byte) camera.getIp().charAt(i);
}
for (int i = 0; i < camera.getPassword().length(); i++) {
loginInfo.sPassword[i] = (byte) camera.getPassword().charAt(i);
}
for (int i = 0; i < camera.getUser().length(); i++) {
loginInfo.sUserName[i] = (byte) camera.getUser().charAt(i);
}
loginInfo.wPort = camera.getPort().shortValue();
loginInfo.write();
HCNetSDK.NET_DVR_DEVICEINFO_V40 dvrDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();
Pointer loginInfoPointer = loginInfo.getPointer();
Pointer deviceInfoPointer = dvrDeviceInfo.getPointer();
log.info("streamServiceImpl.NET_DVR_Login_V40.NET_DVR_Login_V40 request:{}", new Gson().toJson(camera));
NativeLong nativeLong = HKNETSDK.NET_DVR_Login_V40(loginInfoPointer, deviceInfoPointer);
if (nativeLong.intValue() > 0) {
log.error("streamServiceImpl.NET_DVR_Login_V40.NET_DVR_Login_V40 error:{}", HKNETSDK.NET_DVR_GetLastError());
throw new StreamException(HKNETSDK.NET_DVR_GetLastError());
}
log.info("streamServiceImpl.getLogin error:{}", HKNETSDK.NET_DVR_GetLastError());
return nativeLong;
}

图中用的NET_DVR_Login_V30,代码中我用的NET_DVR_Login_V40

区别在于:V30传的是多个 单个参数,V40是把多个参数封装成了对象

NativeLong NET_DVR_Login_V30(String sDVRIP, short wDVRPort, String sUserName, String sPassword, NET_DVR_DEVICEINFO_V30 lpDeviceInfo);
NativeLong NET_DVR_Login_V40(Pointer pLoginInfo, Pointer lpDeviceInfo);

参数:登录参数,包括设备地址、登录用户、密码等

返回-1 表示登录失败,其他值表示返回的用 户 ID 值

用户注销(NET_DVR_Logout)

true 表示成功,false 表示失败。

/**
* 用户注销
*
* @return NativeLong
* @author 云深小麦
*/
private void getLoginOut(NativeLong aLong) {
boolean response = HKNETSDK.NET_DVR_Logout(aLong);
if (!response) {
log.info("streamServiceImpl.NET_DVR_Logout.NET_DVR_Logout error:{}", HKNETSDK.NET_DVR_GetLastError());
}
}

释放 SDK 资源 (NET_DVR_Cleanup)

true 表示成功,false 表示失败。

/**
* 是否SDK资源
*
* @author 云深小麦
*/
private static void getSdkCleanup() {
boolean response = HKNETSDK.NET_DVR_Cleanup();
if (!response) {
log.info("sdkClient.getSdkCleanup.NET_DVR_Cleanup error:{}", HKNETSDK.NET_DVR_GetLastError());
}
}

代码写的太乱,我还在整理中。。。

注意:so动态库是linux版本的,windows版本的有部分接口不一样

海康威视Java SDK拉流(一)初始化SDK的更多相关文章

  1. 海康威视摄像机Java SDK拉流(二)开启关闭实时预览

    本篇介绍海康威视摄像机通过SDK开启关闭实时预览接口 下篇介绍实时预览的回调函数及解码库 测试环境: 系统:Centos 7 SDK:设备网络SDK Linux64 实时预览模块流程: 图中虚线框部分 ...

  2. java封装FFmpeg命令,支持原生ffmpeg全部命令,实现FFmpeg多进程处理与多线程输出控制(开启、关闭、查询),rtsp/rtmp推流、拉流

    前言: 之前已经对FFmpeg命令进行了封装http://blog.csdn.net/eguid_1/article/details/51787646,但是当时没有考虑到扩展性,所以总体设计不是太好, ...

  3. java.lang.NoClassDefFoundError: com/gexin/rp/sdk/exceptions/RequestException解决方法

    本文为博主原创,未经允许不得转载: 最近在开发个推的时候遇到的问题,当我在maven仓库中下载个推的jar包时,下载不下来,索性在项目中Configue build Path,将jar下载到本地 手动 ...

  4. Android使用ContentProvider初始化SDK库方案总结

    做Android SDK开发的时候,一般我们会将初始化的方法封装为,然后让调用SDK的开发者在Application的onCreate方法中进行初始化.但是目前一些主流的SDK框架,并没有提供相关的方 ...

  5. 兼容性强、简单、成熟、稳定的RTMPClient客户端拉流功能组件EasyRTMPClient

    EasyRTMPClient EasyRTMPClient拉流功能组件是EasyDarwin流媒体团队开发.提供和维护的一套非常稳定.易用.支持重连的RTMPClient工具,SDK形式提供,全平台支 ...

  6. rtmp直播拉流客户端EasyRTMPClient TCP窗口大小设计方法

    EasyRTMPClient 简介 EasyRTMPClient是EasyDarwin流媒体团队开发.提供的一套非常稳定.易用.支持重连接的RTMPClient工具,以SDK形式提供,接口调用非常简单 ...

  7. javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转换为YUV、BGR24或RGB24等图像像素数据

    javacpp-ffmpeg系列: javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片 javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转 ...

  8. javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片

    javacpp-ffmpeg系列: javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片 javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转 ...

  9. iOS - 直播流程,视频推流,视频拉流,简介,SMTP、RTMP、HLS、 PLPlayerKit

    收藏笔记 1 . 音视频处理的一般流程: 数据采集→数据编码→数据传输(流媒体服务器) →解码数据→播放显示1.数据采集:摄像机及拾音器收集视频及音频数据,此时得到的为原始数据涉及技术或协议:摄像机: ...

随机推荐

  1. Codeforces 1368H - Breadboard Capacity(最小割+线段树维护矩阵乘法)

    Easy version:Codeforces 题面传送门 & 洛谷题面传送门 Hard version:Codeforces 题面传送门 & 洛谷题面传送门 首先看到这种从某一种颜色 ...

  2. 认识Influxdb时序数据库及Influxdb基础命令操作

    认识Influxdb时序数据库及Influxdb基础命令操作 一.什么是Influxdb,什么又是时序数据库 Influxdb是一个用于存储时间序列,事件和指标的开源数据库,由Go语言编写而成,无需外 ...

  3. 修改unittest源码之tearDown

    需求 最近在写selenium自动化平台,想把每条用例后面都带上截图,最开始是每条用例加上封装好的截图函数,但是发现太麻烦,就决定加在tearDown函数里面,每条用例结束后执行截图操作. 那么问题来 ...

  4. TOMCAT 搭建

    第一步:下载 软件 和 JDK 第二个:https://www.oracle.com/java/technologies/javase-jdk16-downloads.html 传输到Linux里. ...

  5. javaSE高级篇5 — java8新特性详解———更新完毕

    java8新特性 在前面已经见过一些东西了,但是:挖得有坑儿 1.lambda表达式 lambda表达式是jdk1.8引入的全新语法特性 它支持的是:只有单个抽象方法的函数式接口.什么意思? 就是说: ...

  6. 【STM32】使用SDIO进行SD卡读写,包含文件管理FatFs(一)-初步认识SD卡

    由于一张SD卡要能读写,涉及到的技术有些多,我打算分以下几篇博客 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(一)-初步认识SD卡 [STM32]使用SDIO进行SD卡读写,包含 ...

  7. 事务(@Transactional注解)的用法和实例

    参数 @Transactional可以配制那些参数及以其所代表的意义: 参数 意义 isolation 事务隔离级别 propagation 事务传播机制 readOnly 事务读写性 noRollb ...

  8. delete() and free() in C++

    In C++, delete operator should only be used either for the pointers pointing to the memory allocated ...

  9. @Order注解使用

    注解@Order或者接口Ordered的作用是定义Spring IOC容器中Bean的执行顺序的优先级,而不是定义Bean的加载顺序,Bean的加载顺序不受@Order或Ordered接口的影响: @ ...

  10. 我的第一篇博客blog,笑哭

    我的第一篇博客blog Markdown学习 一级标题:#加一个空格 加 文字, 二级标题:加2个##以此类推 字体 粗体:hello world!字体前有二个星号,字体后有二个星号 斜体:hello ...