vue2对接海康视频v1.5.3及遇到的坑

一、插件下载与安装

海康开放平台地址:open.hikvision.com/download/5c...

直接注册,登录后点击视频web插件下载即可(这是个web端demo): 下载完后直接安装视频插件(bin目录下的VideoWebPlugin.exe):

二.使用步骤

1.引入必要js文件

代码:

js 复制代码
<script type="text/javascript" src="static/jquery-1.12.4.min.js"></script>

<script type="text/javascript" src="static/jsencrypt.min.js"></script> <!-- 用于RSA加密 -->

<script type="text/javascript" src="static/web-control_1.2.5.min.js"></script> <!-- 用于前端与插件交互 -->
2.使用

1、设置存放视频盒子:

js 复制代码
设置存放视频盒子:
<div class="cameras" :id="`cameras-${num}`" autoplay></div>

2、挂载过程对海康视频创建播放实例:

javascript 复制代码
mounted() {
  this.$nextTick(() => {
      this.initPlugin();//初始化海康视频
    }
  });
//监听视频盒子宽高变化对更新海康组件宽高
  window.addEventListener("resize", this.handleResize);
},

3、创建播放实例

javascript 复制代码
// 创建播放实例
initPlugin() {
  let that = this;
  let oWebControl = new window.WebControl({
  szPluginContainer: "cameras-" + that.num, // 指定容器id
  iServicePortStart: 15900, // 指定起止端口号,建议使用该值
  iServicePortEnd: 15909,
  szClassId: "23BF3B0A-2C56-4D97-9C03-0CB103AA8F11", // 用于IE10使用ActiveX的clsid
  cbConnectSuccess() {
    oWebControl.JS_StartService("window", {
    // WebControl实例创建成功后需要启动服务
    dllPath: "./VideoPluginConnect.dll" // 值"./VideoPluginConnect.dll"写死
  }).then(() => {
  //启动插件服务成功
    oWebControl.JS_SetWindowControlCallback({
    // 设置消息回调
     cbIntegrationCallBack: that.cbIntegrationCallBack
     });
    oWebControl.JS_CreateWnd(`cameras-${that.num}`).then(() => {
    //JS_CreateWnd创建视频播放窗口,宽高可设定
    that.init(); // 创建播放实例成功后初始化
    });
  },() => {
    // 启动插件服务失败
    console.log("创建播放实例失败!!!");
    }).catch(err => {
    // console.log(err);
    });},
  cbConnectError() {
  // 创建WebControl实例失败
  oWebControl = null;
  $(`#cameras-${that.num}`).html("插件未启动,正在尝试启动,请稍候...");
  window.WebControl.JS_WakeUp("VideoWebPlugin://"); // 程序未启动时执行error函数,采用wakeup来启动程序
  this.initCount++;
  $(`#cameras-${that.num}`).html("插件启动失败,请检查插件是否安装!");
  },
  cbConnectClose(bNormalClose) {
  // 异常断开:bNormalClose = false
  // JS_Disconnect正常断开:bNormalClose = true
  oWebControl = null;
  }
  });
  this.oWebControl2 = oWebControl;
},

4、初始化海康视频

js 复制代码
//初始化

