首页 > 其他分享 >【Cesium】Vue+js+Cesium实现海康监控视频云台控制

【Cesium】Vue+js+Cesium实现海康监控视频云台控制

时间:2024-06-12 14:57:52浏览次数:29  
标签:function 云台 插件 Vue js 海康 grid 开发包 Cesium

1.硬件设备与视频流接入

        如需要一步上一篇博客

【Cesium】Vue+js+Cesium实现监控视频流接入-CSDN博客文章浏览阅读308次,点赞12次,收藏17次。Vue2+js+Cesium实现监控视频流接入与相机云台控制https://blog.csdn.net/weixin_51540717/article/details/139614406?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22139614406%22%2C%22source%22%3A%22weixin_51540717%22%7D

2.海康WebSDK

        海康管网选择对应的sdk下载
海康开放平台海康威视合作生态致力打造一个能力开放体系、两个生态圈,Hikvision AI Cloud开放平台是能力开放体系的核心内容。它是海康威视基于多年在视频及物联网核心技术积累之上,融合AI、大数据、云计算等技术,为合作伙伴提供的一个二次开发及创新的平台。icon-default.png?t=N7T8https://open.hikvision.com/download/5cda567cf47ae80dd41a54b3?type=10&id=4c945d18fa5f49638ce517ec32e24e24        有下图三个版本的开发包,注意看相关说明,如下图:

        之前在网上看到有用V3.2的开发包写的博客教程,如果有需要的移步此处
        海康威视web3.2开发包开发使用说明_海康isapi文档-CSDN博客文章浏览阅读2.7k次。首言:通过海康威视的最新web开发包工具进行js调用引入至vue项目中,实现监控设备的对接,监控功能的实现。3.2无插件js库同时支持插件安装的模式。目录首言:一、海康威视开发平台:?1、下载开发工具包文档2、专家支持在线咨询问题二、3.2无插件开发1、需要引用的js包2、开发api3、注意事项三、在VUE项目中多个页面引用插件进行监控视频实时显示1、把初始化过程抽象为一个组件2、在不同页面中进行调用四、其他说明1、无插件开发包必须使用nginx代理(无论是测试还是生产环境)_海康isapi文档https://blog.csdn.net/asdfadafd/article/details/123397672在vue中使用海康web3.2插件连接云台摄像机_vue3 海康 mousedownptzcontrol(iptzindex)-CSDN博客文章浏览阅读493次。在index.html文件中先引入需要的脚本。创建一个摄像机组件(复制粘贴直接可用)_vue3 海康 mousedownptzcontrol(iptzindex)https://blog.csdn.net/qq_42556623/article/details/136883903?spm=1001.2014.3001.5501        因为我的设备不支持websocke流,这里我选用的是WEB3.3控件开发包V3.3。

        如果不清楚自己的设备是否支持websocket,咨询官方客服,如果不支持websocke使用3.2版本的开发包会报错。

3.官方示例

        下载完成之后可以用nginx或anywhere发布后登录查看其中的demo示例,

        输入设备的IP地址、端口号、用户名、密码登录并预览,页面如下图:

4.开发包的使用

        (1)安装控件HCWebSDKPlugin.exe

        (2)引入静态资源文件

        在开发包里找到红框中的三个文件,放在前端静态资源文件夹内发布,并在index.html中进行引入。

5.针对官方示例的二次开发

