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_2", JSON.stringify(this.address));this.localStorage = this.address;this.cache = false;his.$modal.$msgSuccess("添加成功");} else {this.$message("请输入完整");}},}

2. 这边逻辑是先调接口拿区域,通过区域查询区域下的监控点,点击监控点,传监控点编号。

当然如果你能直接拿到监控点的编号就不用这么麻烦,直接传即可。

        <el-collapse v-model="activeNames" @change="handleChange"><el-collapse-item title="监控点" name="2"><el-tabsv-model="activeName"type="card":stretch="true"@tab-click="handleClick"><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-collapse-item></el-collapse>

3. 全部内容

<template><div class="app-container"><el-row :gutter="20"><el-col :span="5" :xs="20"><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-collapse v-model="activeNames" @change="handleChange"><el-collapse-item title="监控点" name="2"><el-tabsv-model="activeName"type="card":stretch="true"@tab-click="handleClick"><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-collapse-item></el-collapse></el-col><el-col :span="19" :xs="20"><div class="views"><el-row :gutter="10"><el-container><el-main><div ref="playWndBox"><!-- 视频数据站位 --><divid="playWnd"class="playWnd":style="{height: playWndHeight + 'px',width: playWndWidth + 'px',}"/></div></el-main></el-container></el-row></div></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="http://hengfengpc.hfwysz.cn/common/download?fileName=VideoWebPlugin.exe"target="_blank">下 载</a></el-button><el-button @click="cancel">取 消</el-button></div></el-dialog></div>
</template><script>
import { listPreview } from "@/api/video_preview/index";
import RegionDept from "@/components/regionOptions/index.vue";
export default {components: {RegionDept,},created() {this.result = window.localStorage.getItem("message_2");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);}});},data() {return {active: undefined,activeName: "0",activeNames: ["2"],label: "监控点(0)",open: false,title: "",// 区域iddeptId: "",// 根据区域id查询监控数组数据previewList: [],form: {oldCameraIndexCode: undefined,newCameraIndexCode: undefined,},// 预览画面参数配置previewPictureList: [],brightness: 0,hue: 0,contrast: 0,saturation: 0,// 视频盒子的高度playWndHeight: "",// 视频盒子的宽度playWndWidth: "",oWebControl: null,initCount: 0,pubKey: "",cameraIndexCode: "", // 监控点编号objData: {appkey: "",ip: "",port: ,secret: "",playMode: 0, // 0 预览 1回放layout: "2x2", //页面展示的模块数【16】},result: {},cache: false, // 判断是否有缓存地址localStorage: {}, // 缓存地址数据// 添加缓存地址address: {snapDir: undefined,videoDir: undefined,},};},methods: {handleNodeClick(res) {this.deptId = res.deptId;this.getPreview();},// 根据id查询监控点getPreview() {let params = {areaId: this.deptId,};listPreview(params).then((res) => {this.previewList = res.data;this.label = "监控点" + "(" + this.previewList.length + " )";});},// // 点击改变选中样式showClick(item, index) {this.active = index;this.previewVideo(item);},// 取消cancel() {this.open = false;},// 创建播放实例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");this.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 = that.localStorage.snapDir; //抓图存储路径let videoDir = that.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: "startPreview",argument: JSON.stringify({cameraIndexCode: cameraIndexCode.trim(), // 监控点编号streamMode: streamMode, // 主子码流标识transMode: transMode, // 传输协议gpuMode: gpuMode, // 是否开启GPU硬解wndId: wndId, // 可指定播放窗口}),});},// 停止全部预览stopAllPreview() {this.oWebControl.JS_RequestInterface({funcName: "stopAllPreview",});},// 格式化时间dateFormat(oDate, fmt) {let 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 (let 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;},fun() {//对象解析Wie字符串if (this.address.snapDir != undefined &&this.address.videoDir != undefined) {window.localStorage.setItem("message_2", JSON.stringify(this.address));this.localStorage = this.address;this.cache = false;this.$message("添加成功");} 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">
::v-deep .el-dialog__body {padding: 0;
}
.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);}
}
::v-deep .el-collapse-item__content {border: 1px solid #e6ebf5;
}::v-deep .el-collapse-item__header {background: #f2f2f2;padding: 0 6px;
}.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. 监控播放需要下载插件安装海康web插件,去海康威视官网上下载,官方不支持Mac,只支持Windows

海康开放平台

