实现海康监控视频播放(录像回放)(抓拍,录像等功能)

news/2024/11/24 14:04:29/

1. 将需要存储的监控抓拍和录像功能存储到本地磁盘,使用输入报存到浏览器缓存里。在created拿取缓存数据,判断缓存里是否有数据。 如果没有弹出输入框。

        <div v-if="cache == true"><el-form><div>抓图存储地址</div><el-form-item><el-inputv-model="address.snapDir"placeholder="如:D:\monitor\Snapshot"style="width: 240px"></el-input></el-form-item><div>录像存储地址</div><el-form-item><el-inputv-model="address.videoDir"placeholder="如:D:\monitor\Vedio"style="width: 240px"></el-input></el-form-item></el-form><el-button @click="fun">保存存储地址</el-button></div>
created() {this.result = window.localStorage.getItem("message_2");if (this.result != null) {this.localStorage = JSON.parse(this.result);} else {this.cache = true;}},methods: {fun() {//对象解析Wie字符串if (this.address.snapDir != undefined &&this.address.videoDir != undefined) {window.localStorage.setItem("message", JSON.stringify(this.address));this.localStorage = this.address;this.cache = false;this.$modal.$msgSuccess("添加成功");} else {this.$message("请输入完整");}},}

 2. 这边逻辑是先调接口拿区域,通过区域查询区域下的监控点,点击监控点之后选择开始时间和结束时间。

注意: 这里的时间只接受时间戳,以秒为单位,如果你转义的时间戳为毫秒那么需要除1000。

     <el-tabsv-model="activeName"type="card":stretch="true"@tab-click="handleClick"v-if="status == true"><el-tab-pane label="监控区域" name="0"><RegionDept @handleNodeClick="handleNodeClick"></RegionDept></el-tab-pane><el-tab-pane :label="label" name="1"><divclass="monitor"v-for="(item, index) in previewList":key="item.cameraAreaId"><spanclass="monitor1":class="active == index ? 'monitor2' : ''"@click="showClick(item, index)">{{ item.name }}</span></div></el-tab-pane></el-tabs><el-formv-if="status == false":model="queryParams"ref="queryForm"size="small":inline="true"style="text-align: center"><el-form-item prop="beginTime"><el-date-pickerv-model="queryParams.startTime"type="datetime"value-format="yyyy-MM-dd HH:mm:ss"placeholder="选择开始时间"></el-date-picker></el-form-item><el-form-item prop="endTime"><el-date-pickerv-model="queryParams.endTime"type="datetime"value-format="yyyy-MM-dd HH:mm:ss"placeholder="选择结束时间"></el-date-picker></el-form-item><el-button type="primary" @click="submitForm">查询</el-button></el-form>
    submitForm() {// 这里是日期格式转时间戳,以秒为单位就不需要除1000,毫秒则需要除1000this.startTime = Date.parse(this.queryParams.startTime)/1000;this.endTime = Date.parse(this.queryParams.endTime)/1000;console.log(this.startTime,this.endTime);this.previewVideo(this.boxList);this.status = true;},

 3. 全部内容

<template><div class="app-container"><el-row :gutter="20"><el-col :span="4" :xs="24"><div v-if="cache == true"><el-form><div>抓图存储地址</div><el-form-item><el-inputv-model="address.snapDir"placeholder="如:D:\monitor\Snapshot"style="width: 240px"></el-input></el-form-item><div>录像存储地址</div><el-form-item><el-inputv-model="address.videoDir"placeholder="如:D:\monitor\Vedio"style="width: 240px"></el-input></el-form-item></el-form><el-button @click="fun">保存存储地址</el-button></div><el-tabsv-model="activeName"type="card":stretch="true"@tab-click="handleClick"v-if="status == true"><el-tab-pane label="监控区域" name="0"><RegionDept @handleNodeClick="handleNodeClick"></RegionDept></el-tab-pane><el-tab-pane :label="label" name="1"><divclass="monitor"v-for="(item, index) in previewList":key="item.cameraAreaId"><spanclass="monitor1":class="active == index ? 'monitor2' : ''"@click="showClick(item, index)">{{ item.name }}</span></div></el-tab-pane></el-tabs><el-formv-if="status == false":model="queryParams"ref="queryForm"size="small":inline="true"style="text-align: center"><el-form-item prop="beginTime"><el-date-pickerv-model="queryParams.startTime"type="datetime"value-format="yyyy-MM-dd HH:mm:ss"placeholder="选择开始时间"></el-date-picker></el-form-item><el-form-item prop="endTime"><el-date-pickerv-model="queryParams.endTime"type="datetime"value-format="yyyy-MM-dd HH:mm:ss"placeholder="选择结束时间"></el-date-picker></el-form-item><el-button type="primary" @click="submitForm">查询</el-button></el-form></el-col><el-col :span="20" :xs="24"><el-container><el-main><div ref="playWndBox"><!-- 视频数据站位 --><divid="playWnd"class="playWnd":style="{height: playWndHeight + 'px',width: playWndWidth + 'px',}"/></div></el-main></el-container></el-col></el-row><el-dialog :title="title" :visible.sync="open" width="200px" append-to-body><div slot="footer" class="dialog-footer"><el-button type="primary"><ahref="/common/download?fileName=VideoWebPlugin.exe"target="_blank">下 载</a></el-button><el-button @click="cancel">取 消</el-button></div></el-dialog></div>
</template>
<script>
import RegionDept from "@/components/regionOptions/index.vue";
import { listPreview } from "@/api/video_preview/index";
export default {components: {RegionDept,},data() {return {active: undefined,label: "监控点(0)",activeName: "0",queryParams: {beginTime: undefined,endTime: undefined,cameraIndexCode: undefined,},status: true,boxList: {},previewList: [],startTime: "",endTime: "",// 视频盒子的高度playWndHeight: "",// 视频盒子的宽度playWndWidth: "",oWebControl: null,initCount: 0,pubKey: "",cameraIndexCode: "", // 监控点编号objData: {appkey: "",ip: "",port: ,secret: "",playMode: 1, // 0 预览 1回放layout: "2x2", //页面展示的模块数【16】},open: false,title: "",result: {},cache: false, // 判断是否有缓存地址localStorage: {}, // 缓存地址数据// 添加缓存地址address: {snapDir: undefined,videoDir: undefined,},};},created() {this.result = window.localStorage.getItem("message");if (this.result != null) {this.localStorage = JSON.parse(this.result);} else {this.cache = true;}},mounted() {// 首次加载时的到父容器的高度this.playWndHeight = this.$refs.playWndBox.clientHeight;// 首次加载时的到父容器的宽度this.playWndWidth = this.$refs.playWndBox.clientWidth - 140;// 初始化摄像头this.$nextTick(() => {this.initPlugin();});// 监听resize事件,使插件窗口尺寸跟随DIV窗口变化window.addEventListener("resize", () => {console.log(this.$refs.playWndBox.clientHeight,this.$refs.playWndBox.clientWidth);if (this.oWebControl != null) {this.oWebControl.JS_Resize(this.$refs.playWndBox.clientWidth - 140,this.$refs.playWndBox.clientHeight);}});},methods: {// 根据id查询监控点getPreview() {let params = {areaId: this.deptId,};listPreview(params).then((res) => {this.previewList = res.data;this.label = "监控点" + "(" + this.previewList.length + " )";});},// 点击改变选中样式showClick(item, index) {this.status = false;this.active = index;this.cameraIndexCode = item.indexCode;this.boxList = item;},// 取消cancel() {this.open = false;},// 确定submitForm() {this.startTime = Date.parse(this.queryParams.startTime)/1000;this.endTime = Date.parse(this.queryParams.endTime)/1000;this.previewVideo(this.boxList);this.status = true;},handleNodeClick(res) {this.deptId = res.deptId;this.getPreview();},handleClick(e) {},// 创建播放实例initPlugin() {let that = this;this.oWebControl = null;that.oWebControl = new WebControl({szPluginContainer: "playWnd", // 指定容器idiServicePortStart: 15900, // 指定起止端口号,建议使用该值iServicePortEnd: 15909,szClassId: "23BF3B0A-2C56-4D97-9C03-0CB103AA8F11", // 用于IE10使用ActiveX的clsidcbConnectSuccess: () => {// 创建WebControl实例成功that.oWebControl.JS_StartService("window", {// WebControl实例创建成功后需要启动服务// 值"./VideoPluginConnect.dll"写死dllPath: "./VideoPluginConnect.dll",}).then(function () {// 设置消息回调that.oWebControl.JS_SetWindowControlCallback({cbIntegrationCallBack: that.cbIntegrationCallBack,});//JS_CreateWnd创建视频播放窗口,宽高可设定that.oWebControl.JS_CreateWnd("playWnd", 1000, 600).then(function () {// 创建播放实例成功后初始化that.init();});},function () {// 启动插件服务失败});},// 创建WebControl实例失败cbConnectError: function () {that.oWebControl = null;that.$message.warning("插件未启动,正在尝试启动,请稍候...");// 程序未启动时执行error函数,采用wakeup来启动程序window.WebControl.JS_WakeUp("VideoWebPlugin://");that.initCount++;if (that.initCount < 3) {setTimeout(function () {that.initPlugin();}, 3000);} else {that.open = true;that.title = "是否需要下载插件";// that.$message.warning("插件启动失败,请检查插件是否安装!");}},cbConnectClose: () => {// 异常断开:bNormalClose = false// JS_Disconnect正常断开:bNormalClose = trueconsole.log("cbConnectClose");that.oWebControl = null;},});},// 初始化init(callback) {let that = this;that.getPubKey(() => {let appkey = that.objData.appkey; //综合安防管理平台提供的appkey,必填let secret = that.setEncrypt(that.objData.secret); //综合安防管理平台提供的secret,必填let ip = that.objData.ip; //综合安防管理平台IP地址,必填let playMode = that.objData.playMode; //初始播放模式:0-预览,1-回放let port = that.objData.port; //综合安防管理平台端口,若启用HTTPS协议,默认443let snapDir = this.localStorage.snapDir; //抓图存储路径let videoDir = this.localStorage.videoDir; //紧急录像或录像剪辑存储路径let layout = that.objData.layout; //playMode指定模式的布局let enableHTTPS = 0; //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1let encryptedFields = "secret"; //加密字段,默认加密领域为secretlet 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"; //自定义工具条按钮// var toolBarButtonIDs = "2049,2304" // 工具栏上自定义按钮that.oWebControl.JS_RequestInterface({funcName: "init",argument: JSON.stringify({appkey: appkey, //API网关提供的appkeysecret: secret, //API网关提供的secretip: ip, //API网关IP地址playMode: playMode, //播放模式(决定显示预览还是回放界面)port: port, //端口snapDir: snapDir, //抓图存储路径videoDir: videoDir, //紧急录像或录像剪辑存储路径layout: layout, //布局enableHTTPS: enableHTTPS, //是否启用HTTPS协议encryptedFields: encryptedFields, //加密字段showToolbar: showToolbar, //是否显示工具栏showSmart: showSmart, //是否显示智能信息buttonIDs, //自定义工具条按钮}),}).then(function (oData) {that.oWebControl.JS_Resize(that.playWndWidth, that.playWndHeight); // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题if (callback) {callback();}// 隐藏// that.oWebControl.JS_HideWnd()});});},// 获取公钥getPubKey(callback) {let 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;callback();}});},// RSA 加密setEncrypt(value) {let that = this;let encrypt = new window.JSEncrypt();encrypt.setPublicKey(that.pubKey);return encrypt.encrypt(value);},// 回调的消息cbIntegrationCallBack(oData) {let { responseMsg: type } = oData;if (type === "error") {console.log(type,type// this.dateFormat(new Date(), "yyyy-MM-dd hh:mm:ss"));} else {console.log(type,type// this.dateFormat(new Date(), "yyyy-MM-dd hh:mm:ss"));}},// 视频回放功能previewVideo(data) {let that = this;let cameraIndexCode = data.indexCode; // 获取输入的监控点编号值,必填let streamMode = 0; // 主子码流标识:0-主码流,1-子码流let transMode = 0; // 传输协议:0-UDP,1-TCPlet gpuMode = 0; // 是否启用GPU硬解,0-不启用,1-启用let wndId = -1; // 播放窗口序号(在2x2以上布局下可指定播放窗口)that.oWebControl.JS_RequestInterface({funcName: "startPlayback",argument: JSON.stringify({cameraIndexCode: cameraIndexCode.trim(), // 监控点编号startTimeStamp: that.startTime,endTimeStamp: that.endTime,streamMode: streamMode, // 主子码流标识transMode: transMode, // 传输协议gpuMode: gpuMode, // 是否开启GPU硬解wndId: wndId, // 可指定播放窗口}),});},// 停止全部预览stopAllPreview() {this.oWebControl.JS_RequestInterface({funcName: "stopAllPreview",});},// 格式化时间dateFormat(val) {// this.// return c;},fun() {//对象解析Wie字符串if (this.address.snapDir != undefined &&this.address.videoDir != undefined) {window.localStorage.setItem("message", JSON.stringify(this.address));this.localStorage = this.address;this.cache = false;this.$modal.$msgSuccess("添加成功");} else {this.$message("请输入完整");}}},// 组件销毁后destroyed() {if (this.oWebControl != null) {// 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题this.oWebControl.JS_HideWnd();// 销毁当前播放的视频this.oWebControl.JS_RequestInterface({ funcName: "destroyWnd" });// 断开与插件服务连接this.oWebControl.JS_Disconnect();}},
};
</script><style lang="scss" scoped>
.monitor {margin: 10px;font-size: 14px;color: #606266;.monitor1 {padding: 6px;display: flex;font-size: 16px;}.monitor2 {display: flex;padding: 10px;font-size: 16px;background-color: rgba(242, 242, 242, 1);}
}.playWnd {margin: 30px 0 0 50px;width: 900px;height: 500px;border: 1px solid red;
}
.cbInfoDiv {float: left;width: 360px;margin-left: 16px;border: 1px solid #7f9db9;
}
.cbInfo {height: 200px;padding: 5px;border: 1px solid #7f9db9;word-break: break-all;overflow: scroll/auto;
}
.operate {margin-top: 24px;
}
.operate::after {content: "";display: block;clear: both;
}
.operate .btns {height: 32px;
}
.module {float: left;width: 120px;min-height: 290px;margin-left: 10px;padding: 16px 8px;box-sizing: border-box;border: 1px solid #e5e5e5;
}
.module .item {margin-bottom: 4px;
}
.module .label {width: 150px;display: inline-block;vertical-align: middle;margin-right: 8px;text-align: right;
}
.module input[type="text"],
.module select {box-sizing: border-box;display: inline-block;vertical-align: middle;margin-left: 0;width: 150px;min-height: 20px;
}
.module .btn {min-width: 80px;min-height: 24px;margin-top: 16px;margin-left: 158px;
}
.el-aside {margin: 0px;height: 84vh;color: #333;background-color: #d3dce6;
}
.el-main {background-color: #e9eef3;color: #333;text-align: center;
}
</style>

4. 最后的实现效果就是这样子的啦

5.监控播放需要下载插件,有需要,或者有问题可在下方评论或私信我。


http://www.ppmy.cn/news/551466.html

相关文章

DXGI高帧率屏幕录像软件源码解析(声音捕获,抓屏,ffmpeg录像,MP4录像,flv录像,麦克风采集)(第4篇编码,录像部分)

本文DEMO源码下载&#xff1a; https://download.csdn.net/download/xjb2006/85109025 dxgi桌面屏幕录像&#xff08;windows屏幕录像&#xff0c;硬件编码&#xff0c;声音捕获&#xff0c;音视频同步&#xff09; 由于篇幅有限&#xff0c;分为4篇发表&#xff1a; 1、SD…

100ask_imx6ull视频监控项目-摄像头和声卡编程(五)

100ask_imx6ull视频监控项目-摄像头和声卡编程(五) 我们如果用程序怎么操作摄像头操作声卡呢 参考第二节的视频&#xff0c;mjpg-streamer库里面查看v4l2uvc.c就可以快速掌握摄像头 不是你是cmos还是什么类型的摄像头&#xff0c;我们的应用程序都可以用一套程序访问不同的硬件…

大华摄像头实现web端实时播放以及录像回放

文章目录 前言一、在乐橙云平台上注册账号并添加设备创建应用二、利用云平台的api获取到前端展示需要的相关信息三、前端页面展示内容总结 前言 前段时间对接了大华摄像头&#xff0c;在此做一次总结&#xff0c;总体思路是&#xff1a;把大华摄像头绑定到乐橙云平台上&#x…

linux系统如何添加硬盘设备

前言&#xff1a; 今天记录一下硬盘方面的知识&#xff0c;主要讲一下分区、挂载方面的知识&#xff0c;心情太郁闷了&#xff0c;假期的最后一天。 1、硬盘的命名规则 现在的硬盘设备一般都会以“/dev/sd”开头&#xff0c;而一台主机上可以有多块硬盘设备&#xff0c;因此系…

word文档解密方法

将加密的文档&#xff0c;另存为&#xff0c;保存类型&#xff0c;选择&#xff0c;Word XML文档&#xff1b;右击xml文档&#xff0c;选择&#xff0c;记事本打开&#xff0c;点击编辑&#xff0c;选择&#xff0c;查找&#xff1b;输入&#xff0c;enforcement&#xff0c;点…

word忘记密码处理

方法一&#xff1a; 用于word各版本。 1、把受保护的文件另存为XML格式&#xff0c;新存的文件用右键以记事本的方式打开&#xff0c;搜索“DocumentProtection”&#xff0c;在前面加上“un”&#xff0c;变为“unDocumentProtection”&#xff0c;保存。 2、用word打开修改后…

word密码忘了怎么解开

Word文件设置了密码&#xff0c;就可以控制自己的文件能够只给指定的人阅读&#xff0c;但是时间久了就忘记了自己设置的密码是什么了。该如何解开呢&#xff1f; 这个可以使用okfone WORD解密大师 解决&#xff0c;可以帮助解决忘记密码问题&#xff0c;也可以解决不能编辑文…

破解docx文档保护密码

破解word 2007文档保护密码 word 2007 设置了文档保护密码后打开文档&#xff0c;只能看&#xff0c;无法修改 解除方法&#xff1a; 1.将扩展名 .docx 改为 .zip 压缩包 2.打开压缩包&#xff0c;名字为“word”的文件夹 3.用记事本等修改里面的 settings.xml,把<w:documen…