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 809C - Find a car(找性质)

    Codeforces 题目传送门 & 洛谷题目传送门 首先拿到这类题第一步肯定要分析题目给出的矩阵有什么性质.稍微打个表即可发现题目要求的矩形是一个分形.形式化地说,该矩形可以通过以下方式生成 ...

  2. LOJ 3399 -「2020-2021 集训队作业」Communication Network(推式子+组合意义+树形 DP)

    题面传送门 一道推式子题. 首先列出柿子,\(ans=\sum\limits_{T_2}|T_1\cap T_2|·2^{T_1\cap T_2}\) 这个东西没法直接处理,不过注意到有一个柿子 \( ...

  3. 关于GCC编译

    GCC参数详解 gcc是gnu compiler collection 的简称,他包含了多种语言的编译器,如C, C++, Objective-C, Objective-C++, Java, Fort ...

  4. mac 下 如何在同一窗口打开多个终端并实现快捷键切换

    相信大家编代码的时候都会遇到,每次需要在头文件,库文件和源码文件中编代码的时候,总是需要在几个文件中切换来切换去的,而且一个文件就一个终端窗口,每次都要用鼠标点来点去,非常麻烦,所以如果能把这几个文件 ...

  5. 浅谈Facebook的服务器架构

    导读:毫无疑问,作为全球最领先的社交网络,Facebook的高性能集群系统承担了海量数据的处理,它的服务器架构一直为业界众人所关注.CSDN博主yanghehong在他自己最新的一篇博客< Fa ...

  6. C++20协程实例:携程化的IOCP服务端/客户端

    VC支持协程已经有一段时间了,之前一直想不明白协程的意义在哪里,前几天拉屎的时候突然灵光一闪: 以下是伪代码: task server() { for (;;) { sock_context s = ...

  7. linux系统中上传文件与下载文件的方式

    方式一:FileZilla 使用FileZilla第三方工具 绿色版直接打开exe文件即可 主机:连接的linux服务器的IP地址 用户名:登录的用户名 密码:登录密码 端口:默认使用22 左边是自己 ...

  8. Spark产生数据倾斜的原因以及解决办法

    Spark数据倾斜 产生原因 首先RDD的逻辑其实时表示一个对象集合.在物理执行期间,RDD会被分为一系列的分区,每个分区都是整个数据集的子集.当spark调度并运行任务的时候,Spark会为每一个分 ...

  9. Scala【需求二:求各省市的各个指标】

    需求处理步骤 原始数据->json->过滤->列裁剪 需求二:求各省市的各个指标 原始数据 文本pmt.json,每一行都是一个json字符串.里面包含ip等信息 {"se ...

  10. 零基础学习java------35---------删除一个商品案例,删除多个商品,编辑(修改商品信息),校验用户名是否已经注册(ajax)

    一. 删除一个商品案例 将要操作的表格 思路图  前端代码 <%@ page language="java" contentType="text/html; cha ...