init() {

let that = this;

this.getPubKey(() => {

// 请自行修改以下变量值

let appkey = that.camerasData.cameraAk; //综合安防管理平台提供的appkey,必填

let secret = that.setEncrypt(that.camerasData.cameraSk); //综合安防管理平台提供的secret,必填

let ip = that.camerasData.cameraIp; //综合安防管理平台IP地址,必填

let playMode = 0; //初始播放模式:0-预览,1-回放

let port = parseInt(that.camerasData.cameraPort); //综合安防管理平台端口,若启用HTTPS协议,默认443

let snapDir = ""; //抓图存储路径

let videoDir = "D:\\VideoDir"; //紧急录像或录像剪辑存储路径

let layout = "1x1"; //playMode指定模式的布局

let enableHTTPS = 1; //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1

let encryptedFields = "secret"; //加密字段,默认加密领域为secret

let showToolbar = 1; //是否显示工具栏,0-不显示,非0-显示

let showSmart = 1; //是否显示智能信息(如配置移动侦测后画面上的线框),0-不显示,非0-显示

let buttonIDs =

"0,16,256,257,258,259,260,512,514,515,516,517,768,769"; //自定义工具条按钮

// 请自行修改以上变量值

that.oWebControl2

.JS_RequestInterface({

funcName: "init",

argument: JSON.stringify({

appkey: appkey, //API网关提供的appkey

secret: secret, //API网关提供的secret

ip: 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 => {

let width = document.querySelector(`#cameras-${that.num}`)

.offsetWidth;

let height = document.querySelector(`#cameras-${that.num}`)

.offsetHeight;

that.oWebControl2.JS_Resize(width, height); // 初始化后resize一次,能和盒子大小一致。

that.getVideoFun();

});

});

},

// 设置窗口控制回调

setCallbacks() {

this.oWebControl.JS_SetWindowControlCallback({

cbIntegrationCallBack: this.cbIntegrationCallBack

});

},

// 推送消息

cbIntegrationCallBack(oData) {

//操作抓图录像时可以打印信息

console.log(oData);

},

//获取公钥

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) {

let encrypt = new window.JSEncrypt();

encrypt.setPublicKey(this.pubKey);

return encrypt.encrypt(value);

},

//视频预览功能

getVideoFun(Code) {

//因为我这里有很多监控点编号需要来回切换,所以用参数传递进来

let cameraIndexCode = this.camerasData.cameraIndexCode; //获取输入的监控点编号值,必填

let streamMode = 0; //主子码流标识:0-主码流,1-子码流

let transMode = this.camerasData.transmode; //传输协议:0-UDP,1-TCP

let gpuMode = 1; //是否启用GPU硬解,0-不启用,1-启用

let 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");

});

},
},

三、坑

1.出现遮挡弹窗的问题:

因为海康会一直置顶,会出现遮挡弹窗的问题,解决办法:

js 复制代码
handleHide() {
//隐藏视频插件,解决遮挡弹窗问题
  if (!!this.oWebControl2) {
    this.oWebControl2.JS_HideWnd();
  }
},
handleShow() {
// 显示视频插件
  if (!!this.oWebControl2) {
    this.oWebControl2.JS_ShowWnd();
  }
},
2.不会随着盒子宽高变化而变化:

海康组件宽高只能通过JS_Resize进行设置,我们直接监听盒子宽高变化值对还看插件宽高进行重新赋值。

javascript 复制代码
mounted() {
 window.addEventListener("resize", this.handleResize);//开启监听
}
beforeDestroy(){
  window.removeEventListener("resize", this.handleResize);//销毁监听
}

//方法:
handleResize() {
  let width = this.$refs.playWndBox.offsetWidth;
  let height = this.$refs.playWndBox.offsetHeight;
  if (!!this.oWebControl2) {
    this.oWebControl2.JS_Resize(width, height);
  }
},
3.海康组件不会随着页面切换而销毁:

因为插件所生成的播放窗口不受html控制,所以我们直接在页面销毁前关闭海康视频

javascript 复制代码
beforeDestroy() {
  this.stopVideoFun();//关闭视频
  this.destroyVideoDiv();//销毁视频
  window.removeEventListener("resize", this.handleResize);
},

//停止全部预览
stopVideoFun() {
  this.oWebControl2.JS_RequestInterface({
  funcName: "stopAllPreview"
  });
},

// 销毁播放窗口
destroyVideoDiv() {
  this.oWebControl2.JS_DestroyWnd().then(data => {
    console.log("销毁窗口成功");
  }).catch(err => {
    console.log("销毁窗口失败");
  });
},
相关推荐
吕彬-前端7 分钟前
使用vite+react+ts+Ant Design开发后台管理项目(五)
前端·javascript·react.js
学前端的小朱9 分钟前
Redux的简介及其在React中的应用
前端·javascript·react.js·redux·store
guai_guai_guai19 分钟前
uniapp
前端·javascript·vue.js·uni-app
bysking1 小时前
【前端-组件】定义行分组的表格表单实现-bysking
前端·react.js
王哲晓2 小时前
第三十章 章节练习商品列表组件封装
前端·javascript·vue.js
fg_4112 小时前
无网络安装ionic和运行
前端·npm
理想不理想v2 小时前
‌Vue 3相比Vue 2的主要改进‌?
前端·javascript·vue.js·面试
酷酷的阿云2 小时前
不用ECharts!从0到1徒手撸一个Vue3柱状图
前端·javascript·vue.js
微信:137971205872 小时前
web端手机录音
前端
齐 飞2 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb