海康视频插件VideoWebPlugin在vue中的实现

一,将js文件放在public文件下

二,在index中全局引入 

 三.在视频页面写方法,创建实例,初始化,我写的是1*4屏的

<template><!--视频窗口展示--><div id='playWnd' className='playWnd' ref='playWnd' style='left: 0; bottom: 0;height: 902px;width: 60vw'></div></template><script>
export default {name: 'myVideo',data() {return {playWndHeights: 193,  //193playWndWidths: '',  //902initCount: 0,   //声明公用变量pubKey: '',oWebControl: null,cameraIndexCodes: "0258c498f9fe49e1938f33eb21ecee3d",layout: "1x4",isFull:false,  //是否全屏currentVideoList:[],}},created() {},beforeDestroy() {if (this.oWebControl != null) {// 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题this.oWebControl.JS_HideWnd()// 销毁当前播放的视频this.oWebControl.JS_RequestInterface({ funcName: "destroyWnd" })// 断开与插件服务连接this.oWebControl.JS_Disconnect()}},mounted() {let that = this// 初始化摄像头this.$nextTick(() => {// 首次加载时的到父容器的宽度this.playWndWidths = window.innerWidth * 0.589})// 监听resize事件,使插件窗口尺寸跟随DIV窗口变化window.addEventListener('resize', () => {if (this.oWebControl != null) {this.oWebControl.JS_Resize(that.playWndWidths,that.playWndHeights)}})},methods: {//父组件调用的方法,传入摄像头编码数组goplay(videoList){let that = thisthis.currentVideoList = videoListthis.visible = truethis.$nextTick(() => {if(this.oWebControl == null){that.initPlugin()}else{that.startPreview(that.currentVideoList)}})},// 创建播放实例initPlugin() {let that = thisthat.oWebControl = new window.WebControl({szPluginContainer: "playWnd",                       // 指定容器idiServicePortStart: 15900,                           // 指定起止端口号,建议使用该值iServicePortEnd: 15900,szClassId: "23BF3B0A-2C56-4D97-9C03-0CB103AA8F11",   // 用于IE10使用ActiveX的clsidcbConnectSuccess: function() {                     // 创建WebControl实例成功that.oWebControl.JS_StartService("window", {         // WebControl实例创建成功后需要启动服务dllPath: "./VideoPluginConnect.dll"         // 值"./VideoPluginConnect.dll"写死}).then(function() {                           // 启动插件服务成功that.oWebControl.JS_SetWindowControlCallback({   // 设置消息回调cbIntegrationCallBack: function(oData) { // oData 是封装的视频 web 插件回调消息的消息体console.log(oData.responseMsg, "消息回调----------------------"); // 打印消息体至控制台// that.hanbleCcallBack(oData)that.hanbleCcallBack2(oData.responseMsg)}});that.oWebControl.JS_CreateWnd("playWnd", that.playWndWidths, that.playWndHeights).then(function() { //JS_CreateWnd创建视频播放窗口,宽高可设定that.init();  // 创建播放实例成功后初始化});}, function() { // 启动插件服务失败});},cbConnectError: function() { // 创建WebControl实例失败that.oWebControl = null;// $("#playWnd").html("插件未启动,正在尝试启动,请稍候...");that.$refs.playWnd.innerHtml("插件未启动,正在尝试启动,请稍候...");// WebControl.JS_WakeUp("VideoWebPlugin://"); // 程序未启动时执行error函数,采用wakeup来启动程序that.initCount++;if (that.initCount < 3) {setTimeout(function() {that.initPlugin();}, 3000)} else {// $("#playWnd").html("插件启动失败,请检查插件是否安装!");that.$refs.playWnd.innerHtml("插件启动失败,请检查插件是否安装!");}},cbConnectClose: function(bNormalClose) {// 异常断开:bNormalClose = false// JS_Disconnect正常断开:bNormalClose = trueconsole.log("cbConnectClose", "错误");that.oWebControl = null;//$("#playWnd").html("插件未启动,正在尝试启动,请稍候...");//  that.$refs.playWnd.innerHtml("插件未启动,正在尝试启动,请稍候...");// that.$message.info("插件未启动,正在尝试启动,请稍候...")//  WebControl.JS_WakeUp("VideoWebPlugin://");that.initCount++;if (that.initCount < 3) {setTimeout(function() {that.initPlugin();}, 3000)} else {//$("#playWnd").html("插件启动失败,请检查插件是否安装!");//  that.$refs.playWnd.innerHtml("插件启动失败,请检查插件是否安装!");that.$message.info("插件未安装,请下载后安装!")that.frontDownload()}}});},//处理操作视频回调函数hanbleCcallBack(oData){let that = thisif (oData.responseMsg.type == 7) {//播放窗口双击事件if(that.isFull == false){that.clickFullScreen() //显示全屏}else{that.clickESCFullScreen() //退出全屏}}if (oData.responseMsg.type == 5) {//进入全屏,退出全屏if(oData.responseMsg.msg.result == 1024){//进入全屏that.isFull = true}if(oData.responseMsg.msg.result == 1025){//退出全屏that.isFull = false}}},hanbleCcallBack2(oData){let that = thisif (oData.type == 7) {// this.oWebControl.JS_HideWnd();   // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题that.handleLayout2()that.$emit('showSingeVideo',oData.msg.cameraIndexCode)}},// 下载视频插件frontDownload() {var a = document.createElement('a') // 创建一个<a></a>标签a.href = '//' + window._CONFIG['onlinePreviewDomainURL'] + '/drcp/file/VideoWebPlugin.exe' // 给a标签的href属性值加上地址,注意,这里是绝对路径,不用加 点.a.download = 'VideoWebPlugin.exe' // 设置下载文件文件名,这里加上.xlsx指定文件类型,pdf文件就指定.fpd即可a.style.display = 'none' // 障眼法藏起来a标签document.body.appendChild(a) // 将a标签追加到文档对象中a.click() // 模拟点击了a标签,会触发a标签的href的读取,浏览器就会自动下载了a.remove() // 一次性的,用完就删除a标签},//视频预览功能startPreview(data) {let that = thisconsole.log(that.cameraIndexCodes)var cameraIndexCode = that.cameraIndexCodes;     //获取输入的监控点编号值,必填var streamMode = 0;                                     //主子码流标识:0-主码流,1-子码流var transMode = 1;                                      //传输协议:0-UDP,1-TCPvar gpuMode = 0;                                        //是否启用GPU硬解,0-不启用,1-启用var wndId = -1;                                         //播放窗口序号(在2x2以上布局下可指定播放窗口)cameraIndexCode = cameraIndexCode.replace(/(^\s*)/g, "");that.stopAllPreview()setTimeout(() => {let cameraIndexCode1 = ''let cameraIndexCode2 = ''let cameraIndexCode3 = ''let cameraIndexCode4 = ''let listArr = []console.log(data)for (let i = 0; i < data.length; i++) {if (i == 0) {cameraIndexCode1 = data[i].indexCodelet obj = {cameraIndexCode: cameraIndexCode1,                //监控点编号streamMode: streamMode,                         //主子码流标识transMode: transMode,                           //传输协议gpuMode: gpuMode,                               //是否开启GPU硬解wndId: 1                                    //可指定播放窗口}listArr.push(obj)} else if (i == 1) {cameraIndexCode2 = data[i].indexCodelet obj = {cameraIndexCode: cameraIndexCode2,                //监控点编号streamMode: streamMode,                         //主子码流标识transMode: transMode,                           //传输协议gpuMode: gpuMode,                               //是否开启GPU硬解wndId: 2                                   //可指定播放窗口}listArr.push(obj)} else if (i == 2) {cameraIndexCode3 = data[i].indexCodelet obj = {cameraIndexCode: cameraIndexCode3,                //监控点编号streamMode: streamMode,                         //主子码流标识transMode: transMode,                           //传输协议gpuMode: gpuMode,                               //是否开启GPU硬解wndId: 3                                    //可指定播放窗口}listArr.push(obj)} else if (i == 3) {cameraIndexCode4 = data[i].indexCodelet obj = {cameraIndexCode: cameraIndexCode4,                //监控点编号streamMode: streamMode,                         //主子码流标识transMode: transMode,                           //传输协议gpuMode: gpuMode,                               //是否开启GPU硬解wndId: 4                                    //可指定播放窗口}listArr.push(obj)}}that.oWebControl.JS_RequestInterface({funcName: "startMultiPreviewByCameraIndexCode",argument: {list: listArr,}}).then(function(oData) {that.oWebControl.JS_Resize(that.playWndWidths, that.playWndHeights);  // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题}).catch(err => {console.log(err)});}, 2000)},
// 设置窗口控制回调setCallbacks() {let that = thisthat.oWebControl.JS_SetWindowControlCallback({cbIntegrationCallBack: that.cbIntegrationCallBack});},// 推送消息cbIntegrationCallBack(oData) {// showCBInfo(JSON.stringify(oData.responseMsg));},//初始化init() {let that = thisthat.getPubKey(function() {console.log(window._CONFIG['videoUrl'])// 请自行修改以下变量值	var appkey = "25939704";                           //综合安防管理平台提供的appkey,必填var secret = that.setEncrypt("5y3JpM3odznu6Jx5b8Hp");   //综合安防管理平台提供的secret,必填var ip = 127.0.0.1;                           //综合安防管理平台IP地址,必填var playMode = 0;                                  //初始播放模式:0-预览,1-回放var port = 443;                                    //综合安防管理平台端口,若启用HTTPS协议,默认443var snapDir = "D:\\SnapDir";                       //抓图存储路径var videoDir = "D:\\VideoDir";                     //紧急录像或录像剪辑存储路径var layout = "1x4";                                //playMode指定模式的布局var enableHTTPS = 1;                               //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1var encryptedFields = 'secret';					   //加密字段,默认加密领域为secretvar showToolbar = 0;                               //是否显示工具栏,0-不显示,非0-显示var showSmart = 1;                                 //是否显示智能信息(如配置移动侦测后画面上的线框),0-不显示,非0-显示var buttonIDs = "0,16,256,257,258";  //自定义工具条按钮// 请自行修改以上变量值	that.oWebControl.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: that.layout,                            //布局enableHTTPS: enableHTTPS,                  //是否启用HTTPS协议encryptedFields: encryptedFields,          //加密字段showToolbar: showToolbar,                  //是否显示工具栏showSmart: showSmart,                      //是否显示智能信息buttonIDs: buttonIDs,})}).then(function(oData) {that.oWebControl.JS_Resize(that.playWndWidths, that.playWndHeights);  // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题that.startPreview(that.currentVideoList)});});},//获取公钥getPubKey(callback) {let that = thisthat.oWebControl.JS_RequestInterface({funcName: "getRSAPubKey",argument: JSON.stringify({keyLength: 1024})}).then(function(oData) {console.log(oData);if (oData.responseMsg.data) {that.pubKey = oData.responseMsg.data;callback()}})},//RSA加密setEncrypt(value) {let that = thisvar encrypt = new JSEncrypt();encrypt.setPublicKey(that.pubKey);return encrypt.encrypt(value);},//停止全部预览stopAllPreview() {this.oWebControl.JS_RequestInterface({funcName: "stopAllPreview"}).catch(err => {console.log(err)})},// 全屏clickFullScreen() {this.oWebControl.JS_RequestInterface({funcName: "setFullScreen"}).catch(err => {console.log(err)})},//退出全屏clickESCFullScreen(){this.oWebControl.JS_RequestInterface({funcName: "exitFullScreen"}).catch(err => {console.log(err)})},handleLayout2() {let that = thisthis.oWebControl.JS_RequestInterface({funcName: "setLayout",argument: JSON.stringify({layout: "1x4"})}).catch(err => {console.log(err)})},// 标签关闭close() {if (this.oWebControl != null) {this.oWebControl.JS_HideWnd();   // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题this.oWebControl.JS_Disconnect().then(function() {  // 断开与插件服务连接成功},function() {  // 断开与插件服务连接失败});}},}
}
</script><style lang='less' scoped>
.playWnd {position: absolute;left: 0;top: 0;z-index: 10000;
}.operate {margin-top: 24px;
}.operate::after {content: '';display: block;clear: both;
}.module {float: left;width: 340px;/*min-height: 320px;*/margin-left: 16px;padding: 16px 8px;box-sizing: border-box;border: 1px solid #e5e5e5;
}.module .item {margin-bottom: 4px;
}.module input[type="text"] {box-sizing: border-box;display: inline-block;vertical-align: middle;margin-left: 0;width: 150px;min-height: 20px;
}.module .btn {min-width: 80px;min-height: 24px;margin-top: 100px;margin-left: 80px;
}</style>

使用插件时走过的弯路,总结:

1.注意事件调用的顺序,创建实例时,要有dom,实例创建成功后再调用预览视频方法.

2.将ip改成配置文件

3.页面销毁时记得隐藏视频,断开连接

4.下载插件时遇到跨域问题,解决方案,地址前加//

a.href = '//' + window._CONFIG['onlinePreviewDomainURL'] + '/drcp/file/VideoWebPlugin.exe' 

5.下面这行代码,会使浏览器一直弹询问窗口

WebControl.JS_WakeUp("VideoWebPlugin://"); // 程序未启动时执行error函数,采用wakeup来启动程序

6.没有双击禁止全屏事件,为了能有双击放大效果,自己获取双击事件重写的.

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

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

相关文章

Eureka 学习笔记2:EurekaClient

版本 awsVersion ‘1.11.277’ EurekaClient 接口实现了 LookupService 接口&#xff0c;拥有唯一的实现类 DiscoveryClient 类。 LookupService 接口提供以下功能&#xff1a; 获取注册表根据应用名称获取应用根据实例 id 获取实例信息 public interface LookupService<…

HTTP杂谈之Referer和Origin请求头再探

一 关于Referer和Origin的汇总 1) 知识是凌乱的,各位看官看个热闹即可2) 内容不断更新1、理解有盲区,需要及时纠正2、内容交叉有重复,需要适当删减3、扩展视野3) 以下内容都与Referer和Origin请求头有关联 nginx防盗链 HTTP杂谈之Referrer-Policy响应头 iframe标签referre…

