vue项目集成萤石云摄像头,实现监控、云台控制(左右移动)、全屏、声音等功能,以及集成遇到的问题

        新项目需要用到萤石云的摄像头监控,通过轻应用集成后客户又提出要控制移动,声音、全屏等功能,记录一下开发过程及踩坑经历。先看效果demo:

        垃圾萤石云API文档各种不全,查了半天资料没有一种能全部实现的方式,只能自己东拼西凑来解决,以下提供2中集成方案:

1、ezopen零门槛视频接入(iframe)集成:

<iframe :src="videoUrl" style="width: 100%;margin-bottom: 10px;" class="row_video_css">

        <div class="btn_box">
            <el-button round  size="mini" icon="el-icon-top-left" @click="directionControl(4)"></el-button>
            <el-button round  size="mini" icon="el-icon-top" @click="directionControl(0)"></el-button>
            <el-button round  size="mini" icon="el-icon-top-right" @click="directionControl(6)"></el-button>
            <el-button round  size="mini" icon="el-icon-back" @click="directionControl(2)"></el-button>
            <el-button round  size="mini" icon="el-icon-video-play" @click="stopTurn"></el-button>
            <el-button round  size="mini" icon="el-icon-right" @click="directionControl(3)"></el-button>
            <el-button round  size="mini" icon="el-icon-bottom-left" @click="directionControl(5)"></el-button>
            <el-button round  size="mini" icon="el-icon-bottom" @click="directionControl(1)"></el-button>
            <el-button round  size="mini" icon="el-icon-bottom-right" @click="directionControl(7)"></el-button>
          </div>


//控制地方法:
//控制云台
    directionControl(num) {
      axios({
        url:'https://open.ys7.com/api/lapp/device/ptz/start',
        method: 'post',
        params: {
          accessToken: this.accessToken, //accesstoken码,一般一周过期
          speed:2, //旋转速度
          direction:num, //方向,传入数字,对应数字在api文档有
          channelNo:1, // 通道号
          deviceSerial:this.basicInformation.DeviceSerial //序列号
        },
        timeout: 2000
      }).then(res=>{
        if(res.data.code == '60000' ){
          this.$message(res.data.msg)
        }
      })
    },
//停止控制控制云台
    stopTurn(){
      axios({
        url:'https://open.ys7.com/api/lapp/device/ptz/stop',
        method: 'post',
          params: {
            accessToken: this.accessToken, 
            // direction:num,
            channelNo:1, // 通道号
            deviceSerial:this.basicInformation.DeviceSerial  //序列号
          },
          timeout: 2000
      }).then(res=> {
        //  console.log(res.data)
        if(res.data.code == '60000' ){
          this.$message(res.data.msg)
        }
      })
    },

/*注释*/
//videoUrl:
//后端/前端通过接口获取,必要传参:accessKey、accessSecret,获取token后拼接成视频地址
videoUrl = "https://open.ys7.com/ezopen/h5/iframe?url=" + accessURL + "&accessToken=" + accessToken

accessURL是预览监控地址,获取途径(示例:)控制台——设备管理——播放地址栏选监控,里面的地址复制出来

accessToken通过接口获取,参考地址:文档概述 · 萤石开放平台API文档

云台控制参考地址:文档概述 · 萤石开放平台API文档

2、通过轻应用集成云台控制实现(目前使用版本,有部分现成的API,我懒,所以选这个),上代码:

安装依赖:

npm install ezuikit-js@7.7.7

注意:最新版依赖运行不起来,不知道是不是我自己环境的问题,反正很坑,切换到7.7.7版本正常运行

template部分

<div id="ezuikit-player"></div>
          <div class="btn_box" style="text-align: right">
            <el-tooltip class="item" effect="dark" content="左移" placement="bottom">
              <el-button round  size="mini" icon="el-icon-back" @click="directionControl(2)"></el-button>
            </el-tooltip>
            <el-tooltip class="item" effect="dark" content="上移" placement="bottom">
              <el-button round  size="mini" icon="el-icon-top" @click="directionControl(0)"></el-button>
            </el-tooltip>
            <el-tooltip class="item" effect="dark" content="停止移动" placement="bottom">
              <el-button round  size="mini" icon="el-icon-video-play" @click="stopTurn"></el-button>
            </el-tooltip>
            <el-tooltip class="item" effect="dark" content="下移" placement="bottom">
              <el-button round  size="mini" icon="el-icon-bottom" @click="directionControl(1)"></el-button>
            </el-tooltip>
            <el-tooltip class="item" effect="dark" content="右移" placement="bottom">
              <el-button round  size="mini" icon="el-icon-right" @click="directionControl(3)"></el-button>
            </el-tooltip>
            <el-tooltip class="item" effect="dark" content="开启声音" placement="bottom">
              <el-button round  size="mini" icon="el-icon-bell" v-on:click="openSound"></el-button>
            </el-tooltip>
            <el-tooltip class="item" effect="dark" content="关闭声音" placement="bottom">
              <el-button round  size="mini" icon="el-icon-close-notification" v-on:click="closeSound"></el-button>
            </el-tooltip>
            <el-tooltip class="item" effect="dark" content="全屏" placement="bottom">
              <el-button round  size="mini" icon="el-icon-full-screen" v-on:click="fullScreen"></el-button>
            </el-tooltip>
          </div>

