需要配置三个参数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 }
网友评论