vue封装海康威视视频插件js

需要配置三个参数appkey,secret,ip,另外在index.html引入所需js

image.png

使用
<template>
    <div class="player">
      <div id="video" ref="vdo"></div>
    </div>
</template>
<script>
import { initPlugin, initForPreview, startPreview, closeVideo } from '引入封装的js'
export default {
 data() {
    return {
      videoGrid: '1x1',
      videoContainer: 'video'
    }
  },
  mounted() {
    this.initVideo()
  },
  methods: {
     initVideo(){
       initPlugin(this.videoContainer, this.$refs.vdo.clientWidth, this.$refs.vdo.clientHeight, () => {
            initForPreview({ mlayout: this.videoGrid }).then(() => {
             startPreview('视频编号', '指定播放窗口')
            })
          })
      }
  },
 beforeDestroy() {
   closeVideo()
 }
}
</script>
//声明公用变量
let initCount = 0
let pubKey = ''
var oWebControl = null
let width = 1000
let height = 600
let cId = ''

// 创建播放实例
const initPlugin = (containerId, w, h, onSuccess, callback) => {
  cId = containerId
  width = w || 1000
  height = h || 6000
  oWebControl = new WebControl({
    szPluginContainer: containerId, // 指定容器id
    iServicePortStart: 15900, // 指定起止端口号,建议使用该值
    iServicePortEnd: 15909,
    szClassId: '23BF3B0A-2C56-4D97-9C03-0CB103AA8F11', // 用于IE10使用ActiveX的clsid
    cbConnectSuccess: () => {
      // 创建WebControl实例成功
      oWebControl
        .JS_StartService('window', {
          // WebControl实例创建成功后需要启动服务
          dllPath: './VideoPluginConnect.dll' // 值"./VideoPluginConnect.dll"写死
        })
        .then(
          () => {
            // 启动插件服务成功
            oWebControl.JS_SetWindowControlCallback({
              // 设置消息回调
              cbIntegrationCallBack: callback // 创建播放实例成功后消息回调函数
            })

            oWebControl.JS_CreateWnd(containerId, width, height).then(() => {
              //JS_CreateWnd创建视频播放窗口,宽高可设定
              onSuccess() // 创建播放实例成功后初始化
            })
          },
          () => {
            // 启动插件服务失败
          }
        )
    },
    cbConnectError: () => {
      // 创建WebControl实例失败
      oWebControl = null
      WebControl.JS_WakeUp('VideoWebPlugin://') // 程序未启动时执行error函数,采用wakeup来启动程序
      initCount++
      if (initCount < 3) {
        setTimeout(() => {
          initPlugin(containerId, w, h, onSuccess)
        }, 1000)
      } else {
        document.getElementById(cId).innerHTML = `<a style="color:white;" href="./static/VideoWebPlugin.exe" download="VideoWebPlugin.exe">插件启动失败,请下载插件并安装!</a>`
      }
    },
    cbConnectClose: () => {
      // 异常断开:bNormalClose = false
      // JS_Disconnect正常断开:bNormalClose = true
      console.log('cbConnectClose')
      oWebControl = null
    }
  })
}

const intPluginForPlayback = option => {
  return getPubKey().then(() => {
    initPlayPlugin({ mplayMode: 1, ...option })
  })
}

const initPlayPlugin = option => {
  const { mlayout, mplayMode } = option || { mlayout: '1x1', mplayMode: 0 }
  // 请自行修改以下变量值	
  let appkey = '' //综合安防管理平台提供的appkey,必填
  let secret = setEncrypt('') //综合安防管理平台提供的secret,必填
  let ip = '' //综合安防管理平台IP地址,必填
  let playMode = mplayMode || 0 //初始播放模式:0-预览,1-回放
  let port = 443 //综合安防管理平台端口,若启用HTTPS协议,默认443
  let snapDir = 'D:\\SnapDir' //抓图存储路径
  let videoDir = 'D:\\VideoDir' //紧急录像或录像剪辑存储路径
  let layout = mlayout || '1x1' //playMode指定模式的布局
  let enableHTTPS = 1 //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1
  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' //自定义工具条按钮
  // 请自行修改以上变量值	

  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(() => {
      oWebControl.JS_Resize(width, height) // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
      return Promise.resolve()
    })
}

//初始化
const initForPreview = option => {
  return getPubKey().then(() => {
    initPlayPlugin(option)
  })
}

//获取公钥
const getPubKey = () => {
  return oWebControl
    .JS_RequestInterface({
      funcName: 'getRSAPubKey',
      argument: JSON.stringify({
        keyLength: 1024
      })
    })
    .then(oData => {
      if (oData.responseMsg.data) {
        pubKey = oData.responseMsg.data
        return Promise.resolve()
      }
    })
}

//RSA加密
const setEncrypt = value => {
  let encrypt = new JSEncrypt()
  encrypt.setPublicKey(pubKey)
  return encrypt.encrypt(value)
}

