452 lines
16 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>
<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:'',
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)
// console.log('拿到的对象',this.initparam)
//调用电脑中的插件
this.WebControl = WebControl;
},
// 此处应该是value
watch: {
devList: function(newVal, oldVal) {
console.log('新的值',newVal)
this.pointCode = newVal[0].serialNumber;
this.startPlayback();
}
},
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;
},
//关闭视频窗口
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>