前言:因业务需要对接海康威视的综合安防管理平台获得下属所管理的摄像头,根据摄像头code获得监控视频流信息

1、详情可以浏览海康开放平台,在官网上有对应的接入指南以及开放的API接口【前提是本地已部署了海康视频流媒体服务器】

2、通过海康开放平台我们看到相关的对接指南,进行开发前准备。如下图所示:

3、AK/SK可以要求甲方提供,如果是驻场开发可以在当前的局域网下通过运管中心的登录名/密码登陆该平台,通过下面的索引步骤来获得 AK/SK。



4、获得到 AK/SK后,通过参考开放的API文档,找到项目所需的对用接口,本文所用到的接口主要为:

  • 分页获取区域列表
  • 根据区域获取下级编码设备列表
  • 获取监控点预览取流

5、相应开发代码

  • 引入海康依赖
        <!--海康依赖--><dependency><groupId>com.hikvision.ga</groupId><artifactId>artemis-http-client</artifactId><version>1.1.3</version></dependency>
  • 对应接口的测试代码
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import net.sf.json.JSONObject;import com.hikvision.artemis.sdk.config.ArtemisConfig;import java.util.HashMap;
import java.util.Map;/*** @author Orange* @version 1.0* @Description:调用海康接口获得监控视频流* @date 2020/11/16 14:44*/
public class HkTest {private static final Logger logger = LoggerFactory.getLogger(HkTest.class);static {ArtemisConfig.host = "10.*.1.99:443"; // artemis网关服务器ip端口ArtemisConfig.appKey = "25411867";  // 秘钥appkeyArtemisConfig.appSecret = "*************";// 秘钥appSecret}/***设置OpenAPI接口的上下文*/private static final String ARTEMIS_PATH = "/artemis";/** @Description: 分页获取区域信息* @author: Orange* @Param: /api/resource/v1/regions/root* @Return: java.lang.String* @Date: 2020/11/17 11:21*/public static String getRegionsPageList(int pageNo, int pageSize){//获取区域信息路径  /api/resource/v1/regions/rootfinal String getRegionsList = ARTEMIS_PATH + "/api/resource/v1/regions";Map<String, String> path = new HashMap<String, String>(2) {{put("https://", getRegionsList);}};//定义提交类型String contentType = "application/json";//参数装换JSONObject jsonBody = new JSONObject();jsonBody.put("pageNo", pageNo);jsonBody.put("pageSize", pageSize);String body = jsonBody.toString();//传参调用方法String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);//返回编码信息return result;}/** @Description: 根据区域编号获取下级监控点列表* @author: Orange* @Param:* @Return: java.lang.String* @Date: 2020/11/17 11:36*/public static String getCamerasByRegionCode(String regionIndexCode, int pageNo, int pageSize) {//根据区域编号获取下级监控点列表路径final String getRootApi = ARTEMIS_PATH + "/api/resource/v1/regions/regionIndexCode/cameras";Map<String, String> path = new HashMap<String, String>(2) {{put("https://", getRootApi);}};String contentType = "application/json";JSONObject jsonBody = new JSONObject();jsonBody.put("pageNo", pageNo);jsonBody.put("pageSize", pageSize);jsonBody.put("regionIndexCode", regionIndexCode);String body = jsonBody.toString();String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);//返回编码信息return result;}/** @Description: 根据摄像头编码code获得播放流* @author: Orange* @Param:* @Return: java.lang.String* @Date: 2020/11/17 13:19*/public static String getCamerasUrlByCode(String cameraIndexCode) {final String getCamsApi = ARTEMIS_PATH + "/api/video/v1/cameras/previewURLs";Map<String, String> path = new HashMap<String, String>(2) {{put("https://", getCamsApi);}};String contentType = "application/json";net.sf.json.JSONObject jsonBody = new net.sf.json.JSONObject();jsonBody.put("cameraIndexCode", cameraIndexCode);//监控点唯一标识jsonBody.put("streamType", 0);//码流类型,0:主码流,1:子码流,2:第三码流,参数不填,默认为主码流jsonBody.put("protocol", "rtsp");//取流协议,“rtsp”:RTSP协议,“rtmp”:RTMP协议,“hls”:HLS协议jsonBody.put("transmode", 1);//传输协议,0:UDP,1:TCP,默认是TCPjsonBody.put("expand", "streamform=ps");//扩展内容,格式:key=valueString body = jsonBody.toString();String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);//返回编码信息return result;}/** @Description: 获取摄像头列表* @author: Orange* @Param: int* @Return: java.lang.String* @Date: 2020/11/17 10:32*/public static String getAllRegionInfo(int pageNo, int pageSize) {//获取摄像头列表路径final String getCameraList = ARTEMIS_PATH + "/api/resource/v1/cameras";Map<String, String> path = new HashMap<String, String>(2) {{put("https://", getCameraList);}};//定义提交类型String contentType = "application/json";//参数装换JSONObject jsonBody = new JSONObject();jsonBody.put("pageNo", pageNo);jsonBody.put("pageSize", pageSize);String body = jsonBody.toString();//传参调用方法String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);//返回结果return result;}public static void main(String[] args) {//调用获取区域信息接口 JSONObject pa=JSONObject.parseObject(params)String regionsPageList = HKGetCamera.getRegionsPageList(1, 100);System.out.println( regionsPageList.getClass());//根据区域id来获取下属于摄像列表Object camerasByRegionCode = HkTest.getCamerasByRegionCode("e2a69da6-e406-4404-b7f5-6101357248fd", 1, 5);//根据摄像头code来获得视频流地址String camerasUrlByCode = HkTest.getCamerasUrlByCode("7ab2f03ffef245dca9345deb02d12997");//获得摄像头列表String cameraResult= HkTest.getAllRegionInfo(1,500);//打印查看返回信息System.out.println("获得区域信息列表:"+ regionsPageList);System.out.println("根据区域节点获得摄像头信息:"+ camerasByRegionCode);System.out.println("根据摄像头code来获得流:"+ camerasUrlByCode);System.out.println("获得摄像头列表:"+ cameraResult);}
}
  • 获得接口返回数组中的有效信息,下属代码以获取摄像头 code 以及 视频流 url 举例,
        String regionsPageList = HKGetCamera.getRegionsPageList(1, 100);JSONObject jsonObject = JSONObject.parseObject(regionsPageList);String data = jsonObject.getString("data");JSONObject jsonData = JSONObject.parseObject(data);String list = jsonData.getString("list");JSONArray jsonArray = JSONObject.parseArray(list);ArrayList<String> regionsResult = new ArrayList<>();if (Objects.nonNull(jsonArray) && jsonArray.size() > 0) {for (Object object : jsonArray) {JSONObject parseObject = JSONObject.parseObject(object.toString());String cameraIndexCode = parseObject.getString("indexCode");//2、将获得的地区信息编码封装到list中regionsResult.add(cameraIndexCode);}}
 for (String regionsCode : regionsResult) {String camerasByRegionCode = null;try{camerasByRegionCode = HKGetCamera.getCamerasByRegionCode(regionsCode, 10, 1);JSONObject json = JSONObject.parseObject(camerasByRegionCode);String resultData = json.getString("data");JSONObject da = JSONObject.parseObject(resultData);String url = da.getString("url");}catch (Exception e){}}

5、对接监控视频流的处理,可以根据接口传参来设置返回结果中的视频流格式。注意:rtsp格式的视频流无法直接在web端进行播放,但是 rtmp格式的视频流可以,部分摄像头支持返回的 rtmp流可以播放,部分不支持,所以要根据实际的业务需求来进行选择,若是摄像头不支持返回可直接播放的 rtmp流,可以将返回的 rtsp格式的视频流经ffmpeg+nginx进行装换为rtmp。但是效率很低,一般不推荐使用。


6、参考海康开放 API 时要注意对应海康综合安防管理平台的版本,不同版本间的 API 几乎不可通用,下图举例 1.10 版本对应 V1.0 版本接口

8、近期所使用的海康综合管理平台升级,由最初使用的1.1.0 升级为1.5.1,因此项目上需要更改视频信息的api版本,海康平台Hikvision AI Cloud默认显示的API为高版本,且支持向下兼容,对应历史版本api在如下位置

9、为了更快捷的将接口返回的数据信息进行分析整理入库,提供了如下代码,

/*                                           @Description: HkTest工具类补充代码                                         *//*** @Description: 数据处理* @author: 作者* @Param:* @Return:* @Date: 2021/2/3 14:52*/public static JSONArray checkData(String regionsPageList) {com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(regionsPageList);String code = jsonObject.getString("code");if (StringUtils.isBlank(code) || !"0".equalsIgnoreCase(code)) {return null;}com.alibaba.fastjson.JSONObject data = jsonObject.getJSONObject("data");if (ObjectUtil.isNull(data)) {return null;}Integer total = data.getInteger("total");JSONArray list = data.getJSONArray("list");System.out.println("所有的list 的长度" + list.size());return list;}/*** @Description: 数据处理* @author: 作者* @Param:* @Return:* @Date: 2021/2/3 14:52*/public static JSONArray checkCameraData(String cameraList) {com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(cameraList);if (ObjectUtil.isNull(jsonObject)) {return null;}String code = jsonObject.getString("code");if (StringUtils.isBlank(code) || !"0".equalsIgnoreCase(code)) {return null;}com.alibaba.fastjson.JSONObject data = jsonObject.getJSONObject("data");if (ObjectUtil.isNull(data)) {return null;}Integer total = data.getInteger("total");JSONArray list = data.getJSONArray("list");System.out.println("所有的 list 的长度" + list.size() +"total:" + total +" list 的长度 和 total是否相等:"+ (total==list.size()) );return list;}

10、数据提取封装到对应的数据表实现入库存储

package cn.stylefeng.guns.base;import cn.hutool.core.util.ObjectUtil;
import cn.stylefeng.guns.modular.led.entity.LedCameraArea;
import cn.stylefeng.guns.modular.led.entity.LedCameraAreaCameras;
import cn.stylefeng.guns.modular.led.service.LedCameraAreaCamerasService;
import cn.stylefeng.guns.modular.led.service.LedCameraAreaService;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author Orange* @version 1.0* @Description:此类用于获得数据并解析入库* @date 2021/2/3 14:04** 根节点:"root000000"*/
public class HkOptainData {private Map getmap(List<LedCameraArea> allAreas) {Map<String, LedCameraArea> map = new HashMap<>();for (LedCameraArea allArea : allAreas) {map.put(allArea.getIndexCode(), allArea);}return map;}private void digui(List<LedCameraArea> ledCameraAreas, Map<String, LedCameraArea> noleaf, Map<String, String> map) {for (LedCameraArea ledCameraArea : ledCameraAreas) {StringBuffer namebuffer = new StringBuffer();StringBuffer codebuffer = new StringBuffer();diguitree(ledCameraArea, noleaf, map, namebuffer, codebuffer, ledCameraArea.getIndexCode());}}private void diguitree(LedCameraArea ledCameraArea, Map<String, LedCameraArea> noleaf, Map<String, String> map, StringBuffer namebuffer, StringBuffer codebuffer, String key) {String pid = ledCameraArea.getParentIndexCode();namebuffer.append(ledCameraArea.getName()).append(",");codebuffer.append(ledCameraArea.getIndexCode()).append(",");LedCameraArea ledCameraArea1 = noleaf.get(pid);if (ObjectUtil.isNotNull(ledCameraArea1)) {String parentIndexCode = ledCameraArea1.getParentIndexCode();if (!"root000000".equalsIgnoreCase(parentIndexCode)) {diguitree(ledCameraArea1, noleaf, map, namebuffer, codebuffer, key);} else {map.put(key, codebuffer.toString() + ";" + namebuffer.toString());}} else {map.put(key, codebuffer.toString() + ";" + namebuffer.toString());System.out.println(pid);}}@AutowiredLedCameraAreaService ledCameraAreaService;@AutowiredLedCameraAreaCamerasService ledCameraAreaCamerasService;@Testpublic void testHkRegions() {//初始化根节点String[] roots = new String[]{"root000000"};String regionsPageList = HkTest.getRegionsPageList(roots, 1, 1000);JSONArray objects = HkTest.checkData(regionsPageList);if (CollectionUtils.isNotEmpty(objects)) {for (Object object : objects) {com.alibaba.fastjson.JSONObject jsonObject = (com.alibaba.fastjson.JSONObject) object;LedCameraArea entity = JSONObject.parseObject(jsonObject.toJSONString(), LedCameraArea.class);ledCameraAreaService.add(entity);}}}@Testpublic void testHkCameros() {QueryWrapper<LedCameraArea> wrapper = new QueryWrapper<>();wrapper.eq("leaf", 1);//叶子节点筛选List<LedCameraArea> ledCameraAreas = ledCameraAreaService.selectLedCameraArea(wrapper);QueryWrapper<LedCameraArea> allwrapper = new QueryWrapper<>();List<LedCameraArea> allAreas = ledCameraAreaService.selectLedCameraArea(allwrapper);Map<String, LedCameraArea> noleaf = getmap(allAreas);//先把相应的 tree 弄出来for (LedCameraArea ledCameraArea : allAreas) {noleaf.put(ledCameraArea.getIndexCode(), ledCameraArea);}Map<String, String> map = new HashMap<>();digui(ledCameraAreas, noleaf, map);//初始化计数器int n=0;for (LedCameraArea ledCameraArea : ledCameraAreas) {String nameandcode = map.get(ledCameraArea.getIndexCode());String namepath="";String codepath="";if (StringUtils.isNotBlank(nameandcode)) {String[] split = nameandcode.split(";");codepath=split[0];namepath=split[1];}String name=ledCameraArea.getName();String code=ledCameraArea.getExternalIndexCode();Object camerasByRegionCode = HkTest.getCamerasByRegionCode(ledCameraArea.getIndexCode(), 1, 1000);JSONArray objects = HkTest.checkCameraData((String) camerasByRegionCode);if (ObjectUtil.isNull(objects)) {continue;}n+=objects.size();System.out.println(ledCameraArea.getName()+":"+ledCameraArea.getIndexCode()+";"+objects.size());for (Object object : objects) {com.alibaba.fastjson.JSONObject jsonObject = (com.alibaba.fastjson.JSONObject) object;LedCameraAreaCameras entity = JSONObject.parseObject(jsonObject.toJSONString(), LedCameraAreaCameras.class);entity.setRegionCode(code);entity.setRegionName(name);entity.setRegionPath(codepath);entity.setRegionPathName(namepath);ledCameraAreaCamerasService.add(entity);}}System.out.println("总共多少个摄像头:"+ n +" 总共多少个区域 :"+ledCameraAreas.size());}
}

11、实体类的创建可根据api返回的数据创建对应的属性,也可仅对部分可用数据进行封装

 /*此处举例部分属性*/@TableField("dept_id")private Long deptId;@TableField("indexCode")private String indexCode;@TableField("nodeType")private String nodeType;@TableField("name")private String name;@TableField("regionPath")private String regionPath;@TableField("parentIndexCode")private String parentIndexCode;@TableField("cascadeCode")private String cascadeCode;@TableField("cascadeType")private String cascadeType;@TableField("externalIndexCode")private String externalIndexCode;@TableField("available")private boolean available;@TableField("leaf")private boolean leaf;@TableField("catalogType")private Long catalogType;

12、平台版本升级后通过api所返回数据【json格式】内容变得更多,仅获取项目所需得内容即可

{"code": "0","msg": "success","data": {"total": 46,"pageNo": 1,"pageSize": 100,"list": [{"indexCode": "root000000","nodeType": 0,"name": "根节点","regionPath": "@root000000@","parentIndexCode": "-1","cascadeType": 0,"externalIndexCode": "370102","sort": 1,"createTime": "2021-01-19T14:53:39.136+08:00","updateTime": "2021-01-22T09:55:17.075+08:00","regionCode": "","available": true,"leaf": false,"catalogType": 10,"cascadeCode": "0"}]}
}

13、最后感谢一位CSDN博主,对我所提问题的耐心解答,这是他的博文地址,欢迎大家前去拜读!

https://blog.csdn.net/weixin_43716343/article/details/108054096#comments_13802942

14、话外:高版本的综合安防平台可以获得支持web端直接播放得rtmp格式视频流,如果返回的rtmp 视频流可以在第三方工具,如 VLC 上播放但是在页面使用 video.js 无法进行播放,可以考虑是否是视频码流所造成的影响。可以通过调用接口时指定码流格式 【0:为主码流】【1:为子码流】

对接海康综合安防管理平台经验总结相关推荐

  1. 海康 综合安防管理平台 对接

    海康摄像头对接,通过海康综合安防管理平台对接 1. 海康综合安防管理平台介绍 1.1 官网介绍 1.2 个人理解 综合安防管理平台部署之后,有2个系统,一个是综合安防管理平台:是用户端系统,一个是运营 ...

  2. 海康综合安防管理平台V1.5.100 用户添加和监控点添加。

    海康综合安防管理平台V1.5.100_20200630,用户添加和监控点添加. 一.添加用户,从"人员信息管理"下操作: 1.在用户管理,添加用户名称: 2.在角色管理,添加用户应 ...

  3. 海康iSecure Center 综合安防管理平台安装部署教程 - CentOS系统

    准备环境: 1.海康CentOS系统 2.iSecure Center 综合安防管理平台 - Linux版-安装包 3.激活授权 4.一个可用IP地址 注意事项:海康iSecure Center 综合 ...

  4. 海康综合安防平台使用内置H5播放器查看监控录像

    目录 一.说明 二.解决办法:安装根证书 (一)Windows平台 (二)Mac平台 一.说明 1.海康综合安防平台查看监控有三种方式.其一,使用客户端,仅支持Windows平台.其二,使用OCX控件 ...

  5. 天地伟业摄像头通过onvif协议加入海康教育综合安防管理平台

    由于安防系统重建,采购了海康平台,需要将大批2014-2015年的老旧天地伟业摄像头加入新的海康平台,通过onvif协议实现. onvif协议:摄像头通用标准协议.摄像头在我们的日常生活中可以说时随处 ...

  6. isecure center 综合安防管理平台_企业综合安全管理平台

    企业综合安全管理平台 企业综合安全管理平台是为保障军工制造企业安全的综合监管平台 .该平台实现对重要监管点和重要出入口域进行集中全面控制管理,同时对火工区的安全生产和企业信息化发展,杜绝预防不安全因素 ...

  7. 海康威视的综合安防管理平台部署

    1.hkvs提供iso镜像 2.阿里云不支持iso镜像,需要用VirtualBox转换格式 在转换格式前一定要 先根据 阿里云的导入镜像 测试和开始ssh 端口 阿里云文档 管理->虚拟介质管理 ...

  8. 基于java安防管理平台计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署

    基于java安防管理平台计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 基于java安防管理平台计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 本源码技术栈: 项目架构 ...

  9. 对接海康设备-vue

    海康官方Demo 海康开放平台 对接海康综合安防管理摄像头 说明:官方Demo是原js代码,自己改改就能用,非常简单,下面这个是改成vue的 浏览器需要装的插件↓↓↓↓ https://downloa ...

最新文章

  1. 我国手机浏览器用户达2.15亿
  2. fn hotkeys and osd_潍坊实习生活(3)and 绊 最后的进化
  3. java将字符串和字符串数组互相转换方法
  4. 华为机试HJ72:百钱买百鸡问题
  5. 递归java程序_JAVA编程基础之递归结构
  6. 湖南师范大学2018年大学生程序设计竞赛新生赛 A 齐神和心美的游戏【hash】
  7. 解决IE7中移动文件夹无法收藏问题
  8. Python 编写几个经典例子
  9. 《大学》全文及白话翻译
  10. 在Linux上安装VLC播放器
  11. 电脑蓝屏0x000024解决记录
  12. 为地球减碳1亿吨,阿里云低碳科技加速器发布
  13. AoE 和TensorFlow Lite ,没有谁比它们更般配!
  14. Git安装图文教程(Windows、Linux全平台)
  15. 【九度】题目1375:陈博的完美主义(25分)
  16. [网络通信]建筑物综合布线系统(PDS)
  17. 电脑上不了网怎么办?
  18. 博学、审问、慎思、明辨、力行
  19. linux驱动之系统移植-----uboot常用命令汇总
  20. 校内论坛csdn开通了

热门文章

  1. 微信小程序在一张canvas上把正方形图片绘制成圆形
  2. 二叉树的非递归后序遍历(双栈法和双指针法,有图有真相)
  3. iphone 微信缓存_iPhone缓存
  4. 总结现在,展望未来——2013-2014年终总结
  5. 太强了!阿里高工熬夜 18 天码出 Java150K 字面试宝典
  6. 全球智能经济峰会暨第八届智博会在浙江省宁波市召开
  7. 甜美列车长的春运故事 微笑应对一切
  8. VLAN--虚拟局域网(理论详解)
  9. SU插件情报局 | JPP联合推拉4.3 可视互动版(附插件获取)
  10. 如何用直播摄像机、编码器、电脑端OBS软件在抖音平台上做推流直播现实背景