Java调用海康威视接口并抓取Jpeg图片到内存

Java调用海康威视接口并抓取Jpeg图片到内存

1. pom依赖:
<dependency>
    <groupId>com.hikvision.ga</groupId>
    <artifactId>artemis-http-client</artifactId>
    <version>1.1.3</version>
</dependency>
2. 工具类
(1)工具类1: HCNetSDK
import com.stian.util.ClientDemoUtil;
import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;

import com.sun.jna.examples.win32.W32API;
import com.sun.jna.ptr.ByteByReference;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.win32.StdCallLibrary;

import java.nio.ByteBuffer;

/**
 * @author Administrator
 */
public interface HCNetSDK extends StdCallLibrary {

   HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(ClientDemoUtil.DLL_PATH+"HCNetSDK.dll", HCNetSDK.class);

    //序列号长度
    public static final int SERIALNO_LEN = 48;
    //用户名长度
    public static final int NAME_LEN = 32;
    //密码长度
    public static final int PASSWD_LEN = 16;
    //9000设备最大硬盘数/* 最多33个硬盘(包括16个内置SATA硬盘、1个eSATA硬盘和16个NFS盘) */
    public static final int MAX_DISKNUM_V30 = 33;
    //9000语音对讲通道数
    public static final int MAX_AUDIO_V30 = 2;
    //8000设备单通道最大视频流连接数
    public static final int MAX_LINK = 6;

    //9000 IPC接入  最大32个模拟通道
    public static final int MAX_ANALOG_CHANNUM = 32;
    //最大32路模拟报警输出
    public static final int MAX_ANALOG_ALARMOUT = 32;
    //最大32路模拟报警输入
    public static final int MAX_ANALOG_ALARMIN = 32;
    //允许接入的最大IP设备数
    public static final int MAX_IP_DEVICE = 32;
    //允许加入的最多IP通道数
    public static final int MAX_IP_CHANNEL = 32;
    //允许加入的最多报警输入数
    public static final int MAX_IP_ALARMIN = 128;
    //允许加入的最多报警输出数
    public static final int MAX_IP_ALARMOUT = 64;
    /* 最大支持的通道数 最大模拟加上最大IP支持 */
    public static final int MAX_CHANNUM_V30 = (MAX_ANALOG_CHANNUM + MAX_IP_CHANNEL);//64
    public static final int MAX_ALARMOUT_V30 = (MAX_ANALOG_ALARMOUT + MAX_IP_ALARMOUT);//96
    public static final int MAX_ALARMIN_V30 = (MAX_ANALOG_ALARMIN + MAX_IP_ALARMIN);//160

    //IP接入配置参数 (NET_DVR_IPPARACFG结构) 获取IP接入配置信息
    public static final int NET_DVR_GET_IPPARACFG = 1048;
    //设置IP接入配置信息
    public static final int NET_DVR_SET_IPPARACFG = 1049;

    /********************预览回调函数*********************/
    //系统头数据
    public static final int NET_DVR_SYSHEAD = 1;
    //视频流数据(包括复合流和音视频分开的视频流数据)
    public static final int NET_DVR_STREAMDATA = 2;
    //音频流数据
    public static final int NET_DVR_AUDIOSTREAMDATA = 3;
    //标准视频流数据
    public static final int NET_DVR_STD_VIDEODATA = 4;
    //标准音频流数据
    public static final int NET_DVR_STD_AUDIODATA = 5;

    //NET_DVR_Login_V30()参数结构
    class NET_DVR_DEVICEINFO_V30 extends Structure{
        //序列号
        public  byte[] sSerialNumber = new byte[SERIALNO_LEN];
        //报警输入个数
        public  byte byAlarmInPortNum;
        //报警输出个数
        public  byte byAlarmOutPortNum;
        //硬盘个数
        public  byte byDiskNum;
        //设备类型, 1:DVR 2:ATM DVR 3:DVS ......
        public  byte byDVRType;
        //模拟通道个数
        public  byte byChanNum;
        //起始通道号,例如DVS-1,DVR - 1
        public  byte byStartChan;
        //语音通道数
        public  byte byAudioChanNum;
        //最大数字通道个数
        public  byte byIPChanNum;
        //保留
        public  byte[] byRes1 = new byte[24];
    }

