Files
erqi-web/src/components/Common/video-comp-back.vue
2025-12-24 18:19:05 +08:00

333 lines
10 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<!-- 绑定父组件classvideoWindow -->
<div
:id="playWndId"
ref="video-preview">
</div>
</template>
<script>
/* eslint-disable */
export default {
name: 'video-preview',
data() {
return {
width: 0,
height: 0,
secret: '',
oWebControl: null,
initCount: 0,
appkey: import.meta.env.VITE_APP_HAIKANG_APPKEY,
ip: import.meta.env.VITE_APP_HAIKANG_IP,
port: parseInt(import.meta.env.VITE_APP_HAIKANG_PORT),
playMode: 1,
pubKey: '',
isInit: false
}
},
props: {
layout: {
type: String,
default: () => '1x1'
},
cameraIndexCode: {},
timeOut: {
type: Number,
default: () => 500
},
videoWindowClassName: {
type: String,
default: "videoWindow",
required: false
},
playWndId: {
type: String,
default: "playWnd",
required: false
}
},
mounted() {
var that = this
this.$nextTick(function() {
that.windowChange()
setTimeout(() => {
that.initPlugin()
}, that.timeOut)
window.addEventListener('resize', function() {
that.onResize()
})
})
},
destroyed() {
this.uninit()
},
methods: {
onResize(change=true){
let that = this
if (that.oWebControl) {
if(change){
that.windowChange()
}
that.oWebControl.JS_Resize(that.width, that.height)
}
},
wait (fn, timeout, tick) {
timeout = timeout || 5000;
tick = tick || 250;
var timeoutTimer = null;
var execTimer = null;
return new Promise(function(resolve, reject) {
timeoutTimer = setTimeout(function() {
clearTimeout(execTimer);
reject(new Error('polling fail because timeout'));
}, timeout);
tickHandler(fn);
function tickHandler(fn) {
var ret = fn();
if (!ret) {
execTimer = setTimeout(function() {
tickHandler(fn);
}, tick)
} else {
clearTimeout(timeoutTimer);
resolve();
}
}
});
},
// 初始化plugin
initPlugin() {
let that = this
this.oWebControl = new WebControl({
szPluginContainer: this.playWndId,
iServicePortStart: 15900,
iServicePortEnd: 15909,
szClassId: '23BF3B0A-2C56-4D97-9C03-0CB103AA8F11', // 用于IE10使用ActiveX的clsid
cbConnectSuccess: function() {
that.setCallbacks();
//实例创建成功后需要启动服务
that.oWebControl
.JS_StartService("window", {
dllPath: "./VideoPluginConnect.dll"
})
.then(
function() {
that.oWebControl
.JS_CreateWnd(that.playWndId, that.width, that.height)
.then(function() {
//JS_CreateWnd创建视频播放窗口宽高可设定
that.init(); //创建播放实例成功后初始化
});
},
function() {}
);
},
cbConnectError: function() {
that.oWebControl = null;
$("#" + that.playWndId).html("插件未启动,正在尝试启动,请稍候...");
WebControl.JS_WakeUp("VideoWebPlugin://"); //程序未启动时执行error函数采用wakeup来启动程序
initCount++;
if (initCount < 3) {
setTimeout(function() {
that.initPlugin();
}, 2000);
} else {
$("#" + that.playWndId).html("插件启动失败,请检查插件是否安装!");
}
},
cbConnectClose: function(bNormalClose) {
that.oWebControl = null
}
})
},
init() {
let that = this;
that.getPubKey(function() {
////////////////////////////////// 请自行修改以下变量值 ////////////////////////////////////
var snapDir = "d:\\SnapDir"; //抓图存储路径
var videoDir = "d:\\VideoDir"; //紧急录像或录像剪辑存储路径
var layout = "1x1"; //playMode指定模式的布局
var enableHTTPS = 1; //是否启用HTTPS协议与综合安防管理平台交互是为1否为0
var encryptedFields = "secret"; //加密字段默认加密领域为secret
var showToolbar = 1; //是否显示工具栏0-不显示非0-显示
var showSmart = 1; //是否显示智能信息如配置移动侦测后画面上的线框0-不显示非0-显示
var buttonIDs = "0,16,256,257,258,259,260,512,515,516,517,768,769"; //自定义工具条按钮
////////////////////////////////// 请自行修改以上变量值 ////////////////////////////////////
that.secret = that.setEncrypt(import.meta.env.VITE_APP_HAIKANG_SECRET);
that.oWebControl
.JS_RequestInterface({
funcName: "init",
argument: JSON.stringify({
appkey: that.appkey, //API网关提供的appkey
secret: that.secret, //API网关提供的secret
ip: that.ip, //API网关IP地址
playMode: that.playMode, //播放模式(决定显示预览还是回放界面)
port: that.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(that.width, that.height); // 初始化后resize一次规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
});
});
},
// 获取公钥
getPubKey(callback) {
var that = this
this.oWebControl.JS_RequestInterface({
funcName: 'getRSAPubKey',
argument: JSON.stringify({
keyLength: 1024
})
}).then(function(oData) {
if (oData.responseMsg.data) {
that.pubKey = oData.responseMsg.data
that.isInit = true
callback()
}
})
},
// 设置窗口控制回调
setCallbacks() {
let that = this;
that.oWebControl.JS_SetWindowControlCallback({
cbIntegrationCallBack: function (oData) {
if(oData.responseMsg.msg.result === 816){
that.$emit('close')
}
}
});
},
// RSA加密
setEncrypt(value) {
let that = this;
var encrypt = new JSEncrypt();
encrypt.setPublicKey(that.pubKey);
return encrypt.encrypt(value);
},
ready() {
let that = this;
return new Promise((resolve, reject) => {
this.wait(
function() {
return that.isInit;
},
6000 + that.timeOut || 500,
100
)
.then(function() {
resolve();
})
.catch(function(err) {
// that.$Message.info({
// content: "视频控件加载超时,请检查:" + err,
// duration: 3
// });
// reject("视频控件加载超时,请检查:" + err);
});
});
},
playBack(codes, startTime, endTime) {
let that = this;
const startTimeStamp = this.timrStr2Stamp(startTime) + "";
const endTimeStamp = this.timrStr2Stamp(endTime) + "";
var recordLocation = 0; //录像存储位置0-中心存储1-设备存储
var transMode = 1; //传输协议0-UDP1-TCP
var gpuMode = 0; //是否启用GPU硬解0-不启用1-启用
var wndId = -1; //播放窗口序号在2x2以上布局下可指定播放窗口
that.oWebControl
.JS_RequestInterface({
funcName: "startPlayback",
argument: JSON.stringify({
cameraIndexCode: codes, //监控点编号
startTimeStamp: startTimeStamp, //录像查询开始时间戳,单位:秒
endTimeStamp: endTimeStamp, //录像结束开始时间戳,单位:秒
recordLocation: recordLocation, //录像存储类型0-中心存储1-设备存储
transMode: transMode, //传输协议0-UDP1-TCP
gpuMode: gpuMode, //是否启用GPU硬解0-不启用1-启用
wndId: wndId //可指定播放窗口
})
})
.then(res => {
console.log("回放的参数", res);
});
},
timrStr2Stamp(str) {
let date = new Date(str);
let time = date.getTime();
return time / 1000;
},
stopPlayBack() {
this.oWebControl.JS_RequestInterface({
funcName: "stopAllPlayback"
});
},
uninit() {
console.log(999);
let that = this;
if (that.oWebControl != null) {
that.oWebControl.JS_RequestInterface({
funcName: "stopAllPreview"
});
that.oWebControl.JS_HideWnd(); // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题
that.oWebControl.JS_Disconnect().then(
function() {
// 断开与插件服务连接成功
},
function() {
// 断开与插件服务连接失败
console.log("oWebControl close error");
}
);
that.oWebControl = null;
}
},
windowChange() {
//列表选项在下方
this.width = document.getElementsByClassName(
this.videoWindowClassName
)[0].scrollWidth;
var btnHeight = 0;
if (document.getElementsByClassName("playBtn").length > 0) {
btnHeight = document.getElementsByClassName("playBtn")[0].clientHeight;
this.height =
document.getElementsByClassName(this.videoWindowClassName)[0]
.scrollHeight -
btnHeight -
10;
} else {
this.height = document.getElementsByClassName(
this.videoWindowClassName
)[0].scrollHeight;
}
if (document.getElementById(this.playWndId)) {
document.getElementById(this.playWndId).style.height = this.height + "px";
document.getElementById(this.playWndId).style.width = this.width + "px";
}
}
}
}
</script>
<style scoped>
</style>