5.1海康demo中的功能封装

        刚开始我抱着将websdk进行改写的想法,但是后来发现demo中的代码量实在是过于大,于是将其中需要的部分拎出来进行了封装。其实demo中的代码看起来量比较大,但是把没用的东西删除掉之后,逻辑挺清晰的。

        个中原因,不方便贴源码,此处截取涉及到的相关代码,如需要自行取用。        

        (1)初始化插件参数及插入插件

    // 初始化
    init() {
        // 初始化插件参数及插入插件
        WebVideoCtrl.I_InitPlugin({
            bWndFull: true,     //是否支持单窗口双击全屏,默认支持 true:支持 false:不支持
            iWndowType: 1,
            cbInitPluginComplete: function () {
                WebVideoCtrl.I_InsertOBJECTPlugin("divPlugin").then(() => {
                    // 检查插件是否最新
                    WebVideoCtrl.I_CheckPluginVersion().then((bFlag) => {
                        if (bFlag) {
                            alert("检测到新的插件版本,双击开发包目录里的HCWebSDKPlugin.exe升级!");
                        }
                    });
                }, () => {
                    alert("插件初始化失败,请确认是否已安装插件;如果未安装,请双击开发包目录里的HCWebSDKPlugin.exe安装!");
                });
            }
        });
        setTimeout(() => {
            this.login();

        }, 1000);
    }

        (2)登录

    // 登录  将下边的四个参数替换成你自己的
    login() {
        var szIP = "IP",
            szPort = "Port",
            szUsername = "username",
            szPassword = "password";

        if ("" == szIP || "" == szPort) {
            return;
        }

        var szDeviceIdentify = szIP + "_" + szPort;

        WebVideoCtrl.I_Login(szIP, 1, szPort, szUsername, szPassword, {
            timeout: 3000,
            success: function (xmlDoc) {
                console.log(' 登录成功',)
                startRealPlay()
            },
            error: function (oError) {
                console.log(' 登录失败',)
            }
        });

        // 预览
        var startRealPlay = function () {
            WebVideoCtrl.I_StartRealPlay(szDeviceIdentify, {
                success: function () {
                    console.log("预览成功");
                },
                error: function (oError) {
                    console.log("预览失败");
                }
            });
        };
    }

        (3)云台控制

    // PTZ控制 9为自动,1,2,3,4,5,6,7,8为方向PTZ

    mouseDownPTZControl(iPTZIndex) {
        if (9 == iPTZIndex && this.g_bPTZAuto) {
            this.iPTZSpeed = 0;// 自动开启后,速度置为0可以关闭自动
        } else {
            this.g_bPTZAuto = false;// 点击其他方向,自动肯定会被关闭
        }

        WebVideoCtrl.I_PTZControl(iPTZIndex, false, {
            iPTZSpeed: this.iPTZSpeed,
            success: function (xmlDoc) {
                if (9 == iPTZIndex && this.g_bPTZAuto) {
                    console.log('停止云台成功')
                } else {
                    console.log('开启云台成功')
                }
                if (9 == iPTZIndex) {
                    this.g_bPTZAuto = !this.g_bPTZAuto;
                }
            },
            error: function (oError) {
                console.log('开启云台失败')
            }
        });
    }

        (4)停止云台控制

    // 方向PTZ停止
    mouseUpPTZControl() {
        WebVideoCtrl.I_PTZControl(1, true, {
            success: function (xmlDoc) {
            },
            error: function (oError) {
                console.log('停止云台失败')
            }
        });
    }

        (5)将上边这几个函数封装在一个class类中

        目前只写了初始化、登录、云台控制,如需要其他的接口方法,可自行进行拓展。

export default class CameraController {
    constructor() {
        this.g_bPTZAuto = false;
        this.iPTZSpeed = 4
    }
    init(){}
    ....
}

5.2类调用与云台控制实现

        个中原因,不方便贴源码,此处截取涉及到的相关代码,如需要自行取用。

        (1)vue代码中撰写云台控制按钮代码

<div id="divPlugin" width="500" height="300" display="none"></div>
<div  class="control-grid">
    <button @mousedown="mouseDownPTZControl(5)" @mouseup="mouseUpPTZControl()"
        class="control-button up-left">
     <!-- &#8598; -->
    </button>
    <button @mousedown="mouseDownPTZControl(1)" @mouseup="mouseUpPTZControl()"
        class="control-button up">&#8593;</button>
    <button @mousedown="mouseDownPTZControl(7)" @mouseup="mouseUpPTZControl()"
        class="control-button up-right">
    <!-- &#8599; -->
    </button>
    <button @mousedown="mouseDownPTZControl(3)" @mouseup="mouseUpPTZControl()"
        class="control-button left">&#8592;</button>
    <button @mousedown="mouseDownPTZControl(9)" @mouseup="mouseUpPTZControl()"
         class="control-button center">
     &#8634;
    </button>
    <button @mousedown="mouseDownPTZControl(4)" @mouseup="mouseUpPTZControl()"
         class="control-button right">&#8594;</button>
    <button @mousedown="mouseDownPTZControl(6)" @mouseup="mouseUpPTZControl()"
         class="control-button down-left">
    <!-- &#8601; -->
    </button>
    <button @mousedown="mouseDownPTZControl(2)" @mouseup="mouseUpPTZControl()"
         class="control-button down">&#8595;</button>
    <button @mousedown="mouseDownPTZControl(8)" @mouseup="mouseUpPTZControl()"
         class="control-button down-right">
     <!-- &#8600; -->
    </button>
</div>

        (2)按钮样式代码

    /* 云台 */
    .control-grid {
        display: grid;
        grid-template-columns: repeat(3, 1fr);
        grid-template-rows: repeat(3, 1fr);
        grid-gap: 0px;
        /* 设置按钮间隔 */
        height: 150px;
        width: 150px;
    }

    .control-button {
        font-size: 24px;
        width: 50px;
        height: 50px;
    }

    .up {
        grid-column: 2;
        grid-row: 1;
    }

    .up-left {
        grid-column: 1;
        grid-row: 1;
    }

    up-right {
        grid-column: 3;
        grid-row: 1;
    }

    left {
        grid-column: 1;
        grid-row: 2;
    }

    center {
        grid-column: 2;
        grid-row: 2;
    }

    right {
        grid-column: 3;
        grid-row: 2;
    }

    down-left {
        grid-column: 1;
        grid-row: 3;
    }

    down {
        grid-column: 2;
        grid-row: 3;
    }

    down-right {
        grid-column: 3;
        grid-row: 3;
    }

        (3)js代码