实现海康监控视频播放(实时预览)(抓拍,录像,对讲等功能)相关推荐

  1. 海康网络摄像头实时视频预览(流媒体转码推流 red5,nginx-rtmp,ffmpeg)

    海康网络摄像头实时视频预览(流媒体转码推流 red5,nginx-rtmp,ffmpeg) 实现思路 获取摄像头rtsp流→流媒体拉流转码推流成rtmp流(网页具备flash可播放)→根据rtmp流地 ...

  2. 调用海康视频接口获取预览取流的URL

    开始之前请参考海康官方SDK文档 鉴于前段时间刚接触视频这一块,整理了自己的一些经验,具体的你们还是参考文档来吧 附上文档地址 https://open.hikvision.com/docs/docI ...

  3. java接口方式调用海康大华摄像机预览。

    客户有海康和大华的监控设备,没有买各类安防平台,国标方式需要预留给其他需要接入的系统,得兼容高版本chrome,询问了大华的客服人员,最后选择了该方案进行解决,记录下曲折的过程.延迟大约10秒的样子, ...

  4. 大华监控前端实时预览(DHplayer)官方插件

    介绍:采用vue2+大华官方插件DHplaye+rtsp拉流实现前端预览 1.根据官方文档安装引入插件 2.再vue项目中引入插件 import DHPlayer from '@/components ...

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

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

  6. 海康API——获取监控点预览取流URL,获取的rtmp流不能播放

    取rtmp流时,不要expand这一句

  7. uni-app 海康实时视频预览、录像回放、倍数回放、抓图、声音、录像、语言对讲、鱼眼 V2

    地址:海康实时视频预览.录像回放.倍数回放.抓图.声音.录像.语言对讲.鱼眼 V2 - DCloud 插件市场 海康iSecure Center实时视频预览.录像回放.倍数回放.抓图.声音.录像.语言 ...

  8. 网络监控摄像头流媒体视频管理平台实时预览零延迟支持海康威视浙江大华宇视等解决方案分析

    方案简介 网络摄像头监控视频低延迟一直是一个比较难以解决的问题,很多非音视频开发专业的技术人员,花费了大量精力开发出来的各种集成网络监控摄像头在浏览器Web网页实时播放的程序,要么延迟非常高,要么及其 ...

  9. C# 海康摄像头视频播放的两种方式

    题外话:看到很多朋友有此方面的问题,各种途径联系到我,在此声明,可以发邮件到jimi080180@qq.com进行沟通,也提供有偿项目模块外包服务. 目前市面上海康的摄像头占有率还是很高的,如果要用海 ...

最新文章

  1. uml 工具_【推荐】灵活而丰富UML建模工具Enterprise Architect!
  2. Android -- 带你从源码角度领悟Dagger2入门到放弃(一)
  3. 八皇后解法(回溯法)
  4. 爬虫文档学习 xpath bs4 selenium scrapy...
  5. 错误代码0x800f0950怎么解决_解决win10安装net framework 3.5失败(错误代码 0x800F0950)...
  6. markdown 流程图_测试了12款Markdown编辑器,推荐一个最好用的!
  7. Java相关技术文档汇总
  8. WIFI、路由器、猫、AP管理
  9. oracle同一个库不同用户,oracle同一个库上面,不同用户相互赋予权限
  10. 卸载windows电脑软件,这样卸载才干净
  11. 淘宝短视频,为什么搬运的短视频没有流量?从算法角度分析
  12. 【Unity3D】Unity 组件 ④ ( 摄像机 | 调整摄像机 | 手工调整 | 3D 视图对齐 Align with View 调整摄像机 )
  13. 体验国产Linux系统,开局就翻车了…
  14. 人心比万物都诡诈,谁能识透呢?
  15. Quartz的使用说明
  16. 我开挂的 2018!
  17. PNETCDF 和NETCDF安装分享
  18. 零打碎敲学Android(三)—俄罗斯,你为什么是方块的?
  19. Flex 布局语法教程
  20. be carefull in c

热门文章

  1. 近期接触到大数据业务,速上地图采集器图文教程仅供参考
  2. java手机怎样越狱_ipad怎么自己越狱 两种方法介绍【图文】
  3. 中国嫦娥升空了,美国登月神话破产了
  4. 【sqoop2】创建job报错There are issues with entered data, please revise your input
  5. SAE英文会议论文模板及翻译
  6. MySQL基础语法与JDBC
  7. 浅谈 yso的 Commons-Collections1 (cc1)反序列化链 如何手写这条链子
  8. C语言------进制转换器
  9. webpack之entry
  10. 游程编码用matlab实现代码_二值图像游程编码matlab代码