script部分

import EZUIKit from "ezuikit-js";

mounted() {
    this.initPlayer();//初始化萤石云摄像头
},
methods: {
    //初始化萤石云摄像头
    initPlayer(){
      if (this.player) {
        this.destroy();
      }
      //请求接口获取token
      basicDataApi.cpxqGetYSYToken({key: this.rowData.accessKey,secret:this.rowData.accessSecret}).then((res)=>{
        if(res.code == 200){
          this.accessToken = res.result.data.accessToken
          // 初始化设备
          this.player = new EZUIKit.EZUIKitPlayer({
            id: `ezuikit-player`,
            url: 'ezopen://open.ys7.com/BB6255228/1.hd.live',
            accessToken: this.accessToken,
            height:this.playerHeight
          })
        }else{
          this.videoUrl=""
        }
      })
    },
    //销毁
    destroy(){
      this.player.destroy();
      this.player = null;
    },
    //全屏
    fullScreen() {
      this.player.fullScreen();
    },
    //控制台
    controlPlat() {
      this.player.openPtz();
    },
    //开启声音
    openSound() {
      this.player.openSound();
    },
    //关闭声音
    closeSound() {
      this.player.closeSound();
    },
    //控制云台
    directionControl(num) {
      axios({
        url:'https://open.ys7.com/api/lapp/device/ptz/start',
        method: 'post',
        params: {
          accessToken: this.accessToken, //accesstoken码,一般一周过期
          speed:2, //旋转速度
          direction:num, //方向,传入数字,对应数字在api文档有
          channelNo:1, // 通道号
          deviceSerial:this.basicInformation.DeviceSerial //序列号
        },
        timeout: 2000
      }).then(res=>{
        if(res.data.code == '60000' ){
          this.$message(res.data.msg)
        }
      })
    },
    //停止控制控制云台
    stopTurn(){
      axios({
        url:'https://open.ys7.com/api/lapp/device/ptz/stop',
        method: 'post',
          params: {
            accessToken: this.accessToken, 
            // direction:num,
            channelNo:1, // 通道号
            deviceSerial:this.basicInformation.DeviceSerial  //序列号
          },
          timeout: 2000
      }).then(res=> {
        //  console.log(res.data)
        if(res.data.code == '60000' ){
          this.$message(res.data.msg)
        }
      })
    },
}

其中直接调用方法的地方参考官方API文档:文档概述 · 萤石开放平台API文档

但是垃圾文档里开启云台方法不生效,咋调试都没出来,所以只能自己加上云台控制的方法。代码没整理,懒得弄了,就这样吧。

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Vue.js萤石云监控可以通过以下步骤实现全屏功能。 首先,在Vue.js的组件中,需要引入萤石云监控的SDK,以便能够与监控设备进行交互。可以通过在`<head>`标签中引入SDK的链接,或者使用NPM包管理工具进行安装。 接下来,在Vue.js的组件中,创建一个DOM元素,用于显示监控画面。可以使用`<div>`或者`<canvas>`等标签来创建DOM元素。 然后,在Vue.js的`mounted`生命周期钩子函数中,实例化萤石云监控SDK,并将SDK的实例与之前创建的DOM元素进行绑定,以便能够将监控画面显示在这个DOM元素中。 在绑定完成后,可以通过调用SDK实例的方法,来加载监控设备的视频流,并将视频流显示在之前创建的DOM元素中。 最后,实现全屏功能可以通过在Vue.js的组件中添加一个按钮或者其他的交互元素,并在点击事件中调用浏览器的全屏API来实现。可以通过`document.documentElement.requestFullscreen()`或者`element.requestFullscreen()`方法来进入全屏模式,其中`element`是之前创建的DOM元素。 需要注意的是,在进入全屏模式时,需要浏览器的支持,不同的浏览器可能有不同的API调用方式。在调用全屏API之前,最好先进行一些兼容性检测,以确保在不同浏览器上都能正常运行。 以上就是使用Vue.js萤石云监控实现全屏功能的基本步骤。具体的实现细节还需要根据具体的项目情况来调整和完善。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值