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