调用海康视频接口获取预览取流的URL

开始之前请参考海康官方SDK文档
鉴于前段时间刚接触视频这一块,整理了自己的一些经验,具体的你们还是参考文档来吧 附上文档地址

https://open.hikvision.com/docs/docId?productId=5c67f1e2f05948198c909700&curNodeId=16741aecc05944a6b0cd1341d68e4546#b5bd6fd9
在这里插入图片描述

不要问我哪里来的 问就是白嫖…

文档中有各种API接口,请根据自己的业务需求使用;

想要实验之前 你还需要搭建自己的视频服务器,centos7就可以 首先你还要有一台海康的网络摄像头 (这个嘛就是单纯测试的)别忘了导入海康的坐标和lib包

安全认证库已上传公网仓库,maven依赖坐标

		<!--海康依赖--><dependency><groupId>com.hikvision.ga</groupId><artifactId>artemis-http-client</artifactId><version>1.1.3</version></dependency>

artemis-http-client-1.1.3.jar
—从Hikvision AI Cloud开放平台网站(https://open.hikvision.com/download/)上下载“OpenAPI安全认证库(Java)”,获取artemis-http-client.jar,导入到Java工程中。
具体的也不细说文档够仔细了…

我把我自己写的业务需要的封装的工具类列出来你们参考一下

public class ArtemisUtil {private static final Logger logger = LoggerFactory.getLogger(ArtemisUtil.class);static {// 代理API网关nginx服务器ip端口ArtemisConfig.host = "";// 秘钥appkeyArtemisConfig.appKey = "";// 秘钥appSecretArtemisConfig.appSecret = "";}/*** 能力开放平台的网站路径*/private static final String ARTEMIS_PATH = "/artemis";/* *//*** 订阅报警事件*//*public static String alarmSubscription() {final String previewURLsApi = ARTEMIS_PATH + "/api/eventService/v1/eventSubscriptionByEventTypes";Map<String, String> path = new HashMap<String, String>(2) {{put(HTTP + "://", previewURLsApi);//根据现场环境部署确认是http还是https}};String contentType = "application/json";JSONObject jsonBody = new JSONObject();//订阅事件的类型,防区报警,int[] arr = ConstParams.SUBSCRIBE_EVENT_TYPE_ARR;jsonBody.put("eventTypes", arr);String backUrl = "http://" + ConstParams.CALLBACK_IP + ":" + ConstParams.CALLBACK_PORT + ConstParams.CALLBACK_URL;logger.info("事件回调接口:" + backUrl);// 接受事件的回调接口jsonBody.put("eventDest", backUrl);String body = jsonBody.toJSONString();String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);// post请求application/json类型参数return result;}*//*** 取消订阅事件*//* public static String cancelAlarmSubscription() {final String previewURLsApi = ARTEMIS_PATH + "/api/eventService/v1/eventUnSubscriptionByEventTypes";Map<String, String> path = new HashMap<String, String>(2) {{put(ConstParams.ARTEMIS_HTTP + "://", previewURLsApi);}};String contentType = "application/json";JSONObject jsonBody = new JSONObject();//取消订阅事件类型int[] arr = ConstParams.CANCEL_SUBSCRIBE_EVENT_TYPE_ARR;jsonBody.put("eventTypes", arr);String body = jsonBody.toJSONString();String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);// post请求application/json类型参数return result;}*//*** 分页获取区域列表*/public static String getAllRegionInfo(int pageNo, int pageSize) {String getRootApi = ARTEMIS_PATH + "/api/resource/v1/regions";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);String body = jsonBody.toJSONString();String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);return result;}/*** 根据区域编号获取下级监控点列表*/public static String getCamerasByRegionCode(String regionIndexCode, int pageNo, int pageSize) {String getRootApi = ARTEMIS_PATH + "/api/resource/v1/regions/regionIndexCode/cameras";Map<String, String> path = new HashMap<String, String>(2) {{put("http://", getRootApi);}};String contentType = "application/json";JSONObject jsonBody = new JSONObject();jsonBody.put("pageNo", pageNo);jsonBody.put("pageSize", pageSize);jsonBody.put("regionIndexCode", regionIndexCode);String body = jsonBody.toJSONString();String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);return result;}/*** 根据设备编号获取监控点详细信息*/public static String getCameraInfo(String cameraIndexCode) {String getRootApi = ARTEMIS_PATH + "/api/resource/v1/cameras/indexCode";Map<String, String> path = new HashMap<String, String>(2) {{put("https://", getRootApi);}};String contentType = "application/json";JSONObject jsonBody = new JSONObject();jsonBody.put("cameraIndexCode", cameraIndexCode);String body = jsonBody.toJSONString();String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);return result;}/*** 查询监控点列表(此处为根据一定条件进行查询,若不指定查询条件,即全量获取所有的监控点信息)*/public static String getCamerasByParams() {String getRootApi = ARTEMIS_PATH + "/api/resource/v1/camera/advance/cameraList";Map<String, String> path = new HashMap<String, String>(2) {{put("https://", getRootApi);}};String contentType = "application/json";JSONObject jsonBody = new JSONObject();jsonBody.put("pageNo", 1);jsonBody.put("pageSize", 100);
//        jsonBody.put("regionIndexCode", "143c69e3-1478-4b31-8ec7-d0b78df09484");//区域唯一标识
//        jsonBody.put("cameraIndexCodes", "a8f74dcf14f846bb95c8dff6684f897e");//监控点唯一标识集,多个值使用英文逗号分隔
//        jsonBody.put("encodeDevIndexCode", "73c2e4903a4547f8812a26d329802cd0");//所属编码设备唯一标识
//        jsonBody.put("isCascade", 1);//是否级联,0:非级联 1:级联 2:不限String body = jsonBody.toJSONString();String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);return result;}/*** 获取预览取流的url*/public static String getCameraPreviewURL(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";JSONObject jsonBody = new 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.toJSONString();String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);return result;}/*** 获取监控点回放取流url*/public static String getCameraPlayBackURL(String cameraIndexCode, String beginTime, String endTime) {String getRootApi = ARTEMIS_PATH + "/api/video/v2/cameras/playbackURLs";Map<String, String> path = new HashMap<String, String>(2) {{put("https://", getRootApi);}};String contentType = "application/json";JSONObject jsonBody = new JSONObject();jsonBody.put("cameraIndexCode", cameraIndexCode);jsonBody.put("recordLocation", 1);//存储类型,0:中心存储,1:设备存储,默认为中心存储jsonBody.put("protocol", "rtsp");jsonBody.put("transmode", 1);jsonBody.put("beginTime", beginTime);//开始查询时间jsonBody.put("endTime", endTime);//结束查询时间,IOS8601格式:yyyy-MM-dd’T’HH:mm:ss.SSSXXXjsonBody.put("expand", "streamform=ps");String body = jsonBody.toJSONString();String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);return result;}//TODO 布撤防接口public static String setDefenceStatus(String subSystemIndexCode, String deviceIndexCode, int status) {final String api = ARTEMIS_PATH + "/api/daf/v1/subsystem/status/set";Map<String, String> path = new HashMap<String, String>(2) {{put("https://", api);}};String contentType = "application/json";JSONArray jsonArray = new JSONArray();JSONObject jsonObject = new JSONObject();jsonObject.put("subSystemIndexCode", subSystemIndexCode);jsonObject.put("status", status);//0-撤防,1-布防jsonArray.add(jsonObject);JSONObject params = new JSONObject();params.put("subSystems", jsonArray);JSONObject jsonBody = new JSONObject();jsonBody.put("method", "SetDefenceStatus");jsonBody.put("params", params);String body = jsonBody.toJSONString();HashMap<String, String> header = new HashMap<>();header.put("DeviceIndexCode", deviceIndexCode);//System.out.println(jsonBody.toJSONString());String result = null;if (StringUtils.isNotEmpty(subSystemIndexCode) && StringUtils.isNotEmpty(deviceIndexCode)) {result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, header);}return result;}/*** 5.4.3.3	获取资源列表*/public static String getResourceListByPage() {String getRootApi = ARTEMIS_PATH + "/api/irds/v1/deviceResource/resources";Map<String, String> path = new HashMap<String, String>(2) {{put("https://", getRootApi);//根据现场环境部署确认是http还是https}};String contentType = "application/json";JSONObject jsonBody = new JSONObject();jsonBody.put("pageNo", 1);jsonBody.put("pageSize", 100);jsonBody.put("resourceType", "subSys");//子系统通道String body = jsonBody.toJSONString();//返回的indexCode是子系统编码()String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);return result;}/*** 监控点3D放大*/public static String CameraThreeDSelZoom(){String getRootApi = ARTEMIS_PATH + "/api/video/v1/ptzs/selZoom";Map<String, String> path = new HashMap<String, String>(2) {{put("https://", getRootApi);//根据现场环境部署确认是http还是https}};String contentType = "application/json";JSONObject jsonBody = new JSONObject();jsonBody.put("cameraIndexCode", "e66493f4ca9d4264a0bbb091887fec4b");jsonBody.put("startX", 10);jsonBody.put("startY", 40);jsonBody.put("endX", 10);jsonBody.put("endY", 40);String body = jsonBody.toJSONString();/*** STEP6:调用接口*/String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null);System.out.println(result);return result;}/*根据监控点列表查询录像完整性结果*/public static String list(List listRequest){String listDataApi = ARTEMIS_PATH +"/api/nms/v1/record/list";Map<String,String> path = new HashMap<String,String>(2){{put("https://",listDataApi);}};JSONObject jsonBody = new JSONObject();jsonBody.put("pageNo", 1);jsonBody.put("pageSize", 20);String body= jsonBody.toJSONString(listRequest);String result =ArtemisHttpUtil.doPostStringArtemis(path,body,null,null,"application/json");return result;}/*** 时间格式转换* 将时间抓换成IOS8601格式* @param data* @param formatType* @return*/public static String dateToString(Date data, String formatType){return new SimpleDateFormat(formatType).format(data);}
}

static静态代码块的内容根据自己的进行修改//

在附上我做测试的controller

@Slf4j
@RestController
@RequestMapping("/t-sys-video")
@Api(tags = "海康视频接口")
public class VideoController extends BaseController {@ApiOperation("获取实时预览取流的url")@PostMapping("/cameraIndexCode")public ResultEntity cameraIndexCode() {//查看监控点列表String camerasByParams = ArtemisUtil.getCamerasByParams();JSONObject jsonObject = JSONObject.parseObject(camerasByParams);String data = jsonObject.getString("data");JSONObject jsonData = JSONObject.parseObject(data);String list = jsonData.getString("list");//JSONObject jsonList = JSONObject.parseObject();JSONArray jsonArray = JSONObject.parseArray(list);ArrayList<String> result = new ArrayList<>();if (Objects.nonNull(jsonArray) && jsonArray.size() > 0) {for (Object object : jsonArray) {JSONObject parseObject = JSONObject.parseObject(object.toString());String cameraIndexCode = parseObject.getString("cameraIndexCode");result.add(cameraIndexCode);}}for (String cameraIndexCode : result) {String cameraPreviewURL = null;try {//获取实时预览URLcameraPreviewURL = ArtemisUtil.getCameraPreviewURL(cameraIndexCode);JSONObject json = JSONObject.parseObject(cameraPreviewURL);String resultData = json.getString("data");JSONObject da = JSONObject.parseObject(resultData);String url = da.getString("url");return ResultEntity.ok(url);} catch (Exception e) {log.error(e.getMessage());return ResultEntity.error(MessageConstant.GET_VIEDO_PREVIEW_ERROR_MSG);}}return ResultEntity.ok();}/*** 根据每个侯问室的摄像头编号记录审问期间视频** @param cameraIndexCode* @param beginTime* @param endTime* @return*/@ApiOperation("获取监控点回放取流url")@PostMapping("/indexTime")public ResultEntity indexTime(@RequestParam("cameraIndexCode") @ApiParam(name = "cameraIndexCode", value = "摄像头id") String cameraIndexCode,@RequestParam("beginTime") @ApiParam(name = "beginTime", value = "开始时间") String beginTime,@RequestParam("endTime") @ApiParam(name = "endTime", value = "结束时间") String endTime) {String cameraPlayBackURL = null;try {cameraPlayBackURL = ArtemisUtil.getCameraPlayBackURL(cameraIndexCode, beginTime, endTime);} catch (Exception e) {log.error(e.getMessage());return ResultEntity.error(MessageConstant.GET_VIEDO_PREVIEW_ERROR_MSG);}JSONObject json = JSONObject.parseObject(cameraPlayBackURL);String resultData = json.getString("data");JSONObject da = JSONObject.parseObject(resultData);String url = da.getString("url");return ResultEntity.ok(url);}
}

声明一下 这个获取到的视频流是rtsp格式并不能直接在浏览器播放,不过可以通过网络串流播放,例如使用VLC播放器进行播放

以上代码是可以获取到视频流的本人亲测有效,不过很遗憾这样方法用在实际项目中实不可取的,对接硬件摄像机可能有球形…各种不同类型的网络摄像机,所以我们最后采取的方法是采用国标流服务器对接海康的国标流服务器只用配置一下每个摄像机就可以从海康的国标流服务器获取到数据,如何对接这个你们需要跟海康的技术人员联系,具体根据各自公司业务需求来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c if语句多个条件判断顺序_Java中的流程控制语句 (基础篇四)

流程控制就是对事物次序的布置和安排,在程序中就是对代码执行次序的安排和控制程序中的流程控制主要有三种&#xff1a;顺序流程、选择流程、循环流程。顺序流程&#xff1a;比如打印输出的代码按照指定的顺序结构依次排序&#xff0c;打印的结果按照代码的顺序执行打印&#x…

git checkout 会把改动带过去吗_原创 | 操作失误不要慌,这个命令给你的Git一次反悔的机会...

点击上方蓝字&#xff0c;关注并星标&#xff0c;和我一起学技术。今天我们来介绍git当中两个非常非常好用的工具&#xff0c;git show和reflog。这两个命令虽然不是必知必会&#xff0c;但是如果熟练使用可以极大地帮助我们查看代码仓库的问题&#xff0c;以及在我们操作失误的…

计算机指令执行与时序逻辑,时序逻辑系统

时序逻辑电路其任一时刻的输出不仅取决于该时刻的输入&#xff0c;而且还与过去各时刻的输入有关。常见的时序逻辑电路有触发器、计数器、寄存器等。时序逻辑电路在逻辑功能上的特点是任意时刻的输出不仅取决于当时的输入信号&#xff0c;而且还取决于电路原来的状态&#xff0…

flume连接kafka_日志收集系统架构设计:(flume+zookeeper+kafka+php+mysql )

正文内容一、安装jdk二、安装flume三、安装kafka1、zookeeper2、kafka四、启动测试步骤五、目录说明六、日志收集系统设计图七、大数据参考资料推荐一、安装jdk -(版本&#xff1a;1.8.0_191)1.下载&#xff1a;https://www.oracle.com/technetwork/java/javase/downloads/jdk8…

2020班徽设计图案高中计算机,高铁工程学院举办2020级班徽设计大赛

大赛现场12月3日&#xff0c;高铁工程学院团总支第四届“班徽设计”大赛在GB250教室隆重举行&#xff0c;高铁工程学院20级新生各班参赛&#xff0c;20级辅导员代表出席评委席并参与评分。获奖选手领取证书本次比赛采用了线下评分及线上投票相结合的方式。比赛开始&#xff0c;…

Web浏览器没有Flash如何播放RTMP协议直播

各大主流浏览器在很早的时候就已声明 2020 年底不支持 Adobe Flash。所以已经线上运行的项目以及涉及直播的项目&#xff0c;都会涉及一个问题 &#xff1a; “没有 Adobe Flash 在 Web 浏览器端如何播放 RTMP 直播流&#xff1f;” 还好有先见之明&#xff0c;我参与涉及直播的…

video-js RTMP直播

目前主流的几种直播协议 协议传输方式视频封装格式延时数据分段html播放httpflvhttpflv低连续可通过html5解封包播放(flv.js)rtmptcpflv tag低连续不支持dashhttpts文件高切片可通过html5解封包播放(hls.js)hls$1mp4 3gp webm高切片如果dash文件列表是mp4webm文件&#xff0c;…

EJB到底是什么?(通俗易懂白话文)

1. 我们不禁要问&#xff0c;什么是"服务集群"&#xff1f;什么是"企业级开发"&#xff1f; 既然说了EJB 是为了"服务集群"和"企业级开发"&#xff0c;那么&#xff0c;总得说说什么是所谓的"服务 集群"和"企业级开发&…

ABC334 A-F

打的很懒的一场B卡了D看不懂题卡了F没看完题目理解错题意了&#xff0c;状态好差XD UNIQUE VISION Programming Contest 2023 Christmas (AtCoder Beginner Contest 334) - AtCoder A - Christmas Present 题意&#xff1a; 给出两个数B, G问哪个大 题解&#xff1a; 凑数…

华为笔记本matebook13_华为引领“第三代移动办公”新纪元 华为MateBook开启“智慧化办公”新赛道...

&#xfeff;运营商财经网 康钊/文移动互联网的快速兴起&#xff0c;让办公形式不再受时间、地点的限制&#xff0c;笔记本电脑、平板电脑、手机等承担生产力工具作用的电子设备也是越来越多样化&#xff0c;“移动办公”正成为一种不断演化市场趋势。然而&#xff0c;随着移动…

IPv4地址和IPv6地址的比较,IPv6地址及其表示

IPv4地址和IPv6地址的比较&#xff0c;IPv6地址及其表示 TCP/IP协议是互联网发展的基石&#xff0c;其中IP是网络层协议&#xff0c;规范互联网中分组信息的交换和选路。目前采用的IPv4协议地址长度为32位&#xff0c;总数约43亿个IPv4地址已分配殆尽。 IPv6是IP地址的第六版…

MySQL如何有效的存储IP地址

文章目录序言工具类实现转换数据库函数实现转换一、IP地址应该怎么存二、整数存储 IP 地址的查询性能实验1、测试范围查询&#xff1a;2、IP精确查询&#xff1a;3、整理一下结果发现&#xff1a;总结首先就来阐明一下部分人得反问&#xff1a;为什么要问IP得知怎样存&#xff…

ab753变频器参数怎么拷贝到面板_变频器怎么设置参数?变频器的基本参数设定...

电工学习网&#xff1a;www.diangon.com技术驱动未来&#xff0c;关注电工学习网官方微信公众号“电工电气学习”&#xff0c;收获更多经验知识。变频器在工业生产中应用及其重要&#xff0c;其除了调速&#xff0c;软启动作用外&#xff0c;最重要的是可以节能。变频器功能参数…

卢克增加服务器,DNF卢克跨区服务器崩溃?策划:暗制造者临时加入安图恩攻坚...

原标题&#xff1a;DNF卢克跨区服务器崩溃&#xff1f;策划&#xff1a;暗制造者临时加入安图恩攻坚DNF作为一款即时在线&#xff0c;2d网络游戏&#xff0c;决斗场系统延伸到早期60级版本组队刷图。玩家与玩家之间互动&#xff0c;即时刷图跨区&#xff0c;成为了阿拉德大陆一…

使用TortoiseGit(小乌龟)操作分支的创建

现在的我的github库上面只有一个master分支 由于是穷屌丝用不起mac&#xff0c;所以我windows为例进行相应的演示&#xff1a; 下图就是本地使用小乌龟的版本管理工具在只有一个分支的情况下执行命令&#xff1a;Switch/Checkout 显示的内容。 下面分为三个步骤进行创建分支操…

计算机丢失d3dcompile,电脑d3dcompiler43.dll文件丢失怎么办 文件丢失解决方法

最近有位用户私信给小编&#xff0c;说他在使用电脑的时候&#xff0c;电脑一直弹出丢失d3dcompiler43.dll文件的弹窗。就算是关闭&#xff0c;下次开机依旧会弹出这样的窗口&#xff0c;十分厌烦。那丢失电脑中的d3dcompiler43.dll文件应该怎么办呢&#xff1f;其实也不难&…

mybatis plus 导出sql_软件更新丨mybatis-plus 3.0.7 发布,辞旧迎新

点击右上方&#xff0c;关注开源中国OSC头条号&#xff0c;获取最新技术资讯Mybatis-Plus 是一款 Mybatis 动态 SQL 自动注入 Mybatis 增删改查 CRUD 操作中间件&#xff0c; 减少你的开发周期优化动态维护 XML 实体字段&#xff0c;无入侵全方位 ORM 辅助层让您拥有更多时间陪…

网站服务器怎么用手机登录不了怎么办,怎么打不开服务器列表了?

2011-04-19网页图片打不开是不是中毒呢&#xff1f;以前网页中没有图片、视频、动画、声音。打开IE选工具/Internet选项/高级/在设置的下拉列表&#xff0c;勾选“播放网页中的动画”“播放网页中的声音”“播放网页中的视频”“显示图片”(也可以直接选择高级中下面的“还原默…

ur机械臂 控制器_OnRobot末端执行器和统一接口已通过UR +计划认证

近日&#xff0c;OnRobot 宣布其One System Solution末端执行器和统一接口现已通过UR 计划认证&#xff0c;UR 计划对夹具等配件进行测试和认证&#xff0c;以便与Universal Robots A / S协作机器人手臂无缝配合使用。OnRobot在9月份发布了全系列的机械手和传感器&#xff0c;具…

xp系统打印机服务器设置,WinXP打印机纸张规格设置的方法

电脑的打印机是我们常常会使用的外部输出设备&#xff0c;虽说经常在用&#xff0c;但是关于它的很多问题还是不会&#xff0c;比如说怎么对打印机纸张规格设置&#xff0c;那么当你遇到这个问题不会的话&#xff0c;那就赶紧看看小编整理的WinXP打印机纸张规格设置的方法吧&am…