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的二次开发有所帮助。