    boolean  NET_DVR_Logout_V30(NativeLong lUserID);

    class NET_DVR_IPPARACFG extends Structure {/* IP接入配置结构 */
        public  int dwSize;			                            /* 结构大小 */
        public  NET_DVR_IPDEVINFO[]  struIPDevInfo = new NET_DVR_IPDEVINFO[MAX_IP_DEVICE];    /* IP设备 */
        public   byte[] byAnalogChanEnable = new byte[MAX_ANALOG_CHANNUM];        /* 模拟通道是否启用,从低到高表示1-32通道,0表示无效 1有效 */
        public NET_DVR_IPCHANINFO[] struIPChanInfo = new NET_DVR_IPCHANINFO[MAX_IP_CHANNEL];	/* IP通道 */
    }

    //IPC接入参数配置
    class NET_DVR_IPDEVINFO extends Structure {/* IP设备结构 */
        public   int dwEnable;				    /* 该IP设备是否启用 */
        public   byte[] sUserName = new byte[NAME_LEN];		/* 用户名 */
        public   byte[] sPassword = new byte[PASSWD_LEN];	    /* 密码 */
        public   NET_DVR_IPADDR struIP = new NET_DVR_IPADDR();			/* IP地址 */
        public   short wDVRPort;			 	    /* 端口号 */
        public   byte[] byres = new byte[34];				/* 保留 */
    }

    class NET_DVR_IPCHANINFO extends Structure {/* IP通道匹配参数 */
        public   byte byEnable;					/* 该通道是否启用 */
        public  byte byIPID;					/* IP设备ID 取值1- MAX_IP_DEVICE */
        public  byte byChannel;					/* 通道号 */
        public   byte[] byres = new byte[33];					/* 保留 */
    }

    class NET_DVR_IPADDR extends Structure {
        public byte[] sIpV4 = new byte[16];
        public byte[] byRes = new byte[128];

        public String toString() {
            return "NET_DVR_IPADDR.sIpV4: " + new String(sIpV4) + "\n" + "NET_DVR_IPADDR.byRes: " + new String(byRes) + "\n";
        }
    }

    //初始化SDK,调用其他SDK函数的前提。
    boolean NET_DVR_Init();

    //设置连接时间与重连时间
    boolean  NET_DVR_SetConnectTime(int dwWaitTime, int dwTryTimes );
    boolean  NET_DVR_SetReconnect(int dwInterval, boolean bEnableRecon );

    int  NET_DVR_GetLastError();

    NativeLong  NET_DVR_Login_V30(String sDVRIP, short wDVRPort, String sUserName, String sPassword, NET_DVR_DEVICEINFO_V30 lpDeviceInfo);


    class NET_DVR_WORKSTATE_V30 extends Structure {//DVR工作状态(9000扩展)
        public int dwDeviceStatic; 	//设备的状态,0-正常,1-CPU占用率太高,超过85%,2-硬件错误,例如串口死掉
        public NET_DVR_DISKSTATE[]  struHardDiskStatic = new NET_DVR_DISKSTATE[MAX_DISKNUM_V30];
        public NET_DVR_CHANNELSTATE_V30[] struChanStatic = new NET_DVR_CHANNELSTATE_V30[MAX_CHANNUM_V30];//通道的状态
        public byte[]  byAlarmInStatic = new byte[MAX_ALARMIN_V30]; //报警端口的状态,0-没有报警,1-有报警
        public byte[]  byAlarmOutStatic = new byte[MAX_ALARMOUT_V30]; //报警输出端口的状态,0-没有输出,1-有报警输出
        public int  dwLocalDisplay;//本地显示状态,0-正常,1-不正常
        public  byte [] byAudioChanStatus = new byte[MAX_AUDIO_V30];//表示语音通道的状态 0-未使用,1-使用中, 0xff无效
        public  byte[]  byRes = new byte[10];
    }

