Vue+海康威視視頻web插件開發


一、 環境准備

官網下載海康的Web端視頻插件以及開發的Demo、文檔
進入運行管理平台獲取到 Appkey、AppSecret、Ip、Port

二、 引入文件

在index.html中引入插件文件

 

引入插件
引入插件

 

三、 代碼實現

批量預覽list的數據格式如下

list = [
    {
        cameraIndexCode: "",
        ezvizDirect: 0,
        gpuMode: 0,
        streamMode: 0,
        transMode: 1,
        wndId: 1     // 預覽的窗口
    },
    {
        cameraIndexCode: "",
        ezvizDirect: 0,
        gpuMode: 0,
        streamMode: 0,
        transMode: 1,
        wndId: 2
    }
]

 

<template>
  <div class="wrapper" ref="wrapper" :style="{ width: videoWidth + 'px' }">
    <div :id="setting.id" :class="[oWebControl === null ? 'videoNull' : '']" v-html="oWebControl === null ? playText : ''"></div>
  </div>
</template>

<script>
export default {
  // 從父組件傳遞過來的
  props: {
    setting: { type: Object, default: () => {} },
    sysParams: { type: Object, default: () => {} },
    list: { type: Array, default: () => [] },
  },
  data() {
    return {
      videoWidth: document.documentElement.clientWidth - 450,
      videoHeight: document.documentElement.clientHeight - 200,
      layout: '2x2',
      left: '',
      top: '',
      initCount: 0, // 啟動次數
      playMode: 0, // 0 預覽 1回放
      playText: '啟動中...',
      cameraIndexCode: '', // 監控點編號
      oWebControl: null,
      href: 'static/HIKVideo/VideoWebPlugin.exe',
      screenWidth: document.documentElement.clientWidth, //屏幕寬度
      screenHeight: document.documentElement.clientHeight, //屏幕高度
    };
  },
  created() {
    this.createdVideo();
  },
  mounted() {
    // 窗口自適應
    $(window).resize(() => {
      this.screenWidth = document.documentElement.clientWidth;
      this.screenHeight = document.documentElement.clientHeight;
    });
    $(window).scroll(() => {
      if (this.oWebControl != null) {
        this.oWebControl.JS_Resize(document.documentElement.clientWidth - 450, document.documentElement.clientHeight - 200);
        this.setWndCover();
      }
    });
  },
  methods: {
    // 初始化+預覽
    createdVideo() {
      this.initPlugin(this.setting.id, () => {
        this.multiPreviewVideo();
      });
    },
	// 窗口自適應
    resizewindow(w, h) {
      w = w < 1423 ? 1423 : w;
      h = h < 754 ? 754 : h;
      window.resizeTo(w, h);
    },
    // destroy
    destroyWnd() {
      if (this.oWebControl) {
        this.oWebControl.JS_HideWnd();
        this.oWebControl
          .JS_DestroyWnd({
            funcName: 'destroyeWnd',
          })
          .then(function (oData) {
            console.log(oData);
          });
      } else {
        console.log('沒有實例');
      }
    },

    // 初始化
    init(callback) {
      this.getPubKey(() => {
        ////////////////////////////////// 請自行修改以下變量值	////////////////////////////////////
        let appkey = this.sysParams.appkey; //綜合安防管理平台提供的appkey,必填
        let secret = this.setEncrypt(this.sysParams.secret); //綜合安防管理平台提供的secret,必填
        let ip = this.sysParams.ip; //綜合安防管理平台IP地址,必填
        let playMode = this.playMode; //初始播放模式:0-預覽,1-回放
        let port = this.sysParams.port; //綜合安防管理平台端口,若啟用HTTPS協議,默認443
        let snapDir = 'D:\\SnapDir'; //抓圖存儲路徑
        let videoDir = 'D:\\VideoDir'; //緊急錄像或錄像剪輯存儲路徑
        let layout = this.layout; //playMode指定模式的布局
        let enableHTTPS = 1; //是否啟用HTTPS協議與綜合安防管理平台交互,是為1,否為0
        let encryptedFields = 'secret'; //加密字段,默認加密領域為secret
        let showToolbar = 1; //是否顯示工具欄,0-不顯示,非0-顯示
        let showSmart = 1; //是否顯示智能信息(如配置移動偵測后畫面上的線框),0-不顯示,非0-顯示
        let buttonIDs = '0,16,256,257,258,259,260,512,513,514,515,516,517,768,769'; //自定義工具條按鈕
        ////////////////////////////////// 請自行修改以上變量值	////////////////////////////////////

        this.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((oData) => {
		  // 初始化后resize一次,規避firefox下首次顯示窗口后插件窗口未與DIV窗口重合問題
            this.oWebControl.JS_Resize(this.videoWidth, this.videoHeight); 
            if (callback) {
              callback();
            }
          });
      });
    },
    // 創建播放實例
    initPlugin(id, callback) {
      let that = this;
      that.oWebControl = new WebControl({
        szPluginContainer: id, // 指定容器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: that.cbIntegrationCallBack,
                });

                that.oWebControl.JS_CreateWnd(id, that.videoWidth, that.videoHeight).then(() => {
                  //JS_CreateWnd創建視頻播放窗口,寬高可設定
                  that.init(callback); // 創建播放實例成功后初始化
                });
              },
              function () {
                // 啟動插件服務失敗
              }
            );
        },
        cbConnectError: () => {
          // 創建WebControl實例失敗
          that.oWebControl = null;
          that.playText = '插件未啟動,正在嘗試啟動,請稍候...';
          WebControl.JS_WakeUp('VideoWebPlugin://'); // 程序未啟動時執行error函數,采用wakeup來啟動程序
          that.initCount++;
          if (that.initCount < 3) {
            setTimeout(() => {
              that.initPlugin();
            }, 3000);
          } else {
            that.playText = `插件啟動失敗,請檢查插件是否安裝!<a href=${this.href} type="primary" download="視頻插件.exe" style='color:#4194fc'>下載地址</a>`;
          }
        },
        cbConnectClose: (bNormalClose) => {
          // 異常斷開:bNormalClose = false
          // JS_Disconnect正常斷開:bNormalClose = true
          that.oWebControl = null;
        },
      });
    },
    // 關閉
    handleClose() {
      if (this.oWebControl) {
        this.oWebControl.JS_RequestInterface({
          funcName: 'stopAllPreview',
        });
        this.oWebControl.JS_HideWnd(); // 先讓窗口隱藏,規避可能的插件窗口滯后於瀏覽器消失問題
        this.oWebControl.JS_Disconnect().then(
          () => {
            // 斷開與插件服務連接成功
          },
          () => {
            // 斷開與插件服務連接失敗
          }
        );
        this.oWebControl = null;
      }
    },
    // 消息回調
    cbIntegrationCallBack(oData) {
      // console.log(oData);
    },
    // 預覽
    previewVideo() {
      let cameraIndexCode = this.cameraIndexCode; // 獲取輸入的監控點編號值,必填
      let streamMode = 0; // 主子碼流標識:0-主碼流,1-子碼流
      let transMode = 1; // 傳輸協議:0-UDP,1-TCP
      let gpuMode = 0; // 是否啟用GPU硬解,0-不啟用,1-啟用
      let wndId = -1; // 播放窗口序號(在2x2以上布局下可指定播放窗口)

      this.oWebControl.JS_RequestInterface({
        funcName: 'startPreview',
        argument: JSON.stringify({
          cameraIndexCode: cameraIndexCode.trim(), // 監控點編號
          streamMode: streamMode, // 主子碼流標識
          transMode: transMode, // 傳輸協議
          gpuMode: gpuMode, // 是否開啟GPU硬解
          wndId: wndId, // 可指定播放窗口
        }),
      });
    },
    // 批量預覽
    multiPreviewVideo() {
      let streamMode = 0; // 主子碼流標識:0-主碼流,1-子碼流
      let transMode = 1; // 傳輸協議:0-UDP,1-TCP
      let gpuMode = 0; // 是否啟用GPU硬解,0-不啟用,1-啟用
      let wndId = -1; // 播放窗口序號(在2x2以上布局下可指定播放窗口)
      this.oWebControl
        .JS_RequestInterface({
          funcName: 'startMultiPreviewByCameraIndexCode',
          argument: JSON.stringify({
            list: this.list, // 監控點編號集合
          }),
        })
        .then((res) => {
          if (res.errorCode === 0) {
            console.log('預覽成功')
          }
        });
    },
    //獲取公鑰
    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();
          }
        });
    },
    //RSA加密
    setEncrypt(value) {
      let encrypt = new JSEncrypt();
      encrypt.setPublicKey(this.pubKey);
      return encrypt.encrypt(value);
    },
    // 設置窗口裁剪,當因滾動條滾動導致窗口需要被遮住的情況下需要JS_CuttingPartWindow部分窗口
    setWndCover() {
      let iWidth = $(window).width(); // 獲取瀏覽器寬度 不含滾動條
      let iHeight = $(window).height();
      let oDivRect = $('#' + this.setting.id)
        .get(0)
        .getBoundingClientRect();

      let iCoverLeft = oDivRect.left < 0 ? Math.abs(oDivRect.left) : 0;
      let iCoverTop = oDivRect.top < 0 ? Math.abs(oDivRect.top) : 0;
      let iCoverRight = oDivRect.right - iWidth > 0 ? Math.round(oDivRect.right - iWidth) : 0;
      let iCoverBottom = oDivRect.bottom - iHeight > 0 ? Math.round(oDivRect.bottom - iHeight) : 0;

      iCoverLeft = iCoverLeft > this.videoWidth ? this.videoWidth : iCoverLeft;
      iCoverTop = iCoverTop > this.videoHeight ? this.videoHeight : iCoverTop;
      iCoverRight = iCoverRight > this.videoWidth ? this.videoWidth : iCoverRight;
      iCoverBottom = iCoverBottom > this.videoHeight ? this.videoHeight : iCoverBottom;
	  
      // 多1個像素點防止還原后邊界缺失一個像素條
      this.oWebControl.JS_RepairPartWindow(0, 0, this.videoWidth + 1, this.videoHeight); 
      if (iCoverLeft != 0) {
        this.oWebControl.JS_CuttingPartWindow(0, 0, iCoverLeft, this.videoHeight);
      }
      if (iCoverTop != 0) {
	  // 多剪掉一個像素條,防止出現剪掉一部分窗口后出現一個像素條
        this.oWebControl.JS_CuttingPartWindow(0, 0, this.videoWidth + 1, iCoverTop); 
      }
      if (iCoverRight != 0) {
        this.oWebControl.JS_CuttingPartWindow(this.videoWidth - iCoverRight, 0, iCoverRight, this.videoHeight);
      }
      if (iCoverBottom != 0) {
        this.oWebControl.JS_CuttingPartWindow(0, this.videoHeight - iCoverBottom, this.videoWidth, iCoverBottom);
      }
    },
  },
  destroyed() {
    this.destroyWnd();
  },
  watch: {
    screenWidth(n, o) {
      this.videoWidth = document.documentElement.clientWidth - 450;
      this.videoHeight = document.documentElement.clientHeight - 200;
      this.oWebControl.JS_Resize(this.videoWidth, this.videoHeight);
      this.resizewindow(n, this.screenHeight);
      this.setWndCover();
    },
    screenHeight(n, o) {
      this.videoWidth = document.documentElement.clientWidth - 450;
      this.videoHeight = document.documentElement.clientHeight - 200;
      this.oWebControl.JS_Resize(this.videoWidth, this.videoHeight);
      this.resizewindow(this.screenWidth, n);
      this.setWndCover();
    },
  },
};
</script>

 

四、 預覽效果

 

Snipaste_2020-12-14_16-41-58
Snipaste_2020-12-14_16-41-58

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM