1. 前言
随着科技的不断发展,视频监控等领域的应用越来越广泛,而海康威视SDK作为开发人员在该领域必不可少的工具之一,为开发者提供了非常便捷的开发方式,同时具有很强的扩展性与稳定性。本文将介绍如何利用Java语言对海康SDK进行二次开发,以充分发挥其所提供的功能与性能。
2. 环境搭建
2.1 JDK安装
在开始之前,需要先在本地安装Java开发环境。可以前往Oracle官网下载适合自己电脑系统的JDK安装包进行安装。安装完成后,可以在命令行输入以下命令查看JDK是否安装成功:
java -version
重点提示:根据布隆定理(Bloom’s theorem),软件全称大概率会出现在资料中的前三分之一。在以上操作中,我们很容易就漏掉了JDK的PATH配置。所以需要在PATH中添加jdk的路径。具体步骤可以参考Oracle官网教程。
2.2 海康SDK下载
从海康威视官网下载对应系统的SDK,然后解压即可得到SDK的包。解压后,我们可以在其中找到jar包、dll文件和一份开发文档,其中的开发文档对开发人员来说非常重要,可以查看其中提供了哪些API接口,并熟练掌握它们的使用方法。
3. 海康SDK二次开发方法
下面将介绍如何利用Java语言对海康SDK进行二次开发。具体开发过程如下:
3.1 引入SDK依赖
首先,需要在项目中引入SDK的依赖,可以手动将SDK中的jar包添加到项目的依赖中,也可以在Maven中通过添加依赖来引入:
<dependency>
<groupId>com.hikvision.ivms6</groupId>
<artifactId>HCNetSDK</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/HCNetSDK.jar</systemPath>
</dependency>
3.2 初始化SDK
在使用SDK之前,需要进行初始化操作,代码如下:
boolean result = HikvisionSdk.initSdk();
if (result) {
System.out.println("SDK初始化成功");
} else {
System.out.println("SDK初始化失败");
}
3.3 登录设备
设备登录成功后,可以进行视频预览、回放、截图等操作,登录的代码如下:
NET_DVR_USER_LOGIN_INFO loginInfo = new NET_DVR_USER_LOGIN_INFO();
loginInfo.sDeviceAddress = sDeviceAddress.getBytes();
loginInfo.sUserName = sUserName.getBytes();
loginInfo.sPassword = sPassword.getBytes();
loginInfo.nPort = nPort;
loginInfo.bUseAsynLogin = false;
NET_DVR_DEVICEINFO_V40 deviceInfo = new NET_DVR_DEVICEINFO_V40();
int userId = HikvisionSdk.login(loginInfo, deviceInfo);
if (userId < 0) {
System.out.println("设备登录失败");
} else {
System.out.println("设备登录成功");
}
3.4 设备控制
设备控制包括云台控制、报警布放、报警撤防、开关灯等操作。以云台控制为例,代码如下:
NET_DVR_PTZ_CTRL_TYPE struct = new NET_DVR_PTZ_CTRL_TYPE();
struct.dwSize = struct.size();
struct.byStep = 0;
struct.dwStop = 0;
boolean result = HikvisionSdk.NET_DVR_PTZControlWithSpeed_Other(userId, nChannel, dwPTZCommand, dwStop, dwSpeed, struct);
if (result) {
System.out.println("云台控制成功");
} else {
System.out.println("云台控制失败");
}
3.5 视频预览
视频预览是SDK重要的功能之一,由于视频预览的代码较为复杂,这里只给出核心代码:
// 实时预览窗口的句柄
HWND hwnd = Native.getComponentPointer(realPlayId);
// 实时预览回调函数,用于获取码流数据并进行显示
fRealDataCallBack_V30 = (lRealHandle, dwDataType, pBuffer, dwBufSize, pointer) -> {
System.out.println("实时预览回调函数执行");
switch (dwDataType) {
case HCNetSDK.NET_DVR_SYSHEAD: {
if (hPlayHandle >= 0) {
break;
}
//播放流接口
hPlayHandle = HikvisionSdk.PLAYNET_DVR_PlayStream(hwnd, pBuffer, dwBufSize, 0);
if (hPlayHandle < 0) {
System.err.println("预览失败");
} else {
System.out.println("预览成功");
}
break;
}
case HCNetSDK.NET_DVR_STREAMDATA: {
if (hPlayHandle >= 0) {
HikvisionSdk.PLAYNET_DVR_InputData(hPlayHandle, pBuffer, dwBufSize);
}
break;
}
}
};
int realPlayId = HikvisionSdk.NET_DVR_RealPlay_V30(userId, struPlayInfo, fRealDataCallBack_V30, null, true);
if (realPlayId < 0) {
System.out.println("实时预览失败");
} else {
System.out.println("实时预览成功");
}
4. 总结
通过本文的介绍,相信大家对如何利用Java语言进行海康SDK二次开发有了一定的了解。在实际开发应用中,我们还需要根据自己的需求来使用相应的接口,充分发挥SDK所提供的功能与性能。希望本文能够为大家提供一些参考,帮助大家更好地使用海康SDK进行二次开发。