package com.ruoyi.HIKVISION;
|
|
import com.ruoyi.HIKVISION.NetSDK.HCNetSDK;
|
import com.ruoyi.aibrain.domain.AiCamera;
|
import com.ruoyi.common.config.RuoYiConfig;
|
import com.ruoyi.common.constant.Constants;
|
import com.ruoyi.common.utils.StringUtils;
|
import com.sun.jna.Memory;
|
import com.sun.jna.NativeLong;
|
import com.sun.jna.ptr.IntByReference;
|
|
import java.io.*;
|
import java.nio.ByteBuffer;
|
import java.nio.charset.StandardCharsets;
|
|
//import com.ruoyi.project.capture.HCNetSDK;
|
|
public class GetPicFromIPV {
|
private HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
|
|
Integer lUserID = -1;
|
|
public static void main(String[] args) {
|
final GetPicFromIPV getPicFromIPV = new GetPicFromIPV();
|
AiCamera device = new AiCamera();
|
device.setCameraIp("192.168.1.67");
|
device.setCameraPort("8000");
|
device.setCameraUser("admin");
|
device.setCameraPassword("a1234567");
|
device.setPicture("/profile/upload/2023/06/28/微信图片_20211124142412_20230628101845A001.png");
|
getPicFromIPV.getDVRPic(device, false);
|
|
}
|
|
/**
|
* 抓拍图片
|
*
|
* @param cate 是否走内存
|
* @param dvr 用户信息
|
*/
|
public String getDVRPic(AiCamera dvr, boolean cate) {
|
|
String msg = "200";
|
if (!hCNetSDK.NET_DVR_Init()) {
|
System.out.println("hksdk(抓图)-海康sdk初始化失败!");
|
return "hksdk(抓图)-海康sdk初始化失败!";
|
}
|
// 设备信息
|
HCNetSDK.NET_DVR_DEVICEINFO_V30 devinfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
|
HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();//设备登录信息
|
HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();//设备信息
|
//注册设备
|
String m_sDeviceIP = dvr.getCameraIp();
|
String m_sUsername = dvr.getCameraUser();
|
String m_sPassword = dvr.getCameraPassword();
|
m_strLoginInfo.wPort = (short) Integer.parseInt("8000");
|
|
//注册
|
m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
|
System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length());
|
m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
|
System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length());
|
m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];
|
System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length());
|
m_strLoginInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是
|
m_strLoginInfo.write();
|
lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
|
// 返回一个用户编号,同时将设备信息写入devinfo
|
if (lUserID.intValue() < 0) {
|
System.out.println("hksdk(抓图)-设备注册失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
|
return "hksdk(抓图)-设备注册失败,错误码:" + hCNetSDK.NET_DVR_GetLastError();
|
}
|
HCNetSDK.NET_DVR_WORKSTATE_V30 devwork = new HCNetSDK.NET_DVR_WORKSTATE_V30();
|
if (!hCNetSDK.NET_DVR_GetDVRWorkState_V30(lUserID, devwork)) {
|
// 返回Boolean值,判断是否获取设备能力
|
System.out.println("hksdk(抓图)-返回设备状态失败" + hCNetSDK.NET_DVR_GetLastError());
|
msg = "hksdk(抓图)-返回设备状态失败" + hCNetSDK.NET_DVR_GetLastError();
|
}
|
// 本地资源路径
|
String localPath = RuoYiConfig.getProfile();
|
// 数据库资源地址
|
String path = localPath + StringUtils.substringAfter(dvr.getPicture(), Constants.RESOURCE_PREFIX);
|
// String path = "";
|
// path = imgPath + "-" + channelNo + ".jpeg";
|
// NativeLong chanLong = new NativeLong(channelNo);
|
//内存
|
if (cate) {
|
picCutCate(new NativeLong(lUserID.intValue()), 1, path);
|
} else {
|
//非内存直接保存
|
//图片质量
|
HCNetSDK.NET_DVR_JPEGPARA jpeg = new HCNetSDK.NET_DVR_JPEGPARA();
|
//设置图片分辨率
|
jpeg.wPicSize = 0;
|
//设置图片质量
|
jpeg.wPicQuality = 0;
|
//需要加入通道
|
System.out.println("-----------这里开始封装 NET_DVR_CaptureJPEGPicture---------");
|
boolean is = hCNetSDK.NET_DVR_CaptureJPEGPicture(lUserID, 1, jpeg, path.getBytes(StandardCharsets.UTF_8));
|
System.out.println("-----------抓图工具返回结果----------" + is);
|
if (!is) {
|
System.out.println("hksdk(抓图)-抓取失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
|
msg = "hksdk(抓图)-抓取失败,错误码:" + hCNetSDK.NET_DVR_GetLastError();
|
}
|
}
|
|
System.out.println("-----------处理完成截图数据----------");
|
//退出登录
|
hCNetSDK.NET_DVR_Logout(lUserID);
|
//释放SDK资源
|
hCNetSDK.NET_DVR_Cleanup();
|
return msg;
|
}
|
|
|
private void picCutCate(NativeLong lUserID, int chanLong, String imgPath) {
|
//图片质量
|
HCNetSDK.NET_DVR_JPEGPARA jpeg = new HCNetSDK.NET_DVR_JPEGPARA();
|
//设置图片分辨率
|
jpeg.wPicSize = 0;
|
//设置图片质量
|
jpeg.wPicQuality = 0;
|
IntByReference a = new IntByReference();
|
//设置图片大小
|
ByteBuffer jpegBuffer = ByteBuffer.allocate(1920 * 1080);
|
byte[] jpegBytes = new byte[1920 * 1080];
|
File file = new File(imgPath);
|
// 抓图到内存,单帧数据捕获并保存成JPEG存放在指定的内存空间中
|
System.out.println("-----------这里开始封装 NET_DVR_CaptureJPEGPicture_NEW---------");
|
// boolean is = hCNetSDK.NET_DVR_CaptureJPEGPicture_NEW(lUserID.intValue(), chanLong, jpeg, jpegBytes, jpegBytes.length, a);
|
boolean is = hCNetSDK.NET_DVR_CaptureJPEGPicture_NEW(lUserID.intValue(), chanLong, jpeg, new Memory(1920*1080), jpegBytes.length, a);
|
// boolean is = hCNetSDK.NET_DVR_CaptureJPEGPicture_NEW(lUserID.intValue(), new NativeLong(chanLong), jpeg, jpegBuffer, 1024*1024, a);
|
System.out.println("-----------这里开始图片存入内存----------" + is);
|
if (is) {
|
/**
|
* 该方式使用内存获取 但是读取有问题无法预览
|
* linux下 可能有问题
|
* */
|
System.out.println("hksdk(抓图)-结果状态值(0表示成功):" + hCNetSDK.NET_DVR_GetLastError());
|
//存储到本地
|
BufferedOutputStream outputStream = null;
|
try {
|
outputStream = new BufferedOutputStream(new FileOutputStream(file));
|
System.out.println(a.getValue());
|
outputStream.write(jpegBytes, 0, a.getValue());
|
//outputStream.write(jpegBytes);
|
outputStream.flush();
|
} catch (FileNotFoundException e) {
|
e.printStackTrace();
|
} catch (IOException e) {
|
e.printStackTrace();
|
} finally {
|
if (outputStream != null) {
|
try {
|
outputStream.close();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
} else {
|
System.out.println("hksdk(抓图)-抓取失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
|
}
|
}
|
}
|