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()); } } }