452 lines
16 KiB
Vue
Raw Normal View History

2022-10-21 11:21:47 +08:00
<template>
<div class="maxBox">
<div class="videoTop">
<span style="margin-left:10px">储存方式:</span>
<el-select class="selectDev" size="mini" v-model="locationValue"
@visible-change="visibleChange" placeholder="请选择">
<el-option label="中心存储" :value="0" ></el-option>
<el-option label="设备存储" :value="1" ></el-option>
</el-select>
<span>回放开始时间:</span>
<el-date-picker
size="medium"
class="selectDev"
v-model="startTime"
type="datetime"
placeholder="选择开始时间"
value-format="yyyy-MM-dd hh:mm:ss"
@focus="get"
@blur="lost"
></el-date-picker>
<span>回放结束时间:</span>
<el-date-picker
size="medium"
class="selectDev"
v-model="endTime"
type="datetime"
placeholder="选择结束时间"
value-format="yyyy-MM-dd hh:mm:ss"
@focus="get"
@blur="lost"
></el-date-picker>
<span
class="videoType"
id="startPlayback"
@click="startPlayback"
>开始</span
>
</div>
<div id="playWnds" class="playWnds"></div>
</div>
</template>
<script>
export default {
props: ["devList",],
data() {
return {
videoType:"",
startTime: '',
endTime:'',
2022-10-21 11:21:47 +08:00
locationValue:1,
//声明公用变量
initCount: 0,
//初始化参数
initparam: {
appKey: "",
secret: "",
apiIp: "",
apiPort: 443,
layout: "2x2" //这里是来控制你一开始初始化之后的分屏的
},
pointCode: "",//监控点编号
pubKey: "",
oWebControl: null,
WebControl: null,
width:'',
height:""
};
},
// props: ["videoPlatformId", "indexCode"],
created() {
this.initparam.appKey = this.devList[0].appId
this.initparam.secret = this.devList[0].appSecret
this.initparam.apiIp = this.devList[0].account
this.initparam.apiPort = this.devList[0].password
this.pointCode = this.devList[0].serialNumber
// 时间处理
//设置录像回放时间的默认值
this.endTime = this.dateFormat(new Date(), "yyyy-MM-dd hh:mm:ss");
this.startTime = this.dateFormat(new Date(), "yyyy-MM-dd 00:00:00");
console.log('当前时间默认', endTime)
console.log('当前时间', startTime)
2022-10-21 11:21:47 +08:00
// console.log('拿到的对象',this.initparam)
//调用电脑中的插件
this.WebControl = WebControl;
},
// 此处应该是value
watch: {
devList: function(newVal, oldVal) {
console.log('新的值',newVal)
this.pointCode = newVal[0].serialNumber;
this.startPlayback();
2022-10-21 11:21:47 +08:00
}
},
mounted() {
// this.init();
//页面加载时创建播放实例初始化
this.initPlugin();
console.log('====')
var ratio = this.getRatio()
console.log('======比例',this.getRatio())
let w1 = document.getElementById('playWnds').offsetWidth
let h1 = document.getElementById('playWnds').offsetHeight
this.width = w1 * ratio
this.height = h1 * ratio
console.log('宽高',this.width,this.height)
// 监听resize事件使插件窗口尺寸跟随DIV窗口变化
$(window).resize(() => {
if (this.oWebControl != null) {
this.oWebControl.JS_Resize(this.width, this.height);
this.setWndCover();
}
});
// 监听滚动条scroll事件使插件窗口跟随浏览器滚动而移动
$(window).scroll(() => {
if (this.oWebControl != null) {
this.oWebControl.JS_Resize(this.width, this.height);
this.setWndCover();
}
})
},
beforeDestroy() {
this.closeWindow();//关闭插件
},
methods: {
visibleChange(visible) {
visible ? this.show() : this.hide()
},
get(){
this.show()
},
lost(){
this.hide()
},
show() {
this.oWebControl.JS_HideWnd();
},
hide() {
this.oWebControl.JS_ShowWnd();
},
// this.oWebControl.JS_ShowWnd();
// 创建WebControl实例与启动插件
initPlugin() {
this.oWebControl = new WebControl({
szPluginContainer: "playWnds", // 指定容器id
iServicePortStart: 15900, // 指定起止端口号,建议使用该值
iServicePortEnd: 15909,
szClassId: "23BF3B0A-2C56-4D97-9C03-0CB103AA8F11", // 用于IE10使用ActiveX的clsid
cbConnectSuccess: () => {
// 创建WebControl实例成功
this.oWebControl
.JS_StartService("window", {
// WebControl实例创建成功后需要启动服务
dllPath: "./VideoPluginConnect.dll" // 值"./VideoPluginConnect.dll"写死
})
.then(
() => {
console.log('=========初始化成功'),
// 启动插件服务成功
this.oWebControl.JS_SetWindowControlCallback({
// 设置消息回调
cbIntegrationCallBack: this.cbIntegrationCallBack() // 封装的推送消息方法
});
this.oWebControl.JS_CreateWnd("playWnds",this.width, this.height).then(() => {
//JS_CreateWnd创建视频播放窗口宽高可设定
this.init(); // 创建播放实例成功后初始化
});
},
function() {
// 启动插件服务失败
}
);
},
cbConnectError: () => {
// 创建WebControl实例失败
this.oWebControl = null;
this.WebControl.JS_WakeUp("VideoWebPlugin://"); // 程序未启动时执行error函数采用wakeup来启动程序
this.initCount++;
if (this.initCount < 3) {
setTimeout(() => {
this.initPlugin(); // 重新创建播放实例
}, 3000);
} else {
console.log("插件启动失败,请检查插件是否安装!");
}
},
cbConnectClose: bNormalClose => {
// 异常断开bNormalClose = false
// JS_Disconnect正常断开bNormalClose = true
this.oWebControl = null;
}
});
},
// 设置窗口控制回调
setCallbacks() {
this.oWebControl.JS_SetWindowControlCallback({
cbIntegrationCallBack: this.cbIntegrationCallBack // 封装的推送消息方法
});
},
// 推送消息
cbIntegrationCallBack(oData) {
//oData是封装的视频web插件回调信息的消息体
// console.log(JSON.stringify(oData.responseMsg)); //此处为视频web插件消息json报文字符串
},
//初始化
init() {
this.getPubKey(() => {
////////////////////////////////// 请自行修改以下变量值 ////////////////////////////////////
var appkey = this.initparam.appKey; //综合安防管理平台提供的appkey必填
var secret = this.setEncrypt(this.initparam.secret); //综合安防管理平台提供的secret必填
var ip = this.initparam.apiIp; //综合安防管理平台IP地址必填
var playMode = 1; //初始播放模式0-预览1-回放
var port = this.initparam.apiPort; //综合安防管理平台端口若启用HTTPS协议默认443
port = parseInt(port);
var snapDir = "D:\\SnapDir"; //抓图存储路径
var videoDir = "D:\\VideoDir"; //紧急录像或录像剪辑存储路径
var layout = this.initparam.layout; //playMode指定模式的布局
var enableHTTPS = 1; //是否启用HTTPS协议与综合安防管理平台交互这里总是填1
var encryptedFields = "secret"; //加密字段默认加密领域为secret
var showToolbar = 1; //是否显示工具栏0-不显示非0-显示
var showSmart = 1; //是否显示智能信息如配置移动侦测后画面上的线框0-不显示非0-显示
var 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 => {
this.oWebControl.JS_Resize(this.width, this.height); // 初始化后resize一次规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
console.log('=====第二步')
// this.startpreview(); //初始化后开启预览
console.log('appkey',this.initparam.appKey)
console.log('appkey',this.initparam.apiIp)
});
});
},
//获取公钥
getPubKey(callback) {
this.oWebControl
.JS_RequestInterface({
//通用请求响应接口
funcName: "getRSAPubKey", // 功能标识
argument: JSON.stringify({
keyLength: 1024 // 秘钥长度可选1024或2048
})
})
.then(oData => {
if (oData.responseMsg.data) {
// 当code为-1时无data字段
this.pubKey = oData.responseMsg.data; // 返回的数据如RSA公钥
callback();
}
});
},
// 页面缩放比例
getRatio() {
let bodyWidth = document.body.clientWidth
// console.log(window.screen.width)
let bodyHeight = document.body.clientHeight
let scaleWidthNum = bodyWidth / 1920
let scaleHeightNum = bodyHeight / 1080
let ratio;
if (scaleWidthNum > scaleHeightNum) {
ratio = scaleHeightNum
} else {
ratio = scaleWidthNum
}
return ratio;
},
//RSA加密
setEncrypt(value) {
var encrypt = new JSEncrypt();
encrypt.setPublicKey(this.pubKey);
return encrypt.encrypt(value);
},
// 设置窗口裁剪当因滚动条滚动导致窗口需要被遮住的情况下需要JS_CuttingPartWindow部分窗口
setWndCover() {
var iWidth = $(window).width();
var iHeight = $(window).height();
var oDivRect = $("#playWnds")
.get(0)
.getBoundingClientRect();
var iCoverLeft = oDivRect.left < 0 ? Math.abs(oDivRect.left) : 0;
var iCoverTop = oDivRect.top < 0 ? Math.abs(oDivRect.top) : 0;
var iCoverRight = oDivRect.right - iWidth > 0 ? Math.round(oDivRect.right - iWidth) : 0;
var iCoverBottom = oDivRect.bottom - iHeight > 0 ? Math.round(oDivRect.bottom - iHeight) : 0;
iCoverLeft = iCoverLeft > this.width ? this.width : iCoverLeft;
iCoverTop = iCoverTop > this.height ? this.height : iCoverTop;
iCoverRight = iCoverRight > this.width ? this.width : iCoverRight;
iCoverBottom = iCoverBottom > this.height ? this.height : iCoverBottom;
this.oWebControl.JS_RepairPartWindow(0, 0, this.width, this.height); // 多1个像素点防止还原后边界缺失一个像素条
if (iCoverLeft != 0) {
this.oWebControl.JS_CuttingPartWindow(0, 0, iCoverLeft, this.height);
}
if (iCoverTop != 0) {
this.oWebControl.JS_CuttingPartWindow(0, 0, this.width, iCoverTop); // 多剪掉一个像素条,防止出现剪掉一部分窗口后出现一个像素条
}
if (iCoverRight != 0) {
this.oWebControl.JS_CuttingPartWindow(
this.width - iCoverRight,
0,
iCoverRight,
this.height
);
}
if (iCoverBottom != 0) {
this.oWebControl.JS_CuttingPartWindow(
0,
this.height - iCoverBottom,
this.width,
iCoverBottom
);
}
},
//录像回放功能
startPlayback(){
console.log('点击查看',this.locationValue)
console.log('编号',this.pointCode)
console.log('开始时间', new Date(this.startTime).getTime() / 1000 )
var cameraIndexCode = this.pointCode; //获取输入的监控点编号值,必填
var startTimeStamp = new Date(this.startTime).getTime(); //回放开始时间戳,必填
var endTimeStamp = new Date(this.endTime).getTime(); //回放结束时间戳,必填
var recordLocation = +this.locationValue; //录像存储位置0-中心存储1-设备存储
var transMode = 1; //传输协议0-UDP1-TCP
var gpuMode = 0; //是否启用GPU硬解0-不启用1-启用
var wndId = -1; //播放窗口序号在2x2以上布局下可指定播放窗口
console.log('====参数',cameraIndexCode,startTimeStamp,endTimeStamp,recordLocation)
this.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-UDP1-TCP
gpuMode: gpuMode, //是否启用GPU硬解0-不启用1-启用
wndId:wndId //可指定播放窗口
})
}).then((res)=>{
// console.log('====到这一步了吗')
console.log('请求结果',res)
})
},
// 格式化时间
dateFormat(oDate, fmt) {
var o = {
"M+": oDate.getMonth() + 1, //月份
"d+": oDate.getDate(), //日
"h+": oDate.getHours(), //小时
"m+": oDate.getMinutes(), //分
"s+": oDate.getSeconds(), //秒
"q+": Math.floor((oDate.getMonth() + 3) / 3), //季度
"S": oDate.getMilliseconds()//毫秒
};
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (oDate.getFullYear() + "").substr(4 - RegExp.$1.length));
}
for (var k in o) {
if (new RegExp("(" + k + ")").test(fmt)) {
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
}
}
return fmt;
},
2022-10-21 11:21:47 +08:00
//关闭视频窗口
closeWindow() {
if (this.oWebControl != null) {
this.oWebControl.JS_HideWnd(); // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题
this.oWebControl.JS_Disconnect().then(
() => {
// 断开与插件服务连接成功
},
() => {
// 断开与插件服务连接失败
}
);
}
}
}
};
</script>
<style lang="less" scoped>
.maxBox{
// width: calc(100% - 300px);
height: calc(100% - 100px);
width: 100%;
// height: 100%;
.videoTop{
color: #fff;
.videoType{
cursor: pointer;
border-radius: 3px;
height: 34px;
width: 60px;
text-align: center;
line-height: 34px;
color: #ffffff;
font-size: 15px;
margin-right: 17px;
display:inline-block;
background-color: #00cccd;
}
}
.playWnds{
margin-top: 20px;
width: 100%;
height: 100%;
}
}
</style>