333 lines
10 KiB
Vue
333 lines
10 KiB
Vue
|
|
<template>
|
|||
|
|
|
|||
|
|
<!-- 绑定父组件class:videoWindow -->
|
|||
|
|
<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-UDP,1-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-UDP,1-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>
|