rev:修改截图功能

This commit is contained in:
2025-12-02 19:45:20 +08:00
parent 1ed2732cf5
commit 4728621828
2 changed files with 40 additions and 159 deletions

View File

@@ -23,17 +23,19 @@ public class HikvisionSnapshotUtil {
public static String channelHttp;//默认
public static Integer channel;//默认1
public static ThreadPoolExecutor threadPoolExecutor;
// HCNetSDK 接口映射
public interface HCNetSDK extends Library {
Hikvision截图Demo.HCNetSDK INSTANCE = Native.load(ins, Hikvision截图Demo.HCNetSDK.class);
HCNetSDK INSTANCE = Native.load(ins, HCNetSDK.class);
//初始化 SDK 库
boolean NET_DVR_Init();
//登录设备(传入设备 IP、端口、用户名、密码返回一个用户 ID后续调用都要用
int NET_DVR_Login_V30(String sDVRIP, short wDVRPort, String sUserName, String sPassword, Hikvision截图Demo.NET_DVR_DEVICEINFO_V30 lpDeviceInfo);
int NET_DVR_Login_V30(String sDVRIP, short wDVRPort, String sUserName, String sPassword, NET_DVR_DEVICEINFO_V30 lpDeviceInfo);
//抓拍一张 JPEG 图片保存到本地。
boolean NET_DVR_CaptureJPEGPicture(int lUserID, int lChannel, Hikvision截图Demo.NET_DVR_JPEGPARA lpJpegPara, String sPicFileName);
boolean NET_DVR_CaptureJPEGPicture(int lUserID, int lChannel, NET_DVR_JPEGPARA lpJpegPara, String sPicFileName);
//注销登录。
boolean NET_DVR_Logout(int lUserID);
@@ -74,82 +76,83 @@ public class HikvisionSnapshotUtil {
}
//HCNetSDK 抓图,图片路径允许指定,不指定则走配置
public static SdkResponse 截图( String imageName) {
String imagePath = "D://vehicle/"+DateUtil.thisYear();
if (StringUtils.isEmpty(imageName)){
public static SdkResponse 截图(String imageName) {
String imagePath = "D://vehicle/" + DateUtil.thisYear();
if (StringUtils.isEmpty(imageName)) {
return SdkResponse.requestFail("图片名称未知");
}
String sFileUrl = imagePath+"\\"+imageName;
if (!Hikvision截图Demo.HCNetSDK.INSTANCE.NET_DVR_Init()) {
String sFileUrl = imagePath + "\\" + imageName;
if (!HCNetSDK.INSTANCE.NET_DVR_Init()) {
return SdkResponse.requestFail("[SDK] 初始化失败");
}
Hikvision截图Demo.NET_DVR_DEVICEINFO_V30 deviceInfo = new Hikvision截图Demo.NET_DVR_DEVICEINFO_V30();
int userId = Hikvision截图Demo.HCNetSDK.INSTANCE.NET_DVR_Login_V30(ip, port, username, password, deviceInfo);
NET_DVR_DEVICEINFO_V30 deviceInfo = new NET_DVR_DEVICEINFO_V30();
int userId = HCNetSDK.INSTANCE.NET_DVR_Login_V30(ip, port, username, password, deviceInfo);
if (userId < 0) {
System.err.println("[SDK] 登录失败");
Hikvision截图Demo.HCNetSDK.INSTANCE.NET_DVR_Cleanup();
return SdkResponse.requestFail("[SDK] 登录失败");
HCNetSDK.INSTANCE.NET_DVR_Cleanup();
return SdkResponse.requestFail("[SDK] 登录失败");
}
Hikvision截图Demo.NET_DVR_JPEGPARA jpegPara = new Hikvision截图Demo.NET_DVR_JPEGPARA();
NET_DVR_JPEGPARA jpegPara = new NET_DVR_JPEGPARA();
// D1
jpegPara.wPicSize = 2;
// 一般质量
jpegPara.wPicQuality = 0;
//命名规则:任务号+载具号+时间.jpg
boolean result = Hikvision截图Demo.HCNetSDK.INSTANCE.NET_DVR_CaptureJPEGPicture(userId, channel, jpegPara, sFileUrl);
boolean result = HCNetSDK.INSTANCE.NET_DVR_CaptureJPEGPicture(userId, channel, jpegPara, sFileUrl);
if (!result) {
result = Hikvision截图Demo.HCNetSDK.INSTANCE.NET_DVR_CaptureJPEGPicture(userId, channel, jpegPara, sFileUrl);
result = HCNetSDK.INSTANCE.NET_DVR_CaptureJPEGPicture(userId, channel, jpegPara, sFileUrl);
if (result) {
System.out.println("[SDK] 抓图成功,保存为 snapshot_sdk.jpg");
} else {
System.err.println("[SDK] 抓图失败");
}
}
Hikvision截图Demo.HCNetSDK.INSTANCE.NET_DVR_Logout(userId);
Hikvision截图Demo.HCNetSDK.INSTANCE.NET_DVR_Cleanup();
return result?SdkResponse.requestOk():SdkResponse.requestFail("[SDK] 最终抓图失败");
HCNetSDK.INSTANCE.NET_DVR_Logout(userId);
HCNetSDK.INSTANCE.NET_DVR_Cleanup();
return result ? SdkResponse.requestOk() : SdkResponse.requestFail("[SDK] 最终抓图失败");
}
public static void sync截图(String imageName,String taskCode) {
if (threadPoolExecutor!=null){
if (StringUtils.isEmpty(imageName)){
public static void sync截图(String imageName, String taskCode) {
if (threadPoolExecutor != null) {
if (StringUtils.isEmpty(imageName)) {
log.warn("图片名称未定义");
}
String imagePath = HikvisionSnapshotUtil.path+DateUtil.thisYear();
String sFileUrl = imagePath+"\\"+imageName+"_"+taskCode;
String newFileUrl = imagePath+"\\"+imageName;
if (!Hikvision截图Demo.HCNetSDK.INSTANCE.NET_DVR_Init()) {
String imagePath = HikvisionSnapshotUtil.path + DateUtil.thisYear();
String sFileUrl = imagePath + "\\" + imageName + "_" + taskCode;
String newFileUrl = imagePath + "\\" + imageName;
if (!HCNetSDK.INSTANCE.NET_DVR_Init()) {
}
Hikvision截图Demo.NET_DVR_DEVICEINFO_V30 deviceInfo = new Hikvision截图Demo.NET_DVR_DEVICEINFO_V30();
int userId = Hikvision截图Demo.HCNetSDK.INSTANCE.NET_DVR_Login_V30(ip, port, username, password, deviceInfo);
NET_DVR_DEVICEINFO_V30 deviceInfo = new NET_DVR_DEVICEINFO_V30();
int userId = HCNetSDK.INSTANCE.NET_DVR_Login_V30(ip, port, username, password, deviceInfo);
if (userId < 0) {
log.warn("[SDK] 登录失败");
Hikvision截图Demo.HCNetSDK.INSTANCE.NET_DVR_Cleanup();
HCNetSDK.INSTANCE.NET_DVR_Cleanup();
}
Hikvision截图Demo.NET_DVR_JPEGPARA jpegPara = new Hikvision截图Demo.NET_DVR_JPEGPARA();
NET_DVR_JPEGPARA jpegPara = new NET_DVR_JPEGPARA();
// D1
jpegPara.wPicSize = 2;
// 一般质量
jpegPara.wPicQuality = 0;
//命名规则:任务号+载具号+时间.jpg
try {
boolean result = Hikvision截图Demo.HCNetSDK.INSTANCE.NET_DVR_CaptureJPEGPicture(userId, channel, jpegPara, sFileUrl);
boolean result = HCNetSDK.INSTANCE.NET_DVR_CaptureJPEGPicture(userId, channel, jpegPara, sFileUrl);
if (!result) {
result = Hikvision截图Demo.HCNetSDK.INSTANCE.NET_DVR_CaptureJPEGPicture(userId, channel, jpegPara, sFileUrl);
result = HCNetSDK.INSTANCE.NET_DVR_CaptureJPEGPicture(userId, channel, jpegPara, sFileUrl);
if (result) {
boolean result2 = Hikvision截图Demo.HCNetSDK.INSTANCE.NET_DVR_CaptureJPEGPicture(userId, channel, jpegPara, newFileUrl);
log.info("[SDK] 抓图成功"+imagePath+":"+imageName);
boolean result2 = HCNetSDK.INSTANCE.NET_DVR_CaptureJPEGPicture(userId, channel, jpegPara, newFileUrl);
log.info("[SDK] 抓图成功" + imagePath + ":" + imageName);
} else {
log.warn("[SDK] 抓图失败");
}
}
}finally {
Hikvision截图Demo.HCNetSDK.INSTANCE.NET_DVR_Logout(userId);
Hikvision截图Demo.HCNetSDK.INSTANCE.NET_DVR_Cleanup();
} finally {
HCNetSDK.INSTANCE.NET_DVR_Logout(userId);
HCNetSDK.INSTANCE.NET_DVR_Cleanup();
}
}else {
} else {
log.warn("线程池未定义");
}
}

View File

@@ -1,122 +0,0 @@
package org.nl.common.hikvision;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Structure;
/**
* @Description 海康摄像机抓图
* @Author Gengby
* @Date 2025/8/18
*/
public class Hikvision截图Demo {
// HCNetSDK 接口映射
public interface HCNetSDK extends Library {
HCNetSDK INSTANCE = Native.load("C:\\Users\\Administrator\\Desktop\\库文件\\HCNetSDK.dll", HCNetSDK.class);
//初始化 SDK 库
boolean NET_DVR_Init();
//登录设备(传入设备 IP、端口、用户名、密码返回一个用户 ID后续调用都要用
int NET_DVR_Login_V30(String sDVRIP, short wDVRPort, String sUserName, String sPassword, NET_DVR_DEVICEINFO_V30 lpDeviceInfo);
//抓拍一张 JPEG 图片保存到本地。
boolean NET_DVR_CaptureJPEGPicture(int lUserID, int lChannel, NET_DVR_JPEGPARA lpJpegPara, String sPicFileName);
//注销登录。
boolean NET_DVR_Logout(int lUserID);
////清理 SDK 库
boolean NET_DVR_Cleanup();
}
@Structure.FieldOrder({"sSerialNumber", "byAlarmInPortNum", "byAlarmOutPortNum", "byDiskNum",
"byDVRType", "byChanNum", "byStartChan", "byAudioChanNum", "byIPChanNum"})
public static class NET_DVR_DEVICEINFO_V30 extends Structure {
//序列号
public byte[] sSerialNumber = new byte[48];
//报警输入口个数
public byte byAlarmInPortNum;
//报警输出口个数
public byte byAlarmOutPortNum;
//硬盘个数
public byte byDiskNum;
//DVR 类型
public byte byDVRType;
//模拟通道数
public byte byChanNum;
//起始通道号
public byte byStartChan;
//音频通道数
public byte byAudioChanNum;
//IP 通道数
public byte byIPChanNum;
}
@Structure.FieldOrder({"wPicSize", "wPicQuality"})
public static class NET_DVR_JPEGPARA extends Structure {
// 0: QCIF, 1: CIF, 2: D1, 3: UXGA...
public short wPicSize;
// 0: 最差, 1: 较差, 2: 一般, 3: 较好, 4:最好
public short wPicQuality;
}
//HCNetSDK 抓图
public static boolean snapshotSdk(String ip, short port, String username, String password, int channel) {
if (!HCNetSDK.INSTANCE.NET_DVR_Init()) {
System.err.println("[SDK] 初始化失败");
return false;
}
NET_DVR_DEVICEINFO_V30 deviceInfo = new NET_DVR_DEVICEINFO_V30();
int userId = HCNetSDK.INSTANCE.NET_DVR_Login_V30(ip, port, username, password, deviceInfo);
if (userId < 0) {
System.err.println("[SDK] 登录失败");
HCNetSDK.INSTANCE.NET_DVR_Cleanup();
return false;
}
NET_DVR_JPEGPARA jpegPara = new NET_DVR_JPEGPARA();
// D1
jpegPara.wPicSize = 2;
// 一般质量
jpegPara.wPicQuality = 0;
//命名规则:任务号+载具号+时间.jpg
boolean result = HCNetSDK.INSTANCE.NET_DVR_CaptureJPEGPicture(userId, channel, jpegPara, "E:\\lms\\2025\\snapshot_sdk2.jpg");
if (result) {
System.out.println("[SDK] 抓图成功,保存为 snapshot_sdk.jpg");
} else {
System.err.println("[SDK] 抓图失败");
}
boolean result2 = HCNetSDK.INSTANCE.NET_DVR_CaptureJPEGPicture(userId, channel, jpegPara, "E:\\lms\\snapshot_sdk3.jpg");
if (result2) {
System.out.println("[SDK] 抓图成功,保存为 snapshot_sdk.jpg");
} else {
System.err.println("[SDK] 抓图失败");
}
HCNetSDK.INSTANCE.NET_DVR_Logout(userId);
HCNetSDK.INSTANCE.NET_DVR_Cleanup();
return result;
}
public static void main(String[] args) {
// IP
String ip = "169.254.43.101";
// 端口号
int port = 8000;
// 账号
String username = "admin";
// 密码
String password = "nl1314520";
// HTTP 通道号
String channelHttp = "101";
// SDK 通道号(一般是 1
int channelSdk = 1;
Hikvision截图Demo.snapshotSdk(ip, (short) port, username, password, channelSdk);
SdkResponse response = HikvisionSnapshotUtil.截图("照片名字");
if (!response.getSuc()){
System.out.println(response.getMessage());
}
}
}