物联网|可变参数的使用技巧|不一样的点灯实验|访问外设的寄存器|操作寄存器实现点灯|硬件编程的基本流程-学习笔记(11)

文章目录 可变参数的使用技巧第三阶段-初级实验Lesson5:不一样的点灯实验---学习I/O的输出 ☆点灯的电路图分析1 一起看看点灯的电路图Tip1:另一种点灯的电路Tip1:如何访问外设的寄存器2 STM32F407中操作GPIO的方法 通过直接操作寄存器实现点灯实验Tip1:硬件编程的基本流程 2代…

HTML5+CSS3小实例:带标题的3D多米诺人物卡片

实例:带标题的3D多米诺人物卡片 技术栈:HTML+CSS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content…

【信号去噪】基于马氏距离和EDF统计(IEE-TSP)的基于小波的多元信号去噪方法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Linux 终端生成二维码

1、安装qrencode [rootnode1 script]# yum -y install qrencode2、输出正常的 [rootnode1 aihuidi]# echo https://blog.csdn.net/weixin_43822878?t1|qrencode -o - -t utf83、输出彩色的 [rootnode1 aihuidi]# qrencode -t utf8 -s 1 https://blog.csdn.net/weixin_4382…

魔法上网端口号被占用通过端口号找到进程并且杀掉进程随笔