    class NET_DVR_DISKSTATE extends Structure {//硬盘状态
        public int dwVolume;//硬盘的容量
        public int dwFreeSpace;//硬盘的剩余空间
        public int dwHardDiskStatic; //硬盘的状态,按位:1-休眠,2-不正常,3-休眠硬盘出错
    }

    class NET_DVR_CHANNELSTATE_V30 extends Structure {//通道状态(9000扩展)
        public byte byRecordStatic; //通道是否在录像,0-不录像,1-录像
        public byte bySignalStatic; //连接的信号状态,0-正常,1-信号丢失
        public byte byHardwareStatic;//通道硬件状态,0-正常,1-异常,例如DSP死掉
        public byte reservedData;		//保留
        public int dwBitRate;//实际码率
        public int dwLinkNum;//客户端连接的个数
        public NET_DVR_IPADDR[] struClientIP = new NET_DVR_IPADDR[MAX_LINK];//客户端的IP地址
        public  int dwIPLinkNum;//如果该通道为IP接入,那么表示IP接入当前的连接数
        public  byte[] byRes = new byte[12];
    }

    boolean  NET_DVR_GetDVRWorkState_V30(NativeLong lUserID, NET_DVR_WORKSTATE_V30 lpWorkState);
    boolean  NET_DVR_GetDVRConfig(NativeLong lUserID, int dwCommand, NativeLong lChannel, Pointer lpOutBuffer, int dwOutBufferSize, IntByReference lpBytesReturned);

    boolean  NET_DVR_Logout(NativeLong lUserID);
    boolean  NET_DVR_Cleanup();


    //软解码预览参数
    class NET_DVR_CLIENTINFO extends Structure {
        public NativeLong lChannel;
        public NativeLong lLinkMode;
        public W32API.HWND hPlayWnd;
        public String sMultiCastIP;
    }

    /***API函数声明,详细说明见API手册***/
    interface FRealDataCallBack_V30 extends StdCallCallback {
        void invoke(NativeLong lRealHandle, int dwDataType,
                           ByteByReference pBuffer, int dwBufSize, Pointer pUser);
    }

    NativeLong  NET_DVR_RealPlay_V30(NativeLong lUserID, NET_DVR_CLIENTINFO lpClientInfo, FRealDataCallBack_V30 fRealDataCallBack_V30, Pointer pUser , boolean bBlocked );

    boolean  NET_DVR_SaveRealData(NativeLong lRealHandle,String sFileName);
    boolean  NET_DVR_StopRealPlay(NativeLong lRealHandle);



    //--------------------
    //图片质量
    class NET_DVR_JPEGPARA extends Structure {
        /*注意:当图像压缩分辨率为VGA时,支持0=CIF, 1=QCIF, 2=D1抓图,
        当分辨率为3=UXGA(1600x1200), 4=SVGA(800x600), 5=HD720p(1280x720),6=VGA,7=XVGA, 8=HD900p
        仅支持当前分辨率的抓图*/
        public short	wPicSize;				/* 0=CIF, 1=QCIF, 2=D1 3=UXGA(1600x1200), 4=SVGA(800x600), 5=HD720p(1280x720),6=VGA*/
        public short	wPicQuality;			/* 图片质量系数 0-最好 1-较好 2-一般 */
    }

    //JPEG抓图到内存
    boolean  NET_DVR_CaptureJPEGPicture_NEW(NativeLong lUserID, NativeLong lChannel, NET_DVR_JPEGPARA lpJpegPara, ByteBuffer sJpegPicBuffer, int dwPicSize, IntByReference lpSizeReturned);

