Java實(shí)現(xiàn)調(diào)用??低昐DK接口抓圖

日常開發(fā)過程中,會(huì)遇到對(duì)接視頻服務(wù)商的需求,一般我們所知的國(guó)內(nèi)大型的視頻硬件服務(wù)商一個(gè)是??低暎粋€(gè)是浙江大華,那如何使用java程序來調(diào)用對(duì)應(yīng)的接口服務(wù)呢?那就是集成SDK

環(huán)境

  • java Jdk 1.8
  • Centos 7 64位

hikvision SDK 準(zhǔn)備

可以在下面這個(gè)鏈接中下載對(duì)應(yīng)的SDK包:
https://open.hikvision.com/downloadNew/5cda567cf47ae80dd41a54b3?type=10

海康威視下載sdk.jpg

如上圖所示:我們可以根據(jù)不同的開發(fā)環(huán)境去下載不同的sdk版本(都選用64位),因?yàn)槲疫@邊是部署到linux環(huán)境所以需要下載linux版本。

SDK 包簡(jiǎn)介

當(dāng)我們下載下來后,解壓會(huì)看到如下的文件夾:


開發(fā)文件.jpg

Demo 代碼修改

代碼中會(huì)有這么一個(gè)接口文件HCNetSDK 這個(gè)是你調(diào)用sdk的入口,需要引入so文件
HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary("/home/adore/hkws/lib/libhcnetsdk.so", HCNetSDK.class);

  • 建議 /home/adore/hkws/lib/libhcnetsdk.so 這個(gè)地址就用絕對(duì)路徑。
  • 部署的話請(qǐng)參考Linux下JavaDemo使用說明

代碼編寫

代碼的調(diào)用可以查看接口文檔:設(shè)備網(wǎng)絡(luò)SDK使用手冊(cè)

  • 實(shí)現(xiàn)截圖功能