Windows11系统由于魔法上网被异常关闭导致再次启动的时候报出端口号被占用问题记录以前忘记的通过端口杀掉进程相关操作。 在命令行&#xff08;winr,输入cmd&#xff09;中输入: netstat -ano 可以看到本机正在使用的ip地址和端口号如图&#xff1a; 在命令行&#xff08;wi…

算法题--找规律(构建乘积数组、剪绳子、圆圈中最后剩下的数字)

目录 找规律 构建乘积数组 原题链接 解析 核心思想 答案 剪绳子 原题链接 解析 核心思想 答案 圆圈中最后剩下的数字 原题链接 解析 核心思想 答案 找规律 需要通过列举多个示例&#xff0c;从多个示例的输入到输出中得到规律去普遍化。 构建乘积数组 给定…

【娱乐圈明星知识图谱2】信息抽取

目录 1. 项目介绍 2. 信息抽取介绍 3. ChatGPT 信息抽取代码实战 4. 信息抽取主逻辑 5. 项目源码 1. 项目介绍 利用爬虫项目中爬取的大量信息 【娱乐圈明星知识图谱1】百科爬虫_Encarta1993的博客-CSDN博客娱乐圈明星知识图谱百度百科爬虫百度百科爬虫百度百科爬虫百度百…

redisson分布式锁学习