    //NET_DVR_SetDVRMessage的扩展
    boolean  NET_DVR_SetExceptionCallBack_V30(int nMessage, int hWnd, FExceptionCallBack fExceptionCallBack, Pointer pUser);
    interface FExceptionCallBack extends StdCallCallback {
        void invoke(int dwType, NativeLong lUserID, NativeLong lHandle, Pointer pUser);
    }
}
(2)工具类2:ClientDemoUtil
import com.stian.sdks.ClientDemo;

import java.io.UnsupportedEncodingException;

/**
 * @author Administrator
 */
public class ClientDemoUtil {

    public static String DLL_PATH;

    static{
        String path=(ClientDemo.class.getResource("/sdk/").getPath()).replaceAll("%20", " ").substring(1).replace("/", "\\");
        try {
            DLL_PATH= java.net.URLDecoder.decode(path,"utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}
(3)工具类3:ClientDemo
import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.examples.win32.W32API;
import com.sun.jna.ptr.ByteByReference;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.NativeLongByReference;
import com.sun.jna.win32.StdCallLibrary;

import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ClientDemo extends JFrame {
    static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;


    private JTextField jTextFieldIPAddress;
    private JTextField jTextFieldPortNumber;
    private JTextField jTextFieldUserName;
    private JPasswordField jPasswordFieldPassword;
    private JButton jButtonLogin;
    private java.awt.Panel panelRealplay;

    static PlayCtrl playControl = PlayCtrl.INSTANCE;



    boolean bRealPlay;//是否在预览.
    NativeLong lUserID;//用户句柄
    int m_iTreeNodeNum;//通道树节点数目
    DefaultMutableTreeNode m_DeviceRoot;//通道树根节点
    String m_sDeviceIP;//已登录设备的IP地址
    HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo;//设备信息
    HCNetSDK.NET_DVR_IPPARACFG  m_strIpparaCfg;//IP参数
    NativeLongByReference m_lPort;//回调预览时播放库端口指针


    //初始化
    private void initComponents(){
        panelRealplay = new java.awt.Panel();
        jTextFieldIPAddress = new JTextField();
        jTextFieldIPAddress.setText("172.4.1.170");
        jTextFieldPortNumber = new JTextField();
        jTextFieldPortNumber.setText("8000");
        jTextFieldUserName = new JTextField();
        jTextFieldUserName.setText("admin");
        jPasswordFieldPassword = new JPasswordField();
        jPasswordFieldPassword.setText("12345");
        jButtonLogin = new JButton();
        jButtonLogin.setText("注册");
        jButtonLogin.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                jButtonLoginActionPerformed();
            }
        });
    }

    /**
     * 注册
     * @param
     */
    public void jButtonLoginActionPerformed(){GEN-FIRST:event_jButtonLoginActionPerformed
        //注册之前先注销已注册的用户,预览情况下不可注销
        if (bRealPlay){
            JOptionPane.showMessageDialog(this,"注册新用户请先停止当前预览!");
            return;
        }
        if (lUserID != null && lUserID.longValue() > -1){
            //先注销
            hCNetSDK.NET_DVR_Logout_V30(lUserID);
            lUserID = new NativeLong(-1);
            m_iTreeNodeNum = 0;
            m_DeviceRoot.removeAllChildren();
        }
        jTextFieldIPAddress = new JTextField();
        jTextFieldIPAddress.setText("172.4.1.170");
        //注册
        m_sDeviceIP = jTextFieldIPAddress.getText();//设备ip地址
        m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();

        jTextFieldPortNumber = new JTextField();
        jTextFieldPortNumber.setText("8000");
        int iPort = Integer.parseInt(jTextFieldPortNumber.getText());

        jTextFieldUserName = new JTextField();
        jTextFieldUserName.setText("admin");
        jPasswordFieldPassword = new JPasswordField();
        jPasswordFieldPassword.setText("12345");
        lUserID =hCNetSDK.NET_DVR_Login_V30(m_sDeviceIP,(short) iPort, jTextFieldUserName.getText(), new String(jPasswordFieldPassword.getPassword()),m_strDeviceInfo);
        long userID = lUserID.longValue();
        if (userID == -1){
            m_sDeviceIP = "";//登录未成功,IP置为空
            JOptionPane.showMessageDialog(ClientDemo.this, "注册失败");
        }else {
            CreateDeviceTree();
        }
    }

    /**
     *建立设备通道数
     */
    private void CreateDeviceTree(){
        IntByReference ibrBytesReturned = new IntByReference(0);//获取IP接入配置参数
        boolean bRet = false;
        m_strIpparaCfg = new HCNetSDK.NET_DVR_IPPARACFG();
    }


    public FRealDataCallBack fRealDataCallBack;//预览回调函数实现


    //播放库函数声明,PlayCtrl.dll
    interface PlayCtrl extends StdCallLibrary
    {
        PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(".\\sdk\\PlayCtrl",
                PlayCtrl.class);

        public static final int STREAME_REALTIME = 0;
        public static final int STREAME_FILE = 1;

        boolean PlayM4_GetPort(NativeLongByReference nPort);
        boolean PlayM4_OpenStream(NativeLong nPort, ByteByReference pFileHeadBuf, int nSize, int nBufPoolSize);
        boolean PlayM4_InputData(NativeLong nPort, ByteByReference pBuf, int nSize);
        boolean PlayM4_CloseStream(NativeLong nPort);
        boolean PlayM4_SetStreamOpenMode(NativeLong nPort, int nMode);
        boolean PlayM4_Play(NativeLong nPort, W32API.HWND hWnd);
        boolean PlayM4_Stop(NativeLong nPort);
        boolean PlayM4_SetSecretKey(NativeLong nPort, NativeLong lKeyType, String pSecretKey, NativeLong lKeyLen);
    }


    /******************************************************************************
     *内部类:   FRealDataCallBack
     *          实现预览回调数据
     ******************************************************************************/
    public class FRealDataCallBack implements HCNetSDK.FRealDataCallBack_V30
    {
        //预览回调
        public void invoke(NativeLong lRealHandle, int dwDataType, ByteByReference pBuffer, int dwBufSize, Pointer pUser)
        {
            W32API.HWND hwnd = new W32API.HWND(Native.getComponentPointer(panelRealplay));
            switch (dwDataType)
            {
                case HCNetSDK.NET_DVR_SYSHEAD: //系统头

                    if (!playControl.PlayM4_GetPort(m_lPort)) //获取播放库未使用的通道号
                    {
                        break;
                    }

                    if (dwBufSize > 0)
                    {
                        if (!playControl.PlayM4_SetStreamOpenMode(m_lPort.getValue(), PlayCtrl.STREAME_REALTIME))  //设置实时流播放模式
                        {
                            break;
                        }

                        if (!playControl.PlayM4_OpenStream(m_lPort.getValue(), pBuffer, dwBufSize, 1024 * 1024)) //打开流接口
                        {
                            break;
                        }

                        if (!playControl.PlayM4_Play(m_lPort.getValue(), hwnd)) //播放开始
                        {
                            break;
                        }
                    }
                case HCNetSDK.NET_DVR_STREAMDATA:   //码流数据
                    if ((dwBufSize > 0) && (m_lPort.getValue().intValue() != -1))
                    {
                        if (!playControl.PlayM4_InputData(m_lPort.getValue(), pBuffer, dwBufSize))  //输入流数据
                        {
                            break;
                        }
                    }
            }
        }
    }
}
(4)工具类4:CameraInfo
import com.sun.jna.NativeLong;
import lombok.Data;

/**
 * @author Administrator
 */
@Data
public class CameraInfo {

