一、概述
海康SDK是一款应用广泛的视频监控软件开发包,对于需要进行视频监控相关开发的开发者来说,海康SDK是一个非常好的选择。但是,在实际使用中,如果需要实现高度可定制化的解决方案,就需要对海康SDK进行二次开发。
二、海康SDK二次开发的基本步骤
1. 下载海康SDK
在进行海康SDK二次开发之前,首先需要从官网上下载SDK,这里我们选择官网上提供的海康SDK V6.0版本,下载地址为:
https://www.hikvision.com/cn/download_more_403.html
2. 安装海康SDK
下载完成后,需要将SDK安装到本地,安装过程中需要根据提示一步一步进行。
3. 导入SDK
完成安装后,需要在项目中导入SDK,导入SDK需要进行以下步骤:
3.1 创建Java工程
在Eclipse中创建一个Java工程,工程名为Demo。
3.2 将SDK拷贝到工程中
将SDK安装目录中的java文件夹拷贝到Demo工程的src目录下。
3.3 添加SDK到编译路径
在Eclipse中,右键单击Demo工程,选择Build Path -> Configure Build Path。
3.4 添加SDK到库中
在Configure Build Path窗口中,选择Libraries,单击Add External JARs,在弹出的文件选择对话框中选择SDK中的jar包,如:HCNetSDK.jar。
以上步骤完成后,就可以在Java项目中使用海康SDK了。
三、实现高度可定制化的解决方案
1. 设计方案
在进行高度可定制化的解决方案设计时,需要根据实际需求和业务流程进行设计。在海康SDK的应用场景中,一般需求是需要展示监控画面,并进行相关控制,比如云台控制、截图等,同时还需要将监控画面录制下来,保存到本地。
1.1 设计思路
根据上述需求,可以将整个解决方案分为两个部分,即监控画面展示与控制、监控画面录制。在每个部分中,还需要选择一些关键技术进行应用。
1.2 技术选型
监控画面展示与控制中,可使用Java Swing技术进行实现,并结合海康SDK中的相关API实现云台控制等功能;监控画面录制中,可以使用FFmpeg等第三方框架进行实现。
2. 实现过程
具体实现过程如下:
2.1 展示监控画面及控制
使用Java Swing技术进行实现,需要将海康SDK中的相关API进行封装。
public class VideoPanel extends JPanel {
private static final long serialVersionUID = 1L;
HCNetSDK hCNetSDK;
public HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo;// 设备信息
public NativeLong lUserID;// 用户句柄
public NativeLong lPreviewHandle;// 预览句柄
/**
* 监控控件初始化
*/
public void init() {
// 初始化海康SDK
hCNetSDK = HCNetSDK.INSTANCE;
hCNetSDK.NET_DVR_Init();
// 登录设备
lUserID = loginDevice("192.168.1.64", "admin", "admin");
if (lUserID.longValue() < 0) {
JOptionPane.showMessageDialog(this, "登陆失败");
}
// 开始预览
lPreviewHandle = startPreview();
if (lPreviewHandle.longValue() < 0) {
JOptionPane.showMessageDialog(this, "预览失败");
}
}
/**
* 登录设备
*
* @param sDeviceIP 设备IP
* @param sUserName 用户名
* @param sPassword 密码
* @return 用户ID
*/
public NativeLong loginDevice(String sDeviceIP, String sUserName, String sPassword) {
m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
NativeLong lUserID = hCNetSDK.NET_DVR_Login_V30(sDeviceIP, (short) 8000, sUserName, sPassword, m_strDeviceInfo);
return lUserID;
}
/**
* 开始预览
*
* @return 预览句柄
*/
public NativeLong startPreview() {
HCNetSDK.NET_DVR_PREVIEWINFO strPreviewInfo = new HCNetSDK.NET_DVR_PREVIEWINFO();
strPreviewInfo.lChannel = new NativeLong(1);// 预览通道号
strPreviewInfo.dwStreamType = 0; // 码流类型:0-主码流,1-子码流,2-流ID,3-流ID扩展,由设备返回的实际码流类型可能会与设备配置有出入
strPreviewInfo.dwLinkMode = 0; // 连接方式:0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4- RTP/RTSP,5- RTP/HTTP
NativeLong lPreviewHandle = hCNetSDK.NET_DVR_RealPlay_V40(lUserID, strPreviewInfo, null);
return lPreviewHandle;
}
/**
* 停止预览
*/
public void stopPreview() {
// 停止预览
if (lPreviewHandle.longValue() >= 0) {
hCNetSDK.NET_DVR_StopRealPlay(lPreviewHandle);
}
// 注销用户
if (lUserID.longValue() >= 0) {
hCNetSDK.NET_DVR_Logout(lUserID);
}
// 释放海康SDK资源
hCNetSDK.NET_DVR_Cleanup();
}
}
2.2 监控画面录制
2.2.1 添加FFmpeg库
首先,在Java项目中添加FFmpeg库文件。可将FFmpeg库文件拷贝到项目的libs目录下,然后将库文件添加到编译路径中。
2.2.2 实现录制
在Java中,使用java.lang.Process执行控制台命令,从而实现视频录制的功能。FFmpeg提供了非常丰富的命令行选项,这里只是简单地演示如何使用FFmpeg进行录制。
public class Record implements Runnable {
private String filePath;
private boolean flag = true;
public Record(String filePath) {
super();
this.filePath = filePath;
}
public void stopRecord() {
flag = false;
}
public void run() {
try {
// cmd命令
String cmd = "ffmpeg -f dshow -i video=\"USB2.0 Camera\" -r 15 -b 800000 -s 640x480 -acodec copy -vcodec copy " + filePath;
Process process = Runtime.getRuntime().exec(cmd);
InputStream error = process.getErrorStream();
InputStream input = process.getInputStream();
byte[] b = new byte[1024];
while (flag) {
int i = error.read(b, 0, b.length);
if (i != -1) {
System.out.println(new String(b, 0, i, "GBK"));
}
int j = input.read(b, 0, b.length);
if (j != -1) {
System.out.println(new String(b, 0, j, "GBK"));
}
}
input.close();
error.close();
process.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}
}
四、总结
通过上述的实现过程,我们成功地实现了高度可定制化的海康SDK解决方案。但是,在实际应用中,还需要进行更多的工业级优化和细节处理,以适应不同的应用场景和需要。