什么是分布式锁? 当有多个线程并发访问同一共享数据时,如果多个线程同时都去修改这个共享数据,且修改操作不是原子操作,就很有可能出现线程安全问题&#xff0c;而产生线程安全问题的根本原因是缺乏对共享数据访问的同步和互斥。 为了解决这个问题&#xff0c;通常我们的做法…

【Golang 接口自动化07】struct转map的三种方式

目录 背景 struct转map 使用json模块 使用reflect模块 使用第三方库 测试 总结 资料获取方法 背景 我们在前面介绍过怎么使用net/http发送json或者map数据&#xff0c;那么它能不能直接发送结构体数据呢&#xff1f;我们今天一起来学习结构体struct转map的三种方法&am…

PHM的设备故障模型如何构建?

预测性维护与健康管理&#xff08;Prognostics Health Management&#xff0c;PHM&#xff09;是现代工业中的一个关键概念&#xff0c;它旨在通过使用数据和先进的分析技术&#xff0c;实现设备故障的早期预测和预防&#xff0c;从而最大限度地提高设备的可用性和可靠性。而在…

如何运行疑难解答程序来查找和修复Windows 10中的常见问题

如果Windows 10中出现问题&#xff0c;运行疑难解答可能会有所帮助。疑难解答人员可以为你找到并解决许多常见问题。 一、在控制面板中运行疑难解答 1、打开控制面板&#xff08;图标视图&#xff09;&#xff0c;然后单击“疑难解答”图标。 2、单击“疑难解答”中左上角的…