    private String address;
    private String userName;
    private String pwd;
    private short port;
    private NativeLong userId;
    private NativeLong channel;
    private NativeLong key;
}
3. 运行类
import com.stian.sdks.HCNetSDK;
import com.stian.sdks.entity.CameraInfo;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: Administrator
 * @Date: 2023/05/11/20:25
 * @Description:
 */
public class TestHikvision {

    public static void main(String[] args) throws IOException {
        TestHikvision app = new TestHikvision();

        CameraInfo cameraInfo = new CameraInfo();//需要新建MonitorCameraInfo类
        cameraInfo.setAddress("192.168.1.213");
        cameraInfo.setPort((short) 8000);
        cameraInfo.setUserName("admin");
        cameraInfo.setPwd("P@ssw0rd");

        app.getDVRConfig(cameraInfo);
        app.getDVRPic(cameraInfo);
        //app.Test_CaptureJpegPicture_new(cameraInfo);
    }

    public void getDVRConfig(CameraInfo cameraInfo) {
        HCNetSDK sdk = HCNetSDK.INSTANCE;
        //判断摄像头是否开启
        if (!sdk.NET_DVR_Init()) {
            System.out.println("SDK初始化失败");
            return;
        }
        //设置连接时间与重连
        //sdk.NET_DVR_SetConnectTime(2000, 1);
        //sdk.NET_DVR_SetReconnect(10000, true);

        HCNetSDK.NET_DVR_DEVICEINFO_V30 devinfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();// 设备信息

        //System.out.println("设备信息:"+devinfo);

        //登录信息
        NativeLong id = sdk.NET_DVR_Login_V30(cameraInfo.getAddress(), (short) cameraInfo.getPort(),
                cameraInfo.getUserName(), cameraInfo.getPwd(), devinfo);

        cameraInfo.setUserId(id);// 返回一个用户编号,同时将设备信息写入devinfo
        //输出int数据
        //System.out.println("intValue:"+cameraInfo.getUserId().intValue());
        if (cameraInfo.getUserId().intValue() < 0) {
            System.out.println("设备注册失败");
            return;
        }
        //DVR工作状态
        HCNetSDK.NET_DVR_WORKSTATE_V30 devwork = new HCNetSDK.NET_DVR_WORKSTATE_V30();
        if (!sdk.NET_DVR_GetDVRWorkState_V30(cameraInfo.getUserId(), devwork)) {
            // 返回Boolean值,判断是否获取设备能力
            System.out.println("返回设备状态失败");
        }

        IntByReference ibrBytesReturned = new IntByReference(0);// 获取IP接入配置参数
        HCNetSDK.NET_DVR_IPPARACFG ipcfg = new HCNetSDK.NET_DVR_IPPARACFG();//IP接入配置结构
        ipcfg.write();
        Pointer lpIpParaConfig = ipcfg.getPointer();
        //获取相关参数配置
        sdk.NET_DVR_GetDVRConfig(cameraInfo.getUserId(), HCNetSDK.NET_DVR_GET_IPPARACFG, new NativeLong(0),
                lpIpParaConfig, ipcfg.size(), ibrBytesReturned);
        ipcfg.read();
        System.out.print("IP地址:" + cameraInfo.getAddress());
        System.out.println("|设备状态:" + devwork.dwDeviceStatic);// 0正常,1CPU占用率过高,2硬件错误,3未知
        //System.out.println("ChanNum"+devinfo.byChanNum);
        // 显示模拟通道
        for (int i = 0; i < devinfo.byChanNum; i++) {
            System.out.print("Camera" + i + 1);// 模拟通道号名称
            System.out.print("|是否录像:" + devwork.struChanStatic[i].byRecordStatic);// 0不录像,不录像
            System.out.print("|信号状态:" + devwork.struChanStatic[i].bySignalStatic);// 0正常,1信号丢失
            System.out.println("|硬件状态:" + devwork.struChanStatic[i].byHardwareStatic);// 0正常,1异常
        }
        //注销用户
        sdk.NET_DVR_Logout(cameraInfo.getUserId());//释放SDK资源
        sdk.NET_DVR_Cleanup();
    }