/**
     * 抓拍圖片
     *
     * @param imgPath     圖片路徑
     * @param cate        是否走內(nèi)存
     * @param dvr         用戶信息
     * @param channelList 通道
     */
    public void getDVRPic(Device dvr, String imgPath, boolean cate, List<Long> channelList) {
        log.info("-----------這里處理已經(jīng)getDVRPic----------" + imgPath);

        if (!hCNetSDK.NET_DVR_Init()) {
            log.warn("hksdk(抓圖)-??祍dk初始化失敗!");
            return;
        }
        // 設(shè)備信息
        HCNetSDK.NET_DVR_DEVICEINFO_V30 devinfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
        //注冊(cè)設(shè)備
        lUserID = hCNetSDK.NET_DVR_Login_V30(dvr.getIp(), Short.valueOf(dvr.getPort()), dvr.getAccount(), dvr.getPassword(), devinfo);
        // 返回一個(gè)用戶編號(hào),同時(shí)將設(shè)備信息寫入devinfo
        if (lUserID.intValue() < 0) {
            log.error("hksdk(抓圖)-設(shè)備注冊(cè)失敗,錯(cuò)誤碼:" + hCNetSDK.NET_DVR_GetLastError());
            return;
        }
        HCNetSDK.NET_DVR_WORKSTATE_V30 devwork = new HCNetSDK.NET_DVR_WORKSTATE_V30();
        if (!hCNetSDK.NET_DVR_GetDVRWorkState_V30(lUserID, devwork)) {
            // 返回Boolean值,判斷是否獲取設(shè)備能力
            log.error("hksdk(抓圖)-返回設(shè)備狀態(tài)失敗" + hCNetSDK.NET_DVR_GetLastError());
        }
        if (CollectionUtils.isEmpty(channelList)) {
            log.error("通道數(shù)據(jù)為空" + dvr.getIp());
            return;
        }
        channelList.forEach(x -> {
            String path = "";
            path = imgPath + "-" + x + ".jpeg";
            NativeLong chanLong = new NativeLong(x);
            //內(nèi)存
            if (cate) {
                picCutCate(lUserID, chanLong, path);
            } else {
                //非內(nèi)存直接保存
                //圖片質(zhì)量
                HCNetSDK.NET_DVR_JPEGPARA jpeg = new HCNetSDK.NET_DVR_JPEGPARA();
                //設(shè)置圖片分辨率
                jpeg.wPicSize = 0;
                //設(shè)置圖片質(zhì)量
                jpeg.wPicQuality = 0;
                //需要加入通道
                log.info("-----------這里開始封裝 NET_DVR_CaptureJPEGPicture---------");
                boolean is = hCNetSDK.NET_DVR_CaptureJPEGPicture(lUserID, chanLong, jpeg, path);
                log.info("-----------抓圖工具返回結(jié)果----------" + is);
                if (!is) {
                    log.info("hksdk(抓圖)-抓取失敗,錯(cuò)誤碼:" + hCNetSDK.NET_DVR_GetLastError());
                }
            }
        });
        log.info("-----------處理完成截圖數(shù)據(jù)----------");
        //退出登錄
        hCNetSDK.NET_DVR_Logout(lUserID);
        //釋放SDK資源
        hCNetSDK.NET_DVR_Cleanup();
    }


    private void picCutCate(NativeLong lUserID, NativeLong chanLong, String imgPath) {
        //圖片質(zhì)量
        HCNetSDK.NET_DVR_JPEGPARA jpeg = new HCNetSDK.NET_DVR_JPEGPARA();
        //設(shè)置圖片分辨率
        jpeg.wPicSize = 0;
        //設(shè)置圖片質(zhì)量
        jpeg.wPicQuality = 0;
        IntByReference a = new IntByReference();
        //設(shè)置圖片大小
        ByteBuffer jpegBuffer = ByteBuffer.allocate(1024 * 1024);
        File file = new File(imgPath);
        // 抓圖到內(nèi)存,單幀數(shù)據(jù)捕獲并保存成JPEG存放在指定的內(nèi)存空間中
        log.info("-----------這里開始封裝 NET_DVR_CaptureJPEGPicture_NEW---------");
        boolean is = hCNetSDK.NET_DVR_CaptureJPEGPicture_NEW(lUserID, chanLong, jpeg, jpegBuffer, 1024 * 1024, a);
        log.info("-----------這里開始圖片存入內(nèi)存----------" + is);
        if (is) {
            /**
             * 該方式使用內(nèi)存獲取 但是讀取有問題無法預(yù)覽
             * linux下 可能有問題
             * */
            log.info("hksdk(抓圖)-結(jié)果狀態(tài)值(0表示成功):" + hCNetSDK.NET_DVR_GetLastError());
            //存儲(chǔ)到本地
            BufferedOutputStream outputStream = null;
            try {
                outputStream = new BufferedOutputStream(new FileOutputStream(file));
                outputStream.write(jpegBuffer.array(), 0, a.getValue());
                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 {
            log.info("hksdk(抓圖)-抓取失敗,錯(cuò)誤碼:" + hCNetSDK.NET_DVR_GetLastError());
        }
    }

特別說明:
如果使用的是內(nèi)存方式截圖(linux)下則需要修改SDK接口如下:

    boolean NET_DVR_CaptureJPEGPicture_NEW(NativeLong lUserID, NativeLong lChannel, NET_DVR_JPEGPARA lpJpegPara, ByteBuffer jpegBuffer, int dwPicSize, IntByReference lpSizeReturned);

將String buffer 改為 ByteBuffer jpegBuffer,

Device 對(duì)象說明

/**
     * device.getAccount() 獲取設(shè)備的訪問賬號(hào)
     * device.getPassword() 獲取設(shè)備的訪問密碼
     * device.getIp() 獲取設(shè)備所在內(nèi)網(wǎng)的IP地址
     * device.getPort() 獲取設(shè)備的訪問端口 rtsp默認(rèn)554
     */

    private String account;
    private String password;
    private String ip;
    private String port;
    private Long channel;

注意工具類需要使用是用靜態(tài)調(diào)用HCNetSDK

private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;

以上就是在linux下調(diào)用??低昐DK實(shí)現(xiàn)抓圖功能

主要的難點(diǎn)可能就是如何部署查看sdk中的部署文檔就可以

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容