ソースを参照

视频摄像头预览--海康

彭宇 2 年 前
コミット
ac469b97af
2 ファイル変更233 行追加37 行削除
  1. 6 6
      src/components/TVWall.vue
  2. 227 31
      src/views/monitor.vue

+ 6 - 6
src/components/TVWall.vue

@@ -246,9 +246,9 @@ export default {
   },
   methods: {
     cancelEventLocationShow() {
-      this.activeName = 'tv'
+      // this.activeName = 'tv'
       this.TVWallVisible = false
-      this.destroy()
+      // this.destroy()
 
       if (this.oWebControl != null) {
         this.oWebControl.JS_HideWnd()   // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题
@@ -440,7 +440,7 @@ export default {
           initCount++
           if (initCount < 3) {
             setTimeout(function() {
-              initPlugin()
+              that.initPlugin()
             }, 3000)
           } else {
             $('#playWnd').html('插件启动失败,请检查插件是否安装!')
@@ -466,7 +466,7 @@ export default {
         var port = 54321                                    //综合安防管理平台端口,若启用HTTPS协议,默认443
         var snapDir = 'D:\\SnapDir'                       //抓图存储路径
         var videoDir = 'D:\\VideoDir'                     //紧急录像或录像剪辑存储路径
-        var layout = '1x1'                                //playMode指定模式的布局
+        var layout = '3x3'                                //playMode指定模式的布局
         var enableHTTPS = 1                               //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1
         var encryptedFields = 'secret'					   //加密字段,默认加密领域为secret
         var showToolbar = 1                               //是否显示工具栏,0-不显示,非0-显示
@@ -524,7 +524,7 @@ export default {
       var streamMode = 0                                     //主子码流标识:0-主码流,1-子码流
       var transMode = 1                                      //传输协议:0-UDP,1-TCP
       var gpuMode = 0                                        //是否启用GPU硬解,0-不启用,1-启用
-      var wndId = -1                                         //播放窗口序号(在2x2以上布局下可指定播放窗口)
+      var wndId = 2                                         //播放窗口序号(在2x2以上布局下可指定播放窗口)
 
       cameraIndexCode = cameraIndexCode.replace(/(^\s*)/g, '')
       cameraIndexCode = cameraIndexCode.replace(/(\s*$)/g, '')
@@ -546,7 +546,7 @@ export default {
 
 // 推送消息
 function cbIntegrationCallBack(oData) {
-  showCBInfo(JSON.stringify(oData.responseMsg))
+  console.log(JSON.stringify(oData.responseMsg))
 }
 </script>
 

+ 227 - 31
src/views/monitor.vue

@@ -104,6 +104,13 @@
     </div>
     <eventLocation ref="eventLocation"></eventLocation>
     <TVWall ref="TVWall"></TVWall>
+    <el-dialog title="摄像头" :visible.sync="cameraVisible" v-if="cameraVisible" width="770px" style="height: 700px;"
+               @close="cancelEventLocationShow()">
+      <div style="width:100%;height:400px;position:relative;">
+        <!--视频窗口展示---海康-->
+        <div id="playWnd" class="playWnd" style="left: 0px; top: 0px;"></div>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
@@ -140,8 +147,8 @@ export default {
   },
   created() {
     /** ----------------------------------摄像头预览开始------------------------------------- */
-    const DHWsInstance = DHWs.getInstance()
-    this.ws = DHWsInstance
+    // const DHWsInstance = DHWs.getInstance()
+    // this.ws = DHWsInstance
     /** ----------------------------------摄像头预览结束------------------------------------- */
 
     /** ----------------------------------底部按钮公用组件开始------------------------------------- */
@@ -161,10 +168,16 @@ export default {
       listCurrentIndex2: '',
       listCurrentIndex3: '',
       /** ----------------------------------摄像头预览开始------------------------------------- */
+      //大华
       activePanel: 'key1',
       isLogin: false,
       cameraParams: [],
       ws: null,
+      //海康
+      cameraVisible:false,
+      initCount: 0,
+      pubKey: '',
+      oWebControl: null,
       /** ----------------------------------摄像头预览结束------------------------------------- */
       visuForestCloudMapDeviceBOList: [],
       visuForestCloudCameraBOList: [],
@@ -549,36 +562,53 @@ export default {
     alertReinstall: function() {
       this.$modal.msgWarning('请重新安装客户端')
     },
+    cancelEventLocationShow() {
+      if (this.oWebControl != null) {
+        this.oWebControl.JS_HideWnd()   // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题
+        this.oWebControl.JS_Disconnect().then(function() {  // 断开与插件服务连接成功
+          },
+          function() {  // 断开与插件服务连接失败
+          })
+      }
+    },
     /** 预览按钮操作 */
     preview(channelCode) {
-      getDahuaVideoServer().then(newResponse => {
-        this.ws.detectConnectQt().then(res => {
-          if (res) { // 连接客户端成功
-            this.alertLogin()
-            this.ws.login({
-              loginIp: newResponse.loginIp,
-              loginPort: newResponse.loginPort,
-              userName: newResponse.userName,
-              userPwd: newResponse.userPwd,
-              token: '',
-              https: 1
-            })
-            this.ws.on('loginState', (res) => {
-              this.isLogin = res
-              console.log('---res-----', res)
-              if (res) {
-                this.alertLoginSuccess()
-                this.activePanel = 'key2'
-                this.realTimeVideoDialog(channelCode)
-              } else {
-                this.alertLoginFailed()
-              }
-            })
-          } else { // 连接客户端失败
-            this.alertReinstall()
-          }
-        })
-      })
+      let that=this;
+      // getDahuaVideoServer().then(newResponse => {
+      //   console.log(newResponse)
+      //   debugger
+      //   this.ws.detectConnectQt().then(res => {
+      //     if (res) { // 连接客户端成功
+      //       this.alertLogin()
+      //       this.ws.login({
+      //         loginIp: newResponse.loginIp,
+      //         loginPort: newResponse.loginPort,
+      //         userName: newResponse.userName,
+      //         userPwd: newResponse.userPwd,
+      //         token: '',
+      //         https: 1
+      //       })
+      //       this.ws.on('loginState', (res) => {
+      //         this.isLogin = res
+      //         console.log('---res-----', res)
+      //         if (res) {
+      //           this.alertLoginSuccess()
+      //           this.activePanel = 'key2'
+      //           this.realTimeVideoDialog(channelCode)
+      //         } else {
+      //           this.alertLoginFailed()
+      //         }
+      //       })
+      //     } else { // 连接客户端失败
+      //       this.alertReinstall()
+      //     }
+      //   })
+      // })
+      this.cameraVisible=true
+      that.initPlugin()
+      setTimeout(function() {
+        that.playhk();
+      }, 5000)
     },
     realTimeVideoDialog(cameraParams) { // 调用弹窗实时播放接口
       if (!this.isLogin) {
@@ -586,14 +616,180 @@ export default {
         return false
       }
       this.ws.openVideo(cameraParams)
-    }
+    },
     /** ----------------------------------摄像头预览结束------------------------------------- */
 
+
+    /** ----------------------------------海康摄像头预览开始------------------------------------- */
+    //播放海康摄像头
+    playhk(){
+      var cameraIndexCode = '33e7f21691a843f6bcb4866efebe088b'     //获取输入的监控点编号值,必填
+      var streamMode = 0                                     //主子码流标识:0-主码流,1-子码流
+      var transMode = 1                                      //传输协议:0-UDP,1-TCP
+      var gpuMode = 0                                        //是否启用GPU硬解,0-不启用,1-启用
+      var wndId = -1                                         //播放窗口序号(在2x2以上布局下可指定播放窗口)
+
+      cameraIndexCode = cameraIndexCode.replace(/(^\s*)/g, '')
+      cameraIndexCode = cameraIndexCode.replace(/(\s*$)/g, '')
+
+      this.oWebControl.JS_RequestInterface({
+        funcName: 'startPreview',
+        argument: JSON.stringify({
+          cameraIndexCode: cameraIndexCode,                //监控点编号
+          streamMode: streamMode,                         //主子码流标识
+          transMode: transMode,                           //传输协议
+          gpuMode: gpuMode,                               //是否开启GPU硬解
+          wndId: wndId                                     //可指定播放窗口
+        })
+      })
+    },
+    // 创建播放实例
+    initPlugin() {
+      let that=this
+      that.oWebControl = new WebControl({
+        szPluginContainer: 'playWnd',                       // 指定容器id
+        iServicePortStart: 15900,                           // 指定起止端口号,建议使用该值
+        iServicePortEnd: 15909,
+        szClassId: '23BF3B0A-2C56-4D97-9C03-0CB103AA8F11',   // 用于IE10使用ActiveX的clsid
+        cbConnectSuccess: function() {                     // 创建WebControl实例成功
+          that.oWebControl.JS_StartService('window', {         // WebControl实例创建成功后需要启动服务
+            dllPath: './VideoPluginConnect.dll'         // 值"./VideoPluginConnect.dll"写死
+          }).then(function() {                           // 启动插件服务成功
+            that.oWebControl.JS_SetWindowControlCallback({   // 设置消息回调
+              cbIntegrationCallBack: cbIntegrationCallBack
+            })
+
+            that.oWebControl.JS_CreateWnd('playWnd', 768, 462).then(function() { //JS_CreateWnd创建视频播放窗口,宽高可设定
+              that.init()  // 创建播放实例成功后初始化
+            })
+          }, function() { // 启动插件服务失败
+          })
+        },
+        cbConnectError: function() { // 创建WebControl实例失败
+          that.oWebControl = null
+          $('#playWnd').html('插件未启动,正在尝试启动,请稍候...')
+          WebControl.JS_WakeUp('VideoWebPlugin://') // 程序未启动时执行error函数,采用wakeup来启动程序
+          initCount++
+          if (initCount < 3) {
+            setTimeout(function() {
+              that.initPlugin()
+            }, 3000)
+          } else {
+            $('#playWnd').html('插件启动失败,请检查插件是否安装!')
+          }
+        },
+        cbConnectClose: function(bNormalClose) {
+          // 异常断开:bNormalClose = false
+          // JS_Disconnect正常断开:bNormalClose = true
+          console.log('cbConnectClose')
+          that.oWebControl = null
+        }
+      })
+    },
+    //初始化
+    init() {
+      let that=this
+      this.getPubKey(function() {
+        ////////////////////////////////// 请自行修改以下变量值	////////////////////////////////////
+        var appkey = '22654202'                           //综合安防管理平台提供的appkey,必填
+        var secret = that.setEncrypt('d7HlmRIaiXp3MQBmsuUg')   //综合安防管理平台提供的secret,必填
+        var ip = '218.27.1.154'                           //综合安防管理平台IP地址,必填
+        var playMode = 0                                  //初始播放模式:0-预览,1-回放
+        var port = 54321                                    //综合安防管理平台端口,若启用HTTPS协议,默认443
+        var snapDir = 'D:\\SnapDir'                       //抓图存储路径
+        var videoDir = 'D:\\VideoDir'                     //紧急录像或录像剪辑存储路径
+        var layout = '1x1'                                //playMode指定模式的布局
+        var enableHTTPS = 1                               //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1
+        var encryptedFields = 'secret'					   //加密字段,默认加密领域为secret
+        var showToolbar = 1                               //是否显示工具栏,0-不显示,非0-显示
+        var showSmart = 1                                 //是否显示智能信息(如配置移动侦测后画面上的线框),0-不显示,非0-显示
+        var buttonIDs = '0,16,256,257,258,259,260,512,513,514,515,516,517,768,769'  //自定义工具条按钮
+        ////////////////////////////////// 请自行修改以上变量值	////////////////////////////////////
+
+        that.oWebControl.JS_RequestInterface({
+          funcName: 'init',
+          argument: JSON.stringify({
+            appkey: appkey,                            //API网关提供的appkey
+            secret: secret,                            //API网关提供的secret
+            ip: 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(function(oData) {
+          that.oWebControl.JS_Resize(768, 462)  // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
+        })
+      })
+    },
+    //获取公钥
+    getPubKey(callback) {
+      let that=this
+      that.oWebControl.JS_RequestInterface({
+        funcName: 'getRSAPubKey',
+        argument: JSON.stringify({
+          keyLength: 1024
+        })
+      }).then(function(oData) {
+        console.log(oData)
+        if (oData.responseMsg.data) {
+          that.pubKey = oData.responseMsg.data
+          callback()
+        }
+      })
+    },
+//RSA加密
+    setEncrypt(value) {
+      var encrypt = new JSEncrypt()
+      encrypt.setPublicKey(this.pubKey)
+      return encrypt.encrypt(value)
+    },
+    //播放海康摄像头
+    playhk(){
+      var cameraIndexCode = '33e7f21691a843f6bcb4866efebe088b'     //获取输入的监控点编号值,必填
+      var streamMode = 0                                     //主子码流标识:0-主码流,1-子码流
+      var transMode = 1                                      //传输协议:0-UDP,1-TCP
+      var gpuMode = 0                                        //是否启用GPU硬解,0-不启用,1-启用
+      var wndId = -1                                         //播放窗口序号(在2x2以上布局下可指定播放窗口)
+
+      cameraIndexCode = cameraIndexCode.replace(/(^\s*)/g, '')
+      cameraIndexCode = cameraIndexCode.replace(/(\s*$)/g, '')
+
+      this.oWebControl.JS_RequestInterface({
+        funcName: 'startPreview',
+        argument: JSON.stringify({
+          cameraIndexCode: cameraIndexCode,                //监控点编号
+          streamMode: streamMode,                         //主子码流标识
+          transMode: transMode,                           //传输协议
+          gpuMode: gpuMode,                               //是否开启GPU硬解
+          wndId: wndId                                     //可指定播放窗口
+        })
+      })
+    }
+    /** ----------------------------------海康摄像头预览结束------------------------------------- */
+
   }
 }
+// 推送消息
+function cbIntegrationCallBack(oData) {
+  showCBInfo(JSON.stringify(oData.responseMsg))
+}
 </script>
 
 
 <style rel="stylesheet/scss" lang="scss" scoped>
 @import '@/assets/styles/base.scss';
+
+.playWnd {
+  margin: -13px 0 0 -15px;
+  width: 768px; /*播放容器的宽和高设定*/
+  height: 462px;
+  border: 1px solid red;
+}
 </style>