admin
2024-03-25 6729c925673fcf41cf12f6f1b59d1489a6031731
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
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());
        }
    }
}