Vue 对接海康威视,实现摄像头画面展示

文章目录

    • 需求
    • 分析
      • 1. 下载
      • 2. 安装
      • 3. new 一个WebControl 插件相关实例

需求

项目中集成海康威视,实现摄像头画面展示

分析

1. 下载

传送门:官方插件包和文档下载
在这里插入图片描述

2. 安装

(1)下载完成后打开
在这里插入图片描述
在这里插入图片描述
(2)在项目中public文件下创建一个文件夹放视频插件js
在这里插入图片描述
在这里插入图片描述

3. new 一个WebControl 插件相关实例

  • 案例一
<template><video v-resize="DomResize" :id="newId ? newId : code" autoplay></video>
</template><script>
export default {props: {streamMode: {type: Number,default() {return 0}},code: {type: String,default() {return ''}},newId: {type: String,default() {return ''}},codeList: {type: Array,default() {return []}},layout: {type: String,default() {return '1x1'}},width: {type: Number,default() {return 212}},height: {type: Number,default() {return 120}}},data() {return {initCount: 0,pubKey: '',oWebControl2: '',}},created() {this.$nextTick(() => {this.initPlugin();});},methods: {DomResize(data) {let { width, height } = data;// console.log('width:', width, 'height:', height, '   dom尺寸方式改变');this.init();},initPlugin() {let _that = this;let currentId = _that.newId ? _that.newId : _that.codeconst oWebControl = new window.WebControl({szPluginContainer: currentId, // 指定容器idiServicePortStart: 15900, // 指定起止端口号,建议使用该值iServicePortEnd: 15909,szClassId: '23BF3B0A-2C56-4D97-9C03-0CB103AA8F11', // 用于IE10使用ActiveX的clsidcbConnectSuccess() {console.log('创建WebControl实例成功');oWebControl.JS_StartService('window', {// WebControl实例创建成功后需要启动服务dllPath: './VideoPluginConnect.dll', // 值"./VideoPluginConnect.dll"写死}).then(() => {// // 启动插件服务成功oWebControl.JS_SetWindowControlCallback({// 设置消息回调cbIntegrationCallBack: _that.cbIntegrationCallBack,});oWebControl.JS_CreateWnd(currentId).then(() => {//JS_CreateWnd创建视频播放窗口,宽高可设定_that.init(); // 创建播放实例成功后初始化});},() => {// 启动插件服务失败}).catch((err) => {console.log(err);});},cbConnectError() {// 创建WebControl实例失败console.log('xxx');oWebControl = null;$('#' + currentId).html('插件未启动,正在尝试启动,请稍候...');window.WebControl.JS_WakeUp('VideoWebPlugin://'); // 程序未启动时执行error函数,采用wakeup来启动程序this.initCount++;if (this.initCount < 3) {setTimeout(function() {this.initPlugin();}, 3000);} else {$('#' + currentId).html('插件启动失败,请检查插件是否安装!');}},cbConnectClose(bNormalClose) {// 异常断开:bNormalClose = false// JS_Disconnect正常断开:bNormalClose = trueconsole.log('cbConnectClose');oWebControl = null;},});this.oWebControl2 = oWebControl;},//初始化init() {let _that = this;this.getPubKey(function() {// 请自行修改以下变量值var appkey = "XXXXX"; //综合安防管理平台提供的appkey,必填var secret = _that.setEncrypt("XXXXX"); //综合安防管理平台提供的secret,必填var ip = "XXXXXXX"; //综合安防管理平台IP地址,必填var playMode = 0; //初始播放模式:0-预览,1-回放var port = 443; //综合安防管理平台端口,若启用HTTPS协议,默认443var snapDir = ""; //抓图存储路径var videoDir = ""; //紧急录像或录像剪辑存储路径var layout = _that.layout; //playMode指定模式的布局var enableHTTPS = 1; //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1var encryptedFields = "secret"; //加密字段,默认加密领域为secretvar showToolbar = 0; //是否显示工具栏,0-不显示,非0-显示var showSmart = 0; //是否显示智能信息(如配置移动侦测后画面上的线框),0-不显示,非0-显示var buttonIDs = ""; //自定义工具条按钮// 请自行修改以上变量值_that.oWebControl2.JS_RequestInterface({funcName: "init",argument: JSON.stringify({appkey: appkey, //API网关提供的appkeysecret: secret, //API网关提供的secretip: ip, //API网关IP地址playMode: playMode, //播放模式(决定显示预览还是回放界面)port: port, //端口snapDir: snapDir, //抓图存储路径videoDir: videoDir, //紧急录像或录像剪辑存储路径layout: layout, //布局enableHTTPS: enableHTTPS, //是否启用HTTPS协议encryptedFields: encryptedFields, //加密字段showToolbar: showToolbar, //是否显示工具栏showSmart: showSmart, //是否显示智能信息buttonIDs: buttonIDs, //自定义工具条按钮}),}).then((oData) => {_that.oWebControl2.JS_Resize(_that.width, _that.height); // 初始化后resize一次,能和盒子大小一致。if(_that.codeList.length > 0) {for(let code of _that.codeList) {_that.getVideoFun(code.cameraIndexCode)}}else {_that.getVideoFun(_that.code)}});});},// 设置窗口控制回调setCallbacks() {this.oWebControl.JS_SetWindowControlCallback({cbIntegrationCallBack: this.cbIntegrationCallBack,});},//获取公钥getPubKey(callback) {this.oWebControl2.JS_RequestInterface({funcName: "getRSAPubKey",argument: JSON.stringify({keyLength: 1024,}),}).then((oData) => {if (oData.responseMsg.data) {this.pubKey = oData.responseMsg.data;callback();}});},//RSA加密setEncrypt(value) {var encrypt = new window.JSEncrypt();encrypt.setPublicKey(this.pubKey);return encrypt.encrypt(value);},//视频预览功能getVideoFun(Code) {var cameraIndexCode = Code; //获取输入的监控点编号值,必填var streamMode = this.streamMode; //主子码流标识:0-主码流,1-子码流var transMode = 1; //传输协议:0-UDP,1-TCPvar gpuMode = 0; //是否启用GPU硬解,0-不启用,1-启用var wndId = -1; //播放窗口序号(在2x2以上布局下可指定播放窗口)cameraIndexCode = cameraIndexCode.replace(/(^\s*)/g, "");cameraIndexCode = cameraIndexCode.replace(/(\s*$)/g, "");this.oWebControl2 .JS_RequestInterface({funcName: "startPreview",argument: JSON.stringify({cameraIndexCode: cameraIndexCode, //监控点编号streamMode: streamMode, //主子码流标识transMode: transMode, //传输协议gpuMode: gpuMode, //是否开启GPU硬解wndId: wndId, //可指定播放窗口}),}).then((res) => {// console.log(res, "res");});},// 销毁播放窗口destroyVideoDiv() {this.oWebControl2.JS_DestroyWnd().then((data) => {console.log("销毁窗口成功");}).catch((err) => {console.log("销毁窗口失败");});},hideVideoDiv() {this.oWebControl2.JS_HideWnd()},showVideoDiv() {this.oWebControl2.JS_ShowWnd()}}
}
</script>
  • 案例二:
<template><divv-show="isDisplay1"class="container-1"><div :id="id" class="playWnd" v-text="info" /></div>
</template><script>
export default {name: '',components: {},props: {id: {type: String,default: 'playWnd'}// videoIdList: {//   type: Array,//   default: () => ([])// }},data() {return {oWebControl1: null,pubKey: '',info: '',initCount: 0,parentTitle: '',iframeClientPos: null,iframeParentShowSize: null,width: 0,height: 0,isDisplay1: true // 页面展示}},created() {},mounted() {this.isDisplay1 = trueconst demo = document.querySelector(`#${this.id}`)const dom = demo.getBoundingClientRect()this.width = dom.widththis.height = dom.heightthis.initPlugin()const initParam = {'argument': {'appkey': '25329871','ip': '192.168.20.253','port': 443,'secret': 'ice4tbPdaVk1k9vX3mMK','enableHTTPS': 1,'layout': '1x1','playMode': 0,showSmart: 0, // 是否只能显示信息'wndId': -1,showToolbar: 0 // 是否显示工具栏},'funcName': 'init'}// jianconst list = ['1f11869f492340b2a4911ec140cca712']setTimeout(() => {// console.log($(".container").height())this.requestInterface(initParam)// this.oWebControl1.JS_Resize($(".container").width(), $(".container").height());this.oWebControl1.JS_Resize(this.width, this.height)//for (let i = 0; i < list.length; i++) {const playParam = {'argument': {'cameraIndexCode': list[i],'ezvizDirect': 0,'gpuMode': 0,'streamMode': 0,'transMode': 1,'wndId': -1},'funcName': 'startPreview'}setTimeout(() => {this.requestInterface(playParam)}, 100)}}, 500)window.onload = () => {// requestInterface(initParam)// requestInterface( playParam)}const _this = thislet resizeWaiter = falsewindow.addEventListener('resize', function() {const demo = document.querySelector(`#${_this.id}`)const dom = demo.getBoundingClientRect()_this.width = dom.width_this.height = dom.heightconsole.log(_this.width, _this.height)if (!resizeWaiter) {resizeWaiter = truesetTimeout(function() {if (resizeWaiter) _this.oWebControl1.JS_Resize(_this.width, _this.height)resizeWaiter = false}, 100)}})// let   resizeWaiter//   if(!resizeWaiter){//       resizeWaiter = true;//       setTimeout(()=>{//           if(  resizeWaiter)        this.oWebControl1.JS_Resize(500,300);//           resizeWaiter = false;//       }, 100);//   }},destroyed() {this.destroyWnd()// this.oWebControl1 = null},beforeDestroy() {if (this.oWebControl1) {this.oWebControl1.JS_HideWnd()// 隐藏窗口// 断开链接this.oWebControl1.JS_Disconnect().then(function() {console.log('断开与插件服务链接 sucess')},function() {console.log('断开与插件服务链接 fail')})// 销毁this.oWebControl1.JS_DestroyWnd().then(function() {console.log('销毁插件 sucess')},function() {console.log('销毁插件 fail')})// this.oWebControl1 = null}this.isDisplay1 = false},methods: {destroyWnd(cb) {if (this.oWebControl1) {this.oWebControl1.JS_HideWnd()this.oWebControl1.JS_DestroyWnd({funcName: 'destroyeWnd'}).then(function(oData) {})} else {console.log('没有实例')}cb && cb()},initPlugin() {const _this = thisthis.oWebControl1 = new WebControl({szPluginContainer: _this.id,iServicePortStart: 15900,iServicePortEnd: 15900,szClassId: '23BF3B0A-2C56-4D97-9C03-0CB103AA8F11', // 用于IE10使用ActiveX的clsidcbConnectSuccess: function() {_this.initCount = 0_this.setCallbacks()_this.oWebControl1.JS_StartService('window', {dllPath: './VideoPluginConnect.dll'}).then(function() {// 步骤2:JS_CreateWnd时指定cbSetDocTitle回调,并在回调中向父页面发送更新标题消息,标题为回调出来的uuid_this.oWebControl1.JS_CreateWnd(_this.id, _this.width, _this.height, {bEmbed: true,cbSetDocTitle: function(uuid) {_this.oWebControl1._pendBg = falsewindow.parent.postMessage({action: 'updateTitle',msg: '子页面通知父页面修改title',info: uuid}, '\*') // '\*'表示跨域参数,请结合自身业务合理设置}}).then(function() {// 步骤3:JS_CreateWnd成功后通知父页面将其标题修改回去console.log('JS_CreateWnd success')window.parent.postMessage({action: 'updateTitle',msg: '子页面通知父页面更新title',info: _this.parentTitle}, '\*')// 步骤4:发消息更新插件窗口位置:这里不直接更新的原因是,父页面默认可能就存在滚动条,此时有滚动量window.parent.postMessage({action: 'updatePos',msg: '更新Pos'}, '\*')})}, function() {console.log('JS_CreateWnd fail')})},cbConnectError: function() {console.log('cbConnectError')_this.oWebControl1 = null_this.info = `插件未启动,正在尝试第${_this.initCount + 1}次启动,请稍候...`// $("#playWnd").html(`插件未启动,正在尝试第${this.initCount+1}次启动,请稍候...`);// WebControl.JS_WakeUp('VideoWebPlugin://')_this.initCount++if (_this.initCount < 3) {setTimeout(function() {_this.initPlugin()}, 3000)} else {// $("#playWnd").html("插件启动失败,请检查插件是否安装!");// window.parent.postMessage('err','*');_this.info = '未安装插件,请点击左侧下载插件!'_this.$emit('videoWebPluginMessage')}},cbConnectClose: function(bNormalClose) {// 异常断开:bNormalClose = false// JS_Disconnect正常断开:bNormalClose = trueif (bNormalClose == true) {console.log('cbConnectClose normal')} else {console.log('cbConnectClose exception')}_this.oWebControl1 = null_this.info = `插件未启动,正在尝试第${_this.initCount + 1}次启动,请稍候...`// $("#playWnd").html(`插件未启动,正在尝试第${this.initCount+1}次启动,请稍候...`);// WebControl.JS_WakeUp('VideoWebPlugin://')_this.initCount++if (_this.initCount < 3) {setTimeout(function() {// 解决白块问题暂时注释掉// _this.initPlugin()}, 3000)} else {// $("#playWnd").html("插件启动失败,请检查插件是否安装!");// $("#playWnd").html("插件启动失败,请检查插件是否安装!");// window.parent.postMessage('err','*');_this.info = '未安装插件,请点击左侧下载插件!'_this.$emit('videoWebPluginMessage')}}})},getPubKey(callback) {this.oWebControl1.JS_RequestInterface({funcName: 'getRSAPubKey',argument: JSON.stringify({keyLength: 1024})}).then(function(oData) {console.log(oData)if (oData.responseMsg.data) {this.pubKey = oData.responseMsg.datacallback()}})},setCallbacks() {this.oWebControl1.JS_SetWindowControlCallback({cbIntegrationCallBack: this.cbIntegrationCallBack})},cbIntegrationCallBack(oData) {this.showCBInfo(JSON.stringify(oData.responseMsg))},requestInterface(value) {this.oWebControl1.JS_RequestInterface(typeof value === 'string' ? JSON.parse(value) : value).then((oData) => {this.showCBInfo(JSON.stringify(oData ? oData.responseMsg : ''))})},showCBInfo(szInfo, type) {if (type === 'error') {szInfo = "<div style='color: red;'>" + this.dateFormat(new Date(), 'yyyy-MM-dd hh:mm:ss') + ' ' + szInfo + '</div>'} else {szInfo = '<div>' + this.dateFormat(new Date(), 'yyyy-MM-dd hh:mm:ss') + ' ' + szInfo + '</div>'}// $("#cbInfo").html(szInfo + $("#cbInfo").html());},dateFormat(oDate, fmt) {var o = {'M+': oDate.getMonth() + 1, // 月份'd+': oDate.getDate(), // 日'h+': oDate.getHours(), // 小时'm+': oDate.getMinutes(), // 分's+': oDate.getSeconds(), // 秒'q+': Math.floor((oDate.getMonth() + 3) / 3), // 季度'S': oDate.getMilliseconds()// 毫秒}if (/(y+)/.test(fmt)) {fmt = fmt.replace(RegExp.$1, (oDate.getFullYear() + '').substr(4 - RegExp.$1.length))}for (var k in o) {if (new RegExp('(' + k + ')').test(fmt)) {fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))}}return fmt}}}
</script><style lang="scss" >
.container-1 {position: relative;// margin-left: -20px;width: 100%;height: 100%;background: transparent;.playWnd {position: absolute;bottom: 5px;height: 95%;width: 95%;background: transparent;}
}
</style>

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

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

相关文章

30_Swin-Transformer网络结构详解

1.1 简介 Swin Transformer 是一种用于计算机视觉任务的新型深度学习架构&#xff0c;由微软亚洲研究院于2021年提出。它结合了Transformer模型在序列数据处理上的强大能力与卷积神经网络&#xff08;CNN&#xff09;在图像识别中的高效局部特征提取优势&#xff0c;特别适用于…

《数据结构》预备

在学习数据结构之前&#xff0c;需要预先准备学习的C语言知识是&#xff1a;自定义类型--结构体类型。 本节主要讲的内容有&#xff1a; 1.结构体类型的声明 2.结构体变量的创建和初始化 3.结构成员的访问操作符 4.结构体传参 5.结构体内存对齐 6.结构体实现位段(位域) 正文开…

verilog实现ram16*8 (vivado)

module ram_16x2 (input clk, // 时钟信号input we, // 写使能input en, // 使能信号input [3:0] addr, // 地址线input [1:0] datain, // 输入数据线output reg [1:0] dataout // 输出数据线 );// 定义存储器数组reg [1:0] mem [15:0];always (posedge…

影响转化率的多元因素分析及定制开发AI智能名片S2B2C商城系统小程序的应用案例

摘要&#xff1a;在互联网时代&#xff0c;转化率是衡量营销活动成功与否的关键指标。本文首先分析了影响转化率的多种因素&#xff0c;包括活动页面的设计、活动的限时性、主题文案的吸引力、从众心理的运用&#xff0c;以及最核心的产品质量与优惠力度。接着&#xff0c;本文…

Linux 13:网络编程1

1. 预备知识 1-1. 理解源IP地址和目的IP地址 在IP数据包头部中&#xff0c;有两个IP地址&#xff0c;分别叫做源IP地址&#xff0c;和目的IP地址。 我们光有IP地址就可以完成通信了嘛&#xff1f;想象一下发qq消息的例子&#xff0c;有了IP地址能够把消息发送到对方的…

【周记】2024暑期集训第一周

例题记录 Together 题目解析 输入n个数&#xff0c;你可以将这些数分别1&#xff0c;-1或者保持不变&#xff0c;尽可能多的将这些数变成同一个数x&#xff0c;输出x的个数。 算法思路 每个数都有3种情况&#xff0c;那么只需要将所有情况得到的数&#xff0c;每一个的个数…

【Qt】常用控件 Q widget的enabled属性,geometry属性

Qt是一个实现图形化程序的程序。为了便于我们开发&#xff0c;Qt为我们提供了许多“控件”。我们需要熟悉并掌握这些控件的使用。 一.什么是控件 控件是构成⼀个图形化界⾯的基本要素. 示例一&#xff1a; 像上述⽰例一中的,按钮,列表视图,树形视图,单⾏输⼊框,多⾏输⼊框,滚动…

Web开发:图片九宫格与非九宫格动态切换效果(HTML、CSS、JavaScript)

目录 一、业务需求 二、实现思路 三、实现过程 1、基础页面 2、图片大小调整 3、图片位置调整 4、鼠标控制切换 5、添加过渡 四、完整代码 一、业务需求 默认显示基础图片&#xff1b; 当鼠标移入&#xff0c;使用九宫格效果展示图片&#xff1b; 当鼠标离开&#…

SpringCloud—08—高级之SpringCloud Alibaba中—Sentinel

文章目录 提前预知18、Sentinel是什么&#xff1f;18.1、sentinel是什么&#xff1f;18.2、Sentinel下载安装运行18.3、Sentinel初始化监控18.4、Sentinel流控规则1、流控规则基本介绍2、流控规则之-QPS-直接-快速失败3、流控规则之-线程数-直接失败4、流控规则之-QPS-关联-快速…

做可视化项目如何才能让前端开发和UI设计和谐相处呢?仅供参考

做可视化项目如何才能让前端开发和 UI 设计和谐相处呢&#xff1f; 在当今数字化的时代&#xff0c;可视化项目在各个领域都变得越来越重要。无论是构建一个精美的网站、开发一款实用的移动应用&#xff0c;还是设计一套复杂的数据可视化系统&#xff0c;前端开发和 UI 设计都…

c++信号和槽机制的轻量级实现,sigslot 库介绍及使用

Qt中的信号与槽机制很好用&#xff0c;然而只在Qt环境中。在现代 C 编程中&#xff0c;对象间的通信是一个核心问题。为了解决这个问题&#xff0c;许多库提供了信号和槽&#xff08;Signals and Slots&#xff09;机制。今天推荐分享一个轻量级的实现&#xff1a;sigslot 库。…

【UE5.1】NPC人工智能——04 NPC巡逻

效果 步骤 一、准备行为树和黑板 1. 对我们之前创建的AI控制器创建一个子蓝图类 这里命名为“BP_NPC_AIController_Lion”&#xff0c;表示专门用于控制狮子的AI控制器 2. 打开狮子蓝图“Character_Lion” 在类默认值中将“AI控制器类”修改为“BP_NPC_AIController_Lion” 3…

web的运行

目录 1. web基础知识 1. http协议 2. 网络的三种架构及特点 1.客户机/服务器结构&#xff08;C/S&#xff09; 2. 浏览器/服务器结构&#xff08;B/S&#xff09; 3. P2P结构 3. 网站搭建 1. 服务器 2.中间件 4. 网站的运行原理 1. 网站的常用术语 1. 基本术语 2. …

《JavaSE》---16.<抽象类接口Object类>

目录 前言 一、抽象类 1.1什么是抽象类 1.2抽象类代码实现 1.3 抽象类特点 1.4抽象类的作用 二、接口 2.1什么是接口 2.2接口的代码书写 2.3 接口使用 2.4 接口特点 2.5 实现多个接口 快捷键&#xff08;ctrl i &#xff09;&#xff1a; 2.6接口的好处 2.7 接…

windows常用命令整理

本文分享一些常用的windows命令。根据功能的不同&#xff0c;大致可分为以下几个方面&#xff0c;一是文件操作命令&#xff0c;二是进程相关命令&#xff0c;三是磁盘相关命令&#xff0c;四是网络相关命令&#xff0c;五是其他命令。 1.文件操作命令 dir&#xff1a;显示当…

如何搭建一个RADIUS服务器?

1. 系统环境 1.1.操作系统 Ubuntu-20.04.1 &#xff08;kernel: 5.15.0-58-generic&#xff09; 1.2.所需软件 FreeRADIUS MariaDB 1.3.注意事项 本文提到的所有操作&#xff0c;都是以root 身份执行&#xff1b; 2. FreeRADIUS的安装 2.1. 安装FreeRADIUS服务器程序 以…

数据预处理在建模中的重要性与常见方法(三):特征工程篇

数据预处理在建模中的重要性与常见方法&#xff08;三&#xff09;&#xff1a;特征工程篇 特征工程是数据预处理中至关重要的一步&#xff0c;通过构建、转换和选择最能代表数据特性的特征&#xff0c;以提高模型的性能和准确性。常见的特征工程方法包括特征选择、特征提取和特…

零基础入门鸿蒙开发 HarmonyOS NEXT星河版开发学习

今天开始带大家零基础入门鸿蒙开发&#xff0c;也就是你没有任何编程基础的情况下就可以跟着石头哥零基础学习鸿蒙开发。 目录 一&#xff0c;为什么要学习鸿蒙 1-1&#xff0c;鸿蒙介绍 1-2&#xff0c;为什么要学习鸿蒙 1-3&#xff0c;鸿蒙各个版本介绍 1-4&#xff0…

P4-AI产品经理-九五小庞

从0开始做AI产品的完整工作方法 项目启动 项目实施 样本测试模型推荐引擎 构建DMP&#xff08;数据管理平台&#xff09; 项目上线