如何快速掌握Java海康SDK二次开发的技术要点

1. Java海康SDK二次开发简介

海康威视是我国领先的监控设备生产商,Java海康SDK可以提供快速开发监控相关软件和系统的工具包。但是默认提供的SDK只是满足部分需求,如果需要更加定制化的开发,则需要进行二次开发。

Java海康SDK二次开发的技术要点主要包括:

取流、播放控制

报警信息订阅、处理

设备操作

数据处理

2. 取流、播放控制

2.1 海康威视视频流传输协议

海康威视设备默认使用私有协议进行视频流传输,可以通过SDK提供的接口进行取流操作。取流操作需要传入设备的IP地址、用户名和密码,还需要传入通道号和码流类型。成功获取到取流设备后,可以使用SDK提供的接口进行播放。

其中,码流类型包括主码流、子码流和第三码流,需要根据实际需求选择对应的码流类型。

2.2 播放控制

SDK提供了各种方法来控制视频的播放,例如暂停、快进、慢放等等。其中最基本的方法是播放和停止。

以下代码演示了如何播放一个设备的视频流:

import com.sun.jna.NativeLong;

import com.sun.jna.Pointer;

import com.sun.jna.ptr.IntByReference;

import com.sun.jna.ptr.NativeLongByReference;

import com.sun.jna.ptr.PointerByReference;

import com.sun.jna.win32.StdCallLibrary;

public interface HCNetSDK extends StdCallLibrary {

// ... 这里省略了其他代码

// 登录设备

Integer NET_DVR_Login_V30(String sDVRIP, short wDVRPort, String sUserName, String sPassword, NET_DVR_DEVICEINFO_V30 lpDeviceInfo);

// 获取错误信息

Integer NET_DVR_GetLastError();

// 开始预览

NativeLong NET_DVR_RealPlay_V30(NativeLong lUserID, NET_DVR_CLIENTINFO lpClientInfo, HCNetSDK.FRealDataCallBack_V30 fRealDataCallBack_V30, Pointer pUser, boolean bBlocked);

// 停止预览

boolean NET_DVR_StopRealPlay(NativeLong lRealHandle);

}

// ... 这里省略了其他代码

// 登录设备

NET_DVR_DEVICEINFO_V30 deviceInfo = new NET_DVR_DEVICEINFO_V30();

NativeLong userId = hcNetSDK.NET_DVR_Login_V30(ip, port, username, password, deviceInfo);

if (userId.intValue() == -1) {

// 登录失败,处理错误信息

int errorCode = hcNetSDK.NET_DVR_GetLastError();

throw new RuntimeException("登录设备失败,错误码:" + errorCode);

}

// 开始预览

NativeLong lRealHandle = hcNetSDK.NET_DVR_RealPlay_V30(userId, clientInfo, null, null, true);

if (lRealHandle.intValue() == -1) {

// 预览失败,处理错误信息

int errorCode = hcNetSDK.NET_DVR_GetLastError();

throw new RuntimeException("开始预览失败,错误码:" + errorCode);

}

// ... 这里省略了其他代码

// 停止预览

hcNetSDK.NET_DVR_StopRealPlay(lRealHandle);

3. 报警信息订阅、处理

3.1 报警信息订阅

使用SDK提供的接口可以订阅海康威视设备的报警信息。报警信息包括设备的各种状态,例如网络状态、硬盘状态、通道状态等等。

订阅报警信息需要传入一个回调函数,当设备发生报警时,SDK会回调该函数并传入相关信息。

3.2 报警信息处理

处理报警信息的方式可以有多种,例如在界面上显示报警信息、发送邮件或短信通知等等。另外,还可以通过执行某些操作来响应报警信息,例如关闭设备、启动录像等等。

以下代码演示了如何订阅报警信息:

import com.sun.jna.NativeLong;

import com.sun.jna.ptr.ByteByReference;

import com.sun.jna.ptr.IntByReference;

import com.sun.jna.win32.StdCallLibrary;