大牛练成记:用JavaScript徒手写出一个日期选择插件

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;100个JavaScript的小应用。 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收…

【C语言】初识指针

【C语言】初识指针 一、指针是什么&#xff1f;二、指针和指针类型1. 指针-整数2. 指针的解引用三、野指针1.野指针成因2 .如何规避野指针四、指针运算五、二级指针七、指针数组 &#x1f388;个人主页&#xff1a;库库的里昂&#x1f390;CSDN新晋作者&#x1f389;欢迎 &…

ansible安装及rhel8仓库配置

目录 一、本地仓库 问题&#xff1a; 解决&#xff1a; 1.创建一个仓库&#xff1a; 内容&#xff1a; 2.挂载&#xff1a; 挂载&#xff1a; 测试&#xff1a; 3.或者直接使用阿里云的源 二.配置ansible仓库 1.下载&#xff1a; 2.检查 一、本地仓库 问题&#xff1a; 当…

vue3+uniapp自定义tabbar

首先把tabbar中的元素写在一个list中用v-for进行渲染 用一个interface进行定义接口&#xff0c;这样别人在review你的代码就可以清晰知道你的tabbar包含什么元素。 利用typescript特性进行类型定义&#xff0c;可以省去很多麻烦 import { reactive } from "vue" imp…

docker快速入门

文章目录 简介&#xff1a;组成&#xff1a;安装&#xff1a;运行&#xff1a;原理&#xff1a;常用命令&#xff1a;1.帮助启动类命令2.镜像命令3.容器命令4.命令交互图5.将镜像打包发布到阿里云1.将本地容器制作为镜像2.登录阿里云3.创建个人实例4.创建镜像仓库5.将镜像推送到…

马上解锁 StarRocks 存算分离,降本增效无需等!

StarRocks 于 4 月底正式发布了 3.0 版本&#xff0c;该里程碑版本带来了大家期盼已久的新特性--存算分离。此新功能一推出&#xff0c;立即受到社区热情追捧&#xff0c;用户纷纷开始在自己的业务中评估和测试存算分离效果。从芒果TV、聚水潭、网易邮箱、浪潮、天道金科等数十…

桥接模式——处理多维度变化

1、简介 1.1、概述 桥接模式是一种很实用的结构型设计模式。如果软件系统中某个类存在两个独立变化的维度&#xff0c;通过该模式可以将这两个维度分离出来&#xff0c;使两者可以独立扩展&#xff0c;让系统更加符合单一职责原则。与多层继承方案不同&#xff0c;它将两个独…