//引入CameraController类
import CameraController from "../../../../../public/static/thirdParty/HCWebSDKFiles/CameraController.js";

mounted(){
    //通过定时器加载,方式初始化时报错
    setTimeout(()=>{
        this.CameraController = new CameraController();
        this.CameraController.init()
    },200)
}

methods: {
     // 定义按钮方法,并引入类中的方法
     mouseDownPTZControl(type){
        this.CameraController.mouseDownPTZControl(type)
     },
     mouseUpPTZControl(){
        this.CameraController.mouseUpPTZControl()
     },
}

6.实现效果

       【注意】这里三维场景中的视频元素是通过webrtc-streamer接入的,不是通过插件接入。

        点击相应的方向按钮即可实现摄像机旋转控制。

标签:function,云台,插件,Vue,js,海康,grid,开发包,Cesium
From: https://blog.csdn.net/weixin_51540717/article/details/139624104

相关文章

  • 全国省市区县列表最新JSON2024最新
    2024最新JSON数据,2024年更新中国总共有23个省、5个自治区、4个直辖市、2个特别行政区。最近需要用到中国城市列表的json串数据,费了不少时间,终于得到了比较全面的数据暂时应该没有比我更全的了~~~得出以下数据json格式,XML格式(包含省市,县级市,县),总数:2893个因为JSON串比较长,有1......
  • vue 弹框共用
    1.以本人项目为例修改新增使用同一个模态框<el-buttontype="warning"@click="AddCategory">新增一级分类目录</el-button><Dialogref="myDialog"@updateViews="updateViews":input="input":cid="cid"></Dia......
  • vue-json-excel 导出功能
    导出功能1.在vue中使用以下命令安装excel插件npminstallvue-json-excel-S2.在main.js文件中配置全局组件importJsonExcelfrom'vue-json-excel'Vue.component('downloadExcel',JsonExcel)3.在需要导出的.vue页面使用 <download-excel></download-excel><downl......
  • 前端JSZip结合file-saver下载文件打包导出压缩文件
    需求场景:前端拿到下载文件的url,请求并将文件进行分类压缩生成压缩包导出前端导出文件的优点:减轻服务器负担:后端生成压缩文件可能会占用服务器资源和时间。如果压缩的内容很大,可能会导致服务器压力增加,影响其他用户的访问速度。将这些任务转移到前端可以减轻服务器负担,提高......
  • Vue配置项之生命周期(组件生命周期)
    LifecycleHooks首先说明一下,本人是前端小学生级别的菜鸡,吐槽的话请口下留情,在评论区指出错误或者补充不足,我会很喜欢,互喷不会进步,相互指点才会。。。。谢谢大家啦目录LifecycleHooks目录创建阶段(CreationPhase)beforeCreate(创建前):created(创建后):挂载阶段(MountingPha......
  • Vue全局组件
    全局组件首先说明一下,本人是前端小学生级别的菜鸡,吐槽的话请口下留情,在评论区指出错误或者补充不足,我会很喜欢,互喷不会进步,相互指点才会。。。。谢谢大家啦目录全局组件目录内置模板引入模板优点场景缺点......
  • Vue3——ref定义响应式数据
    ref作用ref:定义响应式变量,既可定义基础类型数据,也可以定义对象类型。语法格式:lettemp=ref(初始值)返回值:temp是一个RefImpl的实例对象,简称ref对象,ref对象的value属性是响应式。注意点:JS/TS中使用变量temp操作数据时,需要temp.value,但是在模板中不需要temp.value,直接......
  • vue3 dom ref 实现,子组件ref实现,defineExpose暴露子组件作用域
    示例代码App.vue<template><header><imgalt="Vuelogo"class="logo"src="@/assets/logo.svg"width="125"height="125"/><divclass="wrapper"><HelloWorld......
  • 在Vue3中高级前端是这样给按钮添加loading效果的
    前言一个页面有多个按钮,每个按钮都要添加loading效果,高级前端是如何在Vue3控制按钮是否显示loading效果的呢?普通前端我们先来看看初级普通前端平常是怎么给按钮添加loading效果的:<scriptsetup>import{ref}from'vue'constasyncFn=()=>newPromise(resolve=>......
  • HTML+CSS+JS 倒计时动画效果
    1.整体效果https://mmbiz.qpic.cn/mmbiz_gif/iaVb9cSjKNDeLc7vbAUXJ4yFicKsd2d94ibVgYMJYz3frKeib1tibZhf78kc70gVp9EoqQw16Xzia6OialDaibic9o4iaMfg/640?wx_fmt=gif&from=appmsg&wxfrom=13&tp=wxpic实现了一个倒计时动画效果,包括数字区域和倒计时结束区域。数字区域显......