    //抓拍图片
    public void getDVRPic(CameraInfo cameraInfo) throws IOException {

        //设置通道号,其中1正常,-1不正常
        NativeLong chanLong = new NativeLong(1);
        cameraInfo.setChannel(chanLong);
        //System.out.println("Channel:"+chanLong);
        long startTime = System.currentTimeMillis();
        HCNetSDK sdk = HCNetSDK.INSTANCE;
        if (!sdk.NET_DVR_Init()) {
            System.out.println("SDK初始化失败");
            return;
        }
        HCNetSDK.NET_DVR_DEVICEINFO_V30  devinfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();// 设备信息


        //注册设备
        NativeLong id = sdk.NET_DVR_Login_V30(cameraInfo.getAddress(), (short) cameraInfo.getPort(),
                cameraInfo.getUserName(), cameraInfo.getPwd(), devinfo);
        cameraInfo.setUserId(id);// 返回一个用户编号,同时将设备信息写入devinfo
        if (cameraInfo.getUserId().intValue() < 0) {
            System.out.println("设备注册失败"+sdk.NET_DVR_GetLastError());
            return;
        } else {
            System.out.println("id:" + cameraInfo.getUserId().intValue());
        }
        HCNetSDK.NET_DVR_WORKSTATE_V30 devwork = new HCNetSDK.NET_DVR_WORKSTATE_V30();
        if (!sdk.NET_DVR_GetDVRWorkState_V30(cameraInfo.getUserId(), devwork)) {
            // 返回Boolean值,判断是否获取设备能力
            System.out.println("返回设备状态失败");
        }

        //System.out.println("设备注册耗时:[" + (System.currentTimeMillis() - startTime) + "]");

        startTime = System.currentTimeMillis();
        //图片质量
        HCNetSDK.NET_DVR_JPEGPARA jpeg = new HCNetSDK.NET_DVR_JPEGPARA();
        // 设置图片的分辨率
        jpeg.wPicSize = 2;
        // 设置图片质量
        jpeg.wPicQuality = 2;

        IntByReference a = new IntByReference();
        //设置图片大小
        ByteBuffer jpegBuffer = ByteBuffer.allocate(1024 * 1024);
        // 创建文件目录,文件?????
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        Date date = new Date();
        String fileNameString = "D:/CapturePicture/"+sdf.format(date)+".jpg";
        //还需要设置抓拍图片格式
        /*      String pathString = cameraInfo.getFilePath();*/
        File file = new File(fileNameString);
        if (!file.exists()) {
        	file.createNewFile(); //创建目录
        }
        //file.mkdirs();


        // 抓图到内存,单帧数据捕获并保存成JPEG存放在指定的内存空间中
        //需要加入通道
        boolean is = sdk.NET_DVR_CaptureJPEGPicture_NEW(cameraInfo.getUserId(), cameraInfo.getChannel(), jpeg,
                jpegBuffer, 1024 * 1024, a);
        //System.out.println("Channel:"+cameraInfo.getChannel());
        System.out.println("抓图到内存耗时:[" + (System.currentTimeMillis() - startTime) + "ms]");

        // 抓图到文件
        //boolean is = sdk.NET_DVR_CaptureJPEGPicture(cameraInfo.UserId,cameraInfo.Channel,jpeg, fileNameString);
        if (is) {
            System.out.println("抓取成功,返回长度:" + a.getValue());
        } else {
            System.out.println("抓取失败:"+sdk.NET_DVR_GetLastError());
        }

        //startTime = System.currentTimeMillis();
        // 存储本地,写入内容
        BufferedOutputStream outputStream = null;
        try {
            outputStream = new BufferedOutputStream(new FileOutputStream(file));
            outputStream.write(jpegBuffer.array(), 0, a.getValue());
            outputStream.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        //System.out.println("存储本地耗时:[" + (System.currentTimeMillis() - startTime) + "]");

        sdk.NET_DVR_Logout(cameraInfo.getUserId());
        sdk.NET_DVR_Cleanup();
    }

}
我是把我用到的工具类都贴出来了,可根据用到了工具类的哪些方法进行删减

代码参考:https://blog.csdn.net/Yuruiyu/article/details/79565261

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值