window.onresize = function () {
  if (oWebControl != null) {
    oWebControl.JS_Resize(width, height)
    setWndCover()
  }
}

window.onscroll = function () {
  if (oWebControl != null) {
    oWebControl.JS_Resize(width, height)
    setWndCover()
  }
}

// 设置窗口裁剪,当因滚动条滚动导致窗口需要被遮住的情况下需要JS_CuttingPartWindow部分窗口
const setWndCover = (cw, ch) => {
  cw && (width = cw)
  ch && (height = ch)
  const playDiv = document.getElementById(cId)
  if (playDiv) {
    if (oWebControl != null) {
      oWebControl.JS_Resize(width, height)
    }
    let iWidth = window.innerWidth
    let iHeight = window.innerHeight
    let oDivRect = playDiv.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 > width ? width : iCoverLeft
    iCoverTop = iCoverTop > height ? height : iCoverTop
    iCoverRight = iCoverRight > width ? width : iCoverRight
    iCoverBottom = iCoverBottom > height ? height : iCoverBottom

    oWebControl.JS_RepairPartWindow(0, 0, width, height) // 多1个像素点防止还原后边界缺失一个像素条
    if (iCoverLeft !== 0) {
      oWebControl.JS_CuttingPartWindow(0, 0, iCoverLeft, height)
    }
    if (iCoverTop !== 0) {
      oWebControl.JS_CuttingPartWindow(0, 0, width, iCoverTop) // 多剪掉一个像素条,防止出现剪掉一部分窗口后出现一个像素条
    }
    if (iCoverRight !== 0) {
      oWebControl.JS_CuttingPartWindow(width - iCoverRight, 0, iCoverRight, height)
    }
    if (iCoverBottom !== 0) {
      oWebControl.JS_CuttingPartWindow(0, height - iCoverBottom, width, iCoverBottom)
    }
  }
}

const startPreview = (cameraIndexCode, wzId) => {
  //获取输入的监控点编号值,必填
  let streamMode = 1 //主子码流标识:0-主码流,1-子码流
  let transMode = 1 //传输协议:0-UDP,1-TCP
  let gpuMode = 0 //是否启用GPU硬解,0-不启用,1-启用
  let wndId = ''
  if (undefined === wzId || '' === wzId || null === wzId) {
    wndId = -1 //播放窗口序号(在2x2以上布局下可指定播放窗口)
  } else {
    wndId = wzId //播放窗口序号(在2x2以上布局下可指定播放窗口)
  }

  cameraIndexCode = cameraIndexCode.replace(/(^\s*)/g, '')
  cameraIndexCode = cameraIndexCode.replace(/(\s*$)/g, '')

  oWebControl.JS_RequestInterface({
    funcName: 'startPreview',
    argument: JSON.stringify({
      cameraIndexCode: cameraIndexCode, //监控点编号
      streamMode: streamMode, //主子码流标识
      transMode: transMode, //传输协议
      gpuMode: gpuMode, //是否开启GPU硬解
      wndId: wndId //可指定播放窗口
    })
  })
}

const startPlayback = cameraIndexCode => {
  //获取输入的监控点编号值,必填
  let startTimeStamp = new Date().getTime() - 24 * 3600000 //回放开始时间戳,必填
  let endTimeStamp = new Date().getTime() //回放结束时间戳,必填
  let recordLocation = 1 //录像存储位置:0-中心存储,1-设备存储
  let transMode = 1 //传输协议:0-UDP,1-TCP
  let gpuMode = 0 //是否启用GPU硬解,0-不启用,1-启用
  let wndId = -1 //播放窗口序号(在2x2以上布局下可指定播放窗口)

  oWebControl.JS_RequestInterface({
    funcName: 'startPlayback',
    argument: JSON.stringify({
      cameraIndexCode: cameraIndexCode, //监控点编号
      startTimeStamp: Math.floor(startTimeStamp / 1000).toString(), //录像查询开始时间戳,单位:秒
      endTimeStamp: Math.floor(endTimeStamp / 1000).toString(), //录像结束开始时间戳,单位:秒
      recordLocation: recordLocation, //录像存储类型:0-中心存储,1-设备存储
      transMode: transMode, //传输协议:0-UDP,1-TCP
      gpuMode: gpuMode, //是否启用GPU硬解,0-不启用,1-启用
      wndId: wndId //可指定播放窗口
    })
  })
}

// 标签关闭
const closeVideo = callback => {
  if (oWebControl != null) {
    oWebControl.JS_HideWnd() // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题
    return oWebControl.JS_Disconnect().then(
      () => {
        // 断开与插件服务连接成功
        setTimeout(callback, 1000)
      },
      () => {
        // 断开与插件服务连接失败
      }
    )
  }
}

const capture = () => {
  oWebControl.JS_RequestInterface({
    argument: {
      wndId: 1
    },
    funcName: 'snapShot'
  })
  return Promise.resolve()
}
export { initPlugin, initForPreview, intPluginForPlayback, startPreview, closeVideo, startPlayback, setWndCover, capture }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值