public interface HCNetSDK extends StdCallLibrary {

// ... 这里省略了其他代码

// 开始监听报警信息

NativeLong NET_DVR_StartListen_V30(String sLocalIP, short wLocalPort, FMSGCallBack_V31 fMessageCallBack_V31, Pointer pUser, int dwWaitTime);

// 停止监听报警信息

boolean NET_DVR_StopListen_V30(NativeLong lListenHandle);

// 设置报警回调函数

boolean NET_DVR_SetDVRMessageCallBack_V31(FMSGCallBack_V31 fMessageCallBack_V31, Pointer pUser);

}

// ... 这里省略了其他代码

// 设置报警回调函数

hcNetSDK.NET_DVR_SetDVRMessageCallBack_V31(new FMSGCallBack_V31() {

@Override

public boolean invoke(NativeLong lCommand, NET_DVR_ALARMER pAlarmer, ByteByReference pAlarmInfo, int dwBufLen, Pointer pUser) {

if (lCommand.longValue() == HCNetSDK.COMM_ALARM_V40) {

NET_DVR_ALARMINFO_V40 alarmInfo = new NET_DVR_ALARMINFO_V40();

alarmInfo.read();

ToolKits.GetPointerData(pAlarmInfo.getPointer(), alarmInfo.getPointer(), alarmInfo.size());

// 处理报警信息

// ...

}

return true;

}

}, null);

// 开始监听报警信息

NativeLong lListenHandle = hcNetSDK.NET_DVR_StartListen_V30(localIp, (short) listenPort, null, null, 3000);

if (lListenHandle.intValue() == -1) {

// 监听失败,处理错误信息

int errorCode = hcNetSDK.NET_DVR_GetLastError();

throw new RuntimeException("开始监听报警信息失败,错误码:" + errorCode);

}

// ... 这里省略了其他代码

// 停止监听报警信息

hcNetSDK.NET_DVR_StopListen_V30(lListenHandle);

4. 设备操作

4.1 设备登录

登录设备是进行其他操作的前置条件,需要传入设备的IP地址、用户名和密码。登录成功后,会返回一个用户ID,需要保存该ID以进行后续的操作。

以下代码演示了如何登录海康威视设备:

import com.sun.jna.NativeLong;

import com.sun.jna.Pointer;

import com.sun.jna.Structure;

import com.sun.jna.ptr.ByteByReference;

import com.sun.jna.ptr.IntByReference;

import com.sun.jna.ptr.NativeLongByReference;

import com.sun.jna.ptr.PointerByReference;

import com.sun.jna.win32.StdCallLibrary;

public interface HCNetSDK extends StdCallLibrary {

// ... 这里省略了其他代码

// 登录设备

Integer NET_DVR_Login_V30(String sDVRIP, short wDVRPort, String sUserName, String sPassword, NET_DVR_DEVICEINFO_V30 lpDeviceInfo);

// 获取错误信息

Integer NET_DVR_GetLastError();

}

// ... 这里省略了其他代码

// 登录设备

NET_DVR_DEVICEINFO_V30 deviceInfo = new NET_DVR_DEVICEINFO_V30();

NativeLong userId = hcNetSDK.NET_DVR_Login_V30(ip, port, username, password, deviceInfo);

if (userId.intValue() == -1) {

// 登录失败,处理错误信息

int errorCode = hcNetSDK.NET_DVR_GetLastError();

throw new RuntimeException("登录设备失败,错误码:" + errorCode);

}

// ... 这里省略了其他代码

4.2 设备配置

可以使用SDK提供的接口对海康威视设备进行各种配置,例如网络配置、用户管理、通道配置等等。

以下代码演示了如何获取设备信息和修改设备IP地址:

import com.sun.jna.NativeLong;

import com.sun.jna.Structure;

import com.sun.jna.ptr.ByteByReference;

import com.sun.jna.ptr.NativeLongByReference;

import com.sun.jna.ptr.PointerByReference;

import com.sun.jna.win32.StdCallLibrary;

public interface HCNetSDK extends StdCallLibrary {

// ... 这里省略了其他代码

// 获取设备信息

boolean NET_DVR_GetDVRConfig(NativeLong lUserID, int dwCommand, NativeLong lChannel, Pointer lpOutBuffer, int dwOutBufferSize,

NativeLongByReference lpBytesReturned);

// 修改IP地址

boolean NET_DVR_SetDVRConfig(NativeLong lUserID, int dwCommand, NativeLong lChannel, Pointer lpInBuffer, int dwInBufferSize);

}

// ... 这里省略了其他代码

// 获取设备信息

NET_DVR_DEVICECFG_V40 deviceCfgV40 = new NET_DVR_DEVICECFG_V40();

PointerByReference bufferPointer = new PointerByReference(deviceCfgV40.getPointer());

NativeLongByReference bytesReturned = new NativeLongByReference();

bufferPointer.setPointer(deviceCfgV40.getPointer());

if (!hcNetSDK.NET_DVR_GetDVRConfig(userId, HCNetSDK.NET_DVR_GET_DEVICECFG_V40, new NativeLong(0), deviceCfgV40.getPointer(),

deviceCfgV40.size(), bytesReturned)) {

// 获取设备信息失败,处理错误信息

int errorCode = hcNetSDK.NET_DVR_GetLastError();

throw new RuntimeException("获取设备信息失败,错误码:" + errorCode);

}

deviceCfgV40.read();

// 修改IP地址

NET_DVR_NETCFG_V30 netCfgV30 = new NET_DVR_NETCFG_V30();

// 设置新的IP地址

netCfgV30.struEtherNet[0].struDVRIP.sIpV4 = "192.168.0.2";

boolean setResult = hcNetSDK.NET_DVR_SetDVRConfig(userId, HCNetSDK.NET_DVR_SET_NETCFG_V30, new NativeLong(0), netCfgV30.getPointer(),

netCfgV30.size());

// ... 这里省略了其他代码

5. 数据处理

5.1 数据转换

海康威视设备默认使用私有协议进行视频流传输,需要进行数据转换才能将其显示在常见的视频播放器上。

SDK提供了各种方法来进行数据转换,例如将YUV数据转换成RGB数据、将PCM音频数据转换成MP3音频数据等等。

5.2 数据存储

常规的数据存储方式可以使用文件系统或数据库,也可以使用云存储服务等。

以下代码演示了如何将视频流数据保存到本地文件中:

import com.sun.jna.NativeLong;

import com.sun.jna.Pointer;

import com.sun.jna.Structure;

import com.sun.jna.ptr.ByteByReference;

import com.sun.jna.ptr.NativeLongByReference;

import com.sun.jna.ptr.PointerByReference;

import com.sun.jna.win32.StdCallLibrary;

public interface HCNetSDK extends StdCallLibrary {

// ... 这里省略了其他代码

// 设置回调函数

boolean NET_DVR_SetStandardDataCallBack(NativeLong lRealHandle, FStdDataCallBack fStdDataCallBack, Pointer pUser);

}

// ... 这里省略了其他代码

// 开始预览

NativeLong lRealHandle = hcNetSDK.NET_DVR_RealPlay_V30(userId, clientInfo, null, null, true);

// 设置回调函数,获取视频流数据并保存到文件中

hcNetSDK.NET_DVR_SetStandardDataCallBack(lRealHandle, new FStdDataCallBack() {

@Override

public void invoke(NativeLong lRealHandle, int dwDataType, ByteByReference pBuffer, int dwBufSize, Pointer pUser) {

// 帧头

byte[] frameHeader = new byte[4];

// 初始化帧头

frameHeader[0] = 0x00;

frameHeader[1] = 0x00;

frameHeader[2] = 0x00;

frameHeader[3] = 0x01;

// 将帧头写入文件

fileOutputStream.write(frameHeader);

// 将视频数据写入文件

byte[] frameData = pBuffer.getPointer().getByteArray(0, dwBufSize);

fileOutputStream.write(frameData);

}

}, null);

6. 总结

Java海康SDK二次开发需要熟悉海康威视设备管理和视频传输协议,并掌握各种配置和操作接口。一旦熟练掌握了这些技术要点,就可以根据实际需求进行快速开发。

本文主要介绍了海康SDK中的取流、播放控制、报警信息订阅、处理、设备操作和数据处理等方面的内容,希望能够对Java海康SDK的二次开发有所帮助。

后端开发标签