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

程序员他爱做梦 2024-02-25 02:50:04
一、插件下载与安装

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

直接注册,登录后点击视频web插件下载即可(这是个web端demo):

下载完后直接安装视频插件(bin目录下的VideoWebPlugin.exe):

二.使用步骤1.引入必要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、设置存放视频盒子:

设置存放视频盒子:<div>

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

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

3、创建播放实例

// 创建播放实例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、初始化海康视频

//初始化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协议,默认443let snapDir = ""; //抓图存储路径let videoDir = "D:\\VideoDir"; //紧急录像或录像剪辑存储路径let layout = "1x1"; //playMode指定模式的布局let enableHTTPS = 1; //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1let encryptedFields = "secret"; //加密字段,默认加密领域为secretlet 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网关提供的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 => {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-TCPlet 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.出现遮挡弹窗的问题:

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

handleHide() {//隐藏视频插件,解决遮挡弹窗问题 if (!!this.oWebControl2) { this.oWebControl2.JS_HideWnd(); }},handleShow() {// 显示视频插件 if (!!this.oWebControl2) { this.oWebControl2.JS_ShowWnd(); }},

2.不会随着盒子宽高变化而变化:

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

mounted() { window.addEventListener("resize", this.handleResize);//开启监听}beforeDestroy(){ window.removeEventListener("resize", this.handleResize);//销毁监听}//方法:handleResize() { this.$nextTick(() => { let width = this.$refs.playWndBox.offsetWidth; let height = this.$refs.playWndBox.offsetHeight; if (!!this.oWebControl2) { this.oWebControl2.JS_Resize(width, height); } });},

3.海康组件不会随着页面切换而销毁:

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

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("销毁窗口失败"); });},

作者:纪风链接:https://juejin.cn/post/7333936808789917708

0 阅读:0

程序员他爱做梦

简介:感谢大家的关注