170 lines
7.0 KiB
Vue
170 lines
7.0 KiB
Vue
|
|
<template>
|
|||
|
|
<section class="hikversionMonitor">
|
|||
|
|
<div id="monitorIns">
|
|||
|
|
<el-link v-if="needSetupPlugin" href="https://cdn.cunwuyun.cn/wsr/lib/VideoWebPlugin.exe" type="primary">
|
|||
|
|
请检查是否安装视频插件,如果没有请点击下载视频插件并安装
|
|||
|
|
</el-link>
|
|||
|
|
<div v-else>视频插件未启动,正在尝试启动,请稍候...</div>
|
|||
|
|
</div>
|
|||
|
|
</section>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
export default {
|
|||
|
|
name: "hikversionMonitor",
|
|||
|
|
props: {
|
|||
|
|
src: {default: ""},
|
|||
|
|
list: {default: () => []}
|
|||
|
|
},
|
|||
|
|
data() {
|
|||
|
|
return {
|
|||
|
|
monitorIns: null,
|
|||
|
|
initCount: 0
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
computed: {
|
|||
|
|
needSetupPlugin() {
|
|||
|
|
return this.initCount >= 3
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
methods: {
|
|||
|
|
getMonitorWidth() {
|
|||
|
|
let {width} = document.querySelector("#monitorIns")?.getBoundingClientRect()
|
|||
|
|
return width
|
|||
|
|
},
|
|||
|
|
getMonitorHeight() {
|
|||
|
|
let {height} = document.querySelector("#monitorIns")?.getBoundingClientRect()
|
|||
|
|
return height
|
|||
|
|
},
|
|||
|
|
initSDK() {
|
|||
|
|
this.$nextTick(() => {
|
|||
|
|
let width = this.getMonitorWidth(), height = this.getMonitorHeight()
|
|||
|
|
if (width) {
|
|||
|
|
this.monitorIns = new WebControl({
|
|||
|
|
szPluginContainer: "monitorIns", // 指定容器id
|
|||
|
|
iServicePortStart: 15900, // 指定起止端口号,建议使用该值
|
|||
|
|
iServicePortEnd: 15909,
|
|||
|
|
szClassId: "23BF3B0A-2C56-4D97-9C03-0CB103AA8F11", // 用于IE10使用ActiveX的clsid
|
|||
|
|
cbConnectSuccess: () => { // 创建WebControl实例成功
|
|||
|
|
this.monitorIns.JS_StartService("window", { // WebControl实例创建成功后需要启动服务
|
|||
|
|
dllPath: "./VideoPluginConnect.dll" // 值"./VideoPluginConnect.dll"写死
|
|||
|
|
}).then(() => { // 启动插件服务成功
|
|||
|
|
this.monitorIns.JS_CreateWnd("monitorIns", width, height).then(() => { //JS_CreateWnd创建视频播放窗口,宽高可设定
|
|||
|
|
this.monitorIns.JS_RequestInterface({
|
|||
|
|
funcName: "getRSAPubKey",
|
|||
|
|
argument: JSON.stringify({
|
|||
|
|
keyLength: 1024
|
|||
|
|
})
|
|||
|
|
}).then((oData) => {
|
|||
|
|
if (oData.responseMsg.data) {
|
|||
|
|
let encrypt = new JSEncrypt();
|
|||
|
|
encrypt.setPublicKey(oData.responseMsg.data);
|
|||
|
|
let secret = encrypt.encrypt("JSqHo9JUgPLQxfCIjsmQ");
|
|||
|
|
this.monitorIns.JS_RequestInterface({
|
|||
|
|
funcName: "init",
|
|||
|
|
argument: JSON.stringify({
|
|||
|
|
appkey: "23335895", //API网关提供的appkey
|
|||
|
|
secret, //API网关提供的secret
|
|||
|
|
ip: "124.128.246.74", //API网关IP地址
|
|||
|
|
playMode: 0, //初始播放模式:0-预览,1-回放
|
|||
|
|
port: 1443, //端口
|
|||
|
|
snapDir: ".", //抓图存储路径
|
|||
|
|
videoDir: ".", //紧急录像或录像剪辑存储路径
|
|||
|
|
layout: "1x1", //布局
|
|||
|
|
enableHTTPS: 1, //是否启用HTTPS协议
|
|||
|
|
encryptedFields: "secret", //加密字段
|
|||
|
|
showToolbar: 1, //是否显示工具栏
|
|||
|
|
showSmart: 1, //是否显示智能信息
|
|||
|
|
buttonIDs: "0,16,256,257,258,259,260,512,513,514,515,516,517,768,769" //自定义工具条按钮
|
|||
|
|
})
|
|||
|
|
}).then(() => {
|
|||
|
|
this.monitorIns.JS_Resize(width, height); // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
|
|||
|
|
this.startPreview()
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
});
|
|||
|
|
}, (...args) => {
|
|||
|
|
// 启动插件服务失败
|
|||
|
|
console.log(args)
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
cbConnectError: () => {
|
|||
|
|
this.monitorIns = null
|
|||
|
|
WebControl.JS_WakeUp("VideoWebPlugin://");
|
|||
|
|
this.initCount++
|
|||
|
|
if (!this.needSetupPlugin) {
|
|||
|
|
setTimeout(() => {
|
|||
|
|
this.initSDK()
|
|||
|
|
}, 3000)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
startPreview() {
|
|||
|
|
const layout = len =>
|
|||
|
|
len <= 1 ? '1x1' :
|
|||
|
|
len == 2 ? '1x2' :
|
|||
|
|
len == 3 ? '1+2' :
|
|||
|
|
len == 4 ? '2x2' :
|
|||
|
|
len < 6 ? '1+5' :
|
|||
|
|
len == 7 ? '3+4' :
|
|||
|
|
len == 8 ? '1+7' :
|
|||
|
|
len == 9 ? '3x3' :
|
|||
|
|
len == 10 ? '1+9' :
|
|||
|
|
len <= 16 ? '4x4' : '4x6'
|
|||
|
|
let list = this.src?.split(",")
|
|||
|
|
this.monitorIns?.JS_RequestInterface({
|
|||
|
|
funcName: "setLayout",
|
|||
|
|
argument: JSON.stringify({layout: layout(list.length)})
|
|||
|
|
}).then(() => {
|
|||
|
|
this.monitorIns?.JS_RequestInterface({
|
|||
|
|
funcName: "startMultiPreviewByCameraIndexCode",
|
|||
|
|
argument: JSON.stringify({
|
|||
|
|
list: list.map((cameraIndexCode, i) => ({
|
|||
|
|
cameraIndexCode, //监控点编号
|
|||
|
|
streamMode: 0, //主子码流标识
|
|||
|
|
transMode: 1, //传输协议
|
|||
|
|
gpuMode: 0, //是否开启GPU硬解
|
|||
|
|
wndId: i + 1 //可指定播放窗口
|
|||
|
|
}))
|
|||
|
|
})
|
|||
|
|
})
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
watch: {
|
|||
|
|
src(v) {
|
|||
|
|
v && this.monitorIns?.JS_RequestInterface({funcName: "stopAllPreview"}).then(() => this.startPreview())
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
mounted() {
|
|||
|
|
this.$injectLib("https://cdn.cunwuyun.cn/wsr/lib/jsencrypt.min.js")
|
|||
|
|
this.$injectLib("https://cdn.cunwuyun.cn/wsr/lib/jsWebControl-1.0.0.min.js", () => {
|
|||
|
|
this.initSDK()
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
beforeDestroy() {
|
|||
|
|
this.monitorIns?.JS_DestroyWnd()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style lang="scss" scoped>
|
|||
|
|
.hikversionMonitor {
|
|||
|
|
color: #fff;
|
|||
|
|
height: 100%;
|
|||
|
|
|
|||
|
|
#monitorIns {
|
|||
|
|
height: 100%;
|
|||
|
|
background: #000;
|
|||
|
|
display: flex;
|
|||
|
|
justify-content: center;
|
|||
|
|
align-items: center;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</style>
|