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