Java实现调用海康威视SDK接口抓图

日常开发过程中,会遇到对接视频服务商的需求,一般我们所知的国内大型的视频硬件服务商一个是海康威视,一个是浙江大华,那如何使用java程序来调用对应的接口服务呢?那就是集成SDK

环境

  • java Jdk 1.8
  • Centos 7 64位

hikvision SDK 准备

可以在下面这个链接中下载对应的SDK包:
https://open.hikvision.com/downloadNew/5cda567cf47ae80dd41a54b3?type=10

海康威视下载sdk.jpg

如上图所示:我们可以根据不同的开发环境去下载不同的sdk版本(都选用64位),因为我这边是部署到linux环境所以需要下载linux版本。

SDK 包简介

当我们下载下来后,解压会看到如下的文件夹:


开发文件.jpg

Demo 代码修改

代码中会有这么一个接口文件HCNetSDK 这个是你调用sdk的入口,需要引入so文件
HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary("/home/adore/hkws/lib/libhcnetsdk.so", HCNetSDK.class);

  • 建议 /home/adore/hkws/lib/libhcnetsdk.so 这个地址就用绝对路径。
  • 部署的话请参考Linux下JavaDemo使用说明

代码编写

代码的调用可以查看接口文档:设备网络SDK使用手册

  • 实现截图功能
/**
     * 抓拍图片
     *
     * @param imgPath     图片路径
     * @param cate        是否走内存
     * @param dvr         用户信息
     * @param channelList 通道
     */
    public void getDVRPic(Device dvr, String imgPath, boolean cate, List<Long> channelList) {
        log.info("-----------这里处理已经getDVRPic----------" + imgPath);

        if (!hCNetSDK.NET_DVR_Init()) {
            log.warn("hksdk(抓图)-海康sdk初始化失败!");
            return;
        }
        // 设备信息
        HCNetSDK.NET_DVR_DEVICEINFO_V30 devinfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
        //注册设备
        lUserID = hCNetSDK.NET_DVR_Login_V30(dvr.getIp(), Short.valueOf(dvr.getPort()), dvr.getAccount(), dvr.getPassword(), devinfo);
        // 返回一个用户编号,同时将设备信息写入devinfo
        if (lUserID.intValue() < 0) {
            log.error("hksdk(抓图)-设备注册失败,错误码:" + 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值,判断是否获取设备能力
            log.error("hksdk(抓图)-返回设备状态失败" + hCNetSDK.NET_DVR_GetLastError());
        }
        if (CollectionUtils.isEmpty(channelList)) {
            log.error("通道数据为空" + dvr.getIp());
            return;
        }
        channelList.forEach(x -> {
            String path = "";
            path = imgPath + "-" + x + ".jpeg";
            NativeLong chanLong = new NativeLong(x);
            //内存
            if (cate) {
                picCutCate(lUserID, chanLong, path);
            } else {
                //非内存直接保存
                //图片质量
                HCNetSDK.NET_DVR_JPEGPARA jpeg = new HCNetSDK.NET_DVR_JPEGPARA();
                //设置图片分辨率
                jpeg.wPicSize = 0;
                //设置图片质量
                jpeg.wPicQuality = 0;
                //需要加入通道
                log.info("-----------这里开始封装 NET_DVR_CaptureJPEGPicture---------");
                boolean is = hCNetSDK.NET_DVR_CaptureJPEGPicture(lUserID, chanLong, jpeg, path);
                log.info("-----------抓图工具返回结果----------" + is);
                if (!is) {
                    log.info("hksdk(抓图)-抓取失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
                }
            }
        });
        log.info("-----------处理完成截图数据----------");
        //退出登录
        hCNetSDK.NET_DVR_Logout(lUserID);
        //释放SDK资源
        hCNetSDK.NET_DVR_Cleanup();
    }


    private void picCutCate(NativeLong lUserID, NativeLong 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(1024 * 1024);
        File file = new File(imgPath);
        // 抓图到内存,单帧数据捕获并保存成JPEG存放在指定的内存空间中
        log.info("-----------这里开始封装 NET_DVR_CaptureJPEGPicture_NEW---------");
        boolean is = hCNetSDK.NET_DVR_CaptureJPEGPicture_NEW(lUserID, chanLong, jpeg, jpegBuffer, 1024 * 1024, a);
        log.info("-----------这里开始图片存入内存----------" + is);
        if (is) {
            /**
             * 该方式使用内存获取 但是读取有问题无法预览
             * linux下 可能有问题
             * */
            log.info("hksdk(抓图)-结果状态值(0表示成功):" + hCNetSDK.NET_DVR_GetLastError());
            //存储到本地
            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(抓图)-抓取失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        }
    }

特别说明:
如果使用的是内存方式截图(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 对象说明

/**
     * device.getAccount() 获取设备的访问账号
     * device.getPassword() 获取设备的访问密码
     * device.getIp() 获取设备所在内网的IP地址
     * device.getPort() 获取设备的访问端口 rtsp默认554
     */

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

注意工具类需要使用是用静态调用HCNetSDK

private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;

以上就是在linux下调用海康威视SDK实现抓图功能

主要的难点可能就是如何部署查看sdk中的部署文档就可以

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容