<template> <div class="hik-video" id="hikVideo" :style="{width:option.width + 'px',height:option.height + 'px'}"> </div></template><script>// 参数示例:// option:{// appkey:"23464284",// secret:"EyTl3nQ3OvlYqkheTRXa",// ip:"10.254.10.10",// port:"80",// width:960,// height:540// },// camera:"f2d62cd79ca14929a019d7eb1bb9375e",export default { props: { option: Object, camera: { type: String, default: "" } }, data() { return { oWebControl: null, bIE: (!!window.ActiveXObject || 'ActiveXObject' in window), pubKey: "", iLastCoverLeft: 0, iLastCoverTop: 0, iLastCoverRight: 0, iLastCoverBottom: 0, initCount: 0, videoFlag: false, } }, methods: { getPubKey(callback) { this.oWebControl.JS_RequestInterface({ funcName: "getRSAPubKey", argument: JSON.stringify({ keyLength: 1024 }) }).then(oData => { if (oData.responseMsg.data) { this.pubKey = oData.responseMsg.data callback() } }) }, initPlugin() { this.oWebControl = new WebControl({ szPluginContainer: "hikVideo", iServicePortStart: 15900, iServicePortEnd: 15909, cbConnectSuccess: () => { this.oWebControl.JS_StartService("window", { dllPath: "./VideoPluginConnect.dll" }).then(() => { this.oWebControl.JS_SetWindowControlCallback({ // 设置音讯回调 cbIntegrationCallBack: cbIntegrationCallBack }); this.oWebControl.JS_CreateWnd("hikVideo", this.option.width, this.option.height).then(() => { this.videoInit(); this.videoFlag = true }); }); }, cbConnectError: () => { console.log("cbConnectError"); this.oWebControl = null; this.$notice({ message: '插件未启动,正在尝试启动,请稍候...', type: 'error' }); WebControl.JS_WakeUp("VideoWebPlugin://"); this.initCount++; if (this.initCount < 3) { setTimeout(() => { this.initPlugin(); }, 3000) } else { this.$notice({ message: '插件启动失败,请查看插件是否装置!', type: 'error' }); } }, cbConnectClose: () => { this.oWebControl = null; } }) function cbIntegrationCallBack(oData) { console.log(oData, 'cccccc') } }, unloadEvent() { if (this.oWebControl != null) { this.oWebControl.JS_HideWnd(); this.oWebControl.JS_Disconnect(); } }, scrollEvent() { if (this.oWebControl != null) { this.oWebControl.JS_Resize(this.option.width, this.option.height); this.setWndCover(); } }, resizeEvent() { if (this.oWebControl != null) { this.oWebControl.JS_Resize(this.option.width, this.option.height); this.setWndCover(); } }, setWndCover() { var iWidth = this.option.width; var iHeight = this.option.height; var oDivRect = document.getElementById("hikVideo").getBoundingClientRect(); var iCoverLeft = (oDivRect.left < 0) ? Math.abs(oDivRect.left): 0; var iCoverTop = (oDivRect.top < 0) ? Math.abs(oDivRect.top): 0; var iCoverRight = (oDivRect.right - iWidth > 0) ? Math.round(oDivRect.right - iWidth) : 0; var iCoverBottom = (oDivRect.bottom - iHeight > 0) ? Math.round(oDivRect.bottom - iHeight) : 0; iCoverLeft = (iCoverLeft > iWidth) ? iWidth : iCoverLeft; iCoverTop = (iCoverTop > iHeight) ? iHeight : iCoverTop; iCoverRight = (iCoverRight > iWidth) ? iWidth : iCoverRight; iCoverBottom = (iCoverBottom > iHeight) ? iHeight : iCoverBottom; let widthAdd1Px = iWidth + 1 // this.oWebControl.JS_RepairPartWindow(0, 0, widthAdd1Px, iHeight); // this.oWebControl.JS_CuttingPartWindow(0, 0, iCoverLeft, iHeight); // this.oWebControl.JS_CuttingPartWindow(0, 0, widthAdd1Px, iCoverTop); // if (iCoverLeft != 0) { // this.oWebControl.JS_CuttingPartWindow(0, 0, iCoverLeft, iHeight); // } // if (iCoverTop != 0) { // this.oWebControl.JS_CuttingPartWindow(0, 0, widthAdd1Px, iCoverTop); // 多剪掉一个像素条,防止出现剪掉一部分窗口后呈现一个像素条 // } // if (iCoverRight != 0) { // this.oWebControl.JS_CuttingPartWindow(iHeight - iCoverRight, 0, iCoverRight, iHeight); // } // if (iCoverBottom != 0) { // this.oWebControl.JS_CuttingPartWindow(0, iHeight - iCoverBottom, iWidth, iCoverBottom); // } }, setEncrypt(value) { var encrypt = new JSEncrypt(); encrypt.setPublicKey(this.pubKey); return encrypt.encrypt(value); }, videoInit() { this.getPubKey(() => { let secret = this.setEncrypt(this.option.secret); this.oWebControl.JS_RequestInterface({ funcName: "init", argument: JSON.stringify({ appkey: this.option.appkey, secret: secret, ip: this.option.ip, playMode: 0, // 预览 port: Number(this.option.port), snapDir: "", videoDir: "", layout: "1x1", enableHTTPS: 0, encryptedFields: "secret", showToolbar: 0 }) }) .then(oData => { this.preview(this.camera); // resize this.oWebControl.JS_Resize(this.option.width, this.option.height); }); }) }, preview(camera) { this.oWebControl.JS_RequestInterface({ funcName: "startPreview", argument: JSON.stringify({ cameraIndexCode: camera, streamMode: 0, transMode: 1, gpuMode: 0, wndId: -1 }) }).then((oData) => { console.log(JSON.stringify(oData ? oData.responseMsg : '')); }); }, destroy () { this.oWebControl.JS_RequestInterface({ funcName: "stopAllPreview" }).then(res => { this.oWebControl.JS_RequestInterface({ funcName: "uninit" }).then(res => { this.oWebControl.JS_RequestInterface({ funcName: "destroyWnd" }).then(res => { this.oWebControl.JS_HideWnd(); this.$emit("closed") }) }) }) } }, mounted() { this.initPlugin(); window.addEventListener('scroll', this.scrollEvent); window.addEventListener('resize', this.resizeEvent); // 标签敞开 window.addEventListener('unload', this.unloadEvent); }, beforeDestroy() { this.unloadEvent() window.removeEventListener("scroll", this.scrollEvent, true); window.removeEventListener("resize", this.resizeEvent, true); window.removeEventListener("unload", this.unloadEvent, true); }, destroyed() { }, watch:{ camera: { handler: function(newVal, oldVal) { if (newVal && this.videoFlag) { this.preview(newVal); } }, immediate: true } }}</script><style lang="scss" scoped></style>