uniapp对接萤石云 实现监控播放、云台控制、截图、录像、历史映像等功能

萤石云开发平台地址:文档概述 · 萤石开放平台API文档 (ys7.com)

萤石云监控播放

  • 首先引入萤石云js

js地址:GitHub - Ezviz-OpenBiz/EZUIKit-JavaScript-npm: 轻应用npm版本,降低接入难度,适配自定义UI,适配主流框架

video.vue

<template>
	<view class="content">
		<view class="preview" id="video-container"></view>
		<view>
			<button @click="ezuikit.stop">stop</button>
			<button @click="ezuikit.play">play</button>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				strings: ' '
			}
		},
		methods: {
			
		}
	}
</script>

<script module="ezuikit" lang="renderjs">
	var player = null;

	export default {
	
		mounted() {
			console.log('mounted...');

			if (typeof window.EZUIKit !== 'undefined') {
				
				console.log('defined EZUIKit...');
				this.initPlayer();
			} else {
				
				console.log('undefined EZUIKit...');				
				// 动态引入较大类库避免影响页面展示
				const script = document.createElement('script')
				// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
				script.src = 'static/ezuikit.js'
				script.onload = this.initPlayer.bind(this)
				document.head.appendChild(script)
			}
		},

		methods: {
			initPlayer() {
				const {
					windowWidth,
					windowHeight
				} = uni.getSystemInfoSync();
				console.log('initPlayer...');
						
				fetch('https://open.ys7.com/jssdk/ezopen/demo/token')
				      .then(response => response.json())
				      .then(res => {
				        var accessToken = res.data.accessToken;
				        player = new EZUIKit.EZUIKitPlayer({
				          id: 'video-container', // 视频容器ID
				          accessToken: accessToken,
				          url: 'ezopen://open.ys7.com/G39444019/1.live',
				          // simple - 极简版; pcLive-pc直播;pcRec-pc回放;mobileLive-移动端直播;mobileRec-移动端回放;security - 安防版;voice-语音版;
				          //template: 'simple',
				          plugin: ['talk'], // 加载插件,talk-对讲
				          width: windowWidth,
				          height: windowWidth * 2 / 3,
				        });
				        window.player = player;
				      });
			},
			play() {
				var playPromise = player.play();
				playPromise.then((data) => {
					console.log("promise 获取 数据", data)
				})
			},
			stop() {
				var stopPromise = player.stop();
				stopPromise.then((data) => {
					console.log("promise 获取 数据", data)
				})
			}
		}
	}
</script>

<style>
	.content {
		display: flex;
		flex-direction: column;
		align-items: center;
		justify-content: center;
	}

	.preview {
		background-color: black;
	}
</style>

云台控制

player = new EZUIKit.EZUIKitPlayer({
					id: 'ezuikit', // 视频容器ID
					accessToken: this.ezuikitDataM.accessToken,
					url: 'ezopen://open.ys7.com/' + this.ezuikitDataM.deviceSerial + '/'+this.ezuikitDataM.channelNo+'.live',
					// simple - 极简版; pcLive-pc直播;pcRec-pc回放;mobileLive-移动端直播;mobileRec-移动端回放;security - 安防版;voice-语音版;
					template: 'mobileLive',
					plugin: ['talk', 'ptz'], // 加载插件,talk-对讲
					width: windowWidth,
					height: windowWidth * 2 / 3,
				});

截图

使用接口:https://open.ys7.com/api/lapp/device/capture   -   设备抓拍图片

接口文档位置:文档概述 · 萤石开放平台API文档 (ys7.com)

screenshot() {
				this.isLoading = true
				let _this = this
				post('/api/lapp/device/capture', {
					'accessToken': this.ezuikitData.accessToken,
					'deviceSerial': this.ezuikitData.deviceSerial,
					'channelNo': this.newData.channelNo,
					'quality': 1
				}, {
					'content-type': 'application/x-www-form-urlencoded'
				}, 'https://open.ys7.com').then(res => {
					uni.saveImageToPhotosAlbum({
						filePath: res.data.data.picUrl,
						success: function(res2) {
							_this.isLoading = false
							_this.$refs.messagePopup.showMessage('success', '圖片保存成功')
						},
						fail: function(err2) {

						}
					});

				}).catch(err => {
					console.error(err);
				});
			}

录像

  • 首先要创建一个存储项目,拿到项目ID后再录制

  • 录制视频到云端项目存储

即时视频转码录制存储接口,接口:https://open.ys7.com/api/open/cloud/v1/instant/record/save

接口描述:立即开始进行视频录制

预约视频转码录制存储接口,接口:https://open.ys7.com/api/open/cloud/v1/preview/save

接口描述: 从实时视频中取流进行转码录制,注意该接口开始时间需在未来 10 分钟后

文档地址:文档概述 · 萤石开放平台API文档 (ys7.com)

//即时录制
recordSave() {
				let _this = this
				post('/api/open/cloud/v1/instant/record/save', {
					'projectId': 'YtechAppRecord',
					'recordSeconds': '15'
				}, {
					'accessToken': this.ezuikitData.accessToken,
					'deviceSerial': this.ezuikitData.deviceSerial,
					'localIndex': this.ezuikitData.channelNo,
					'content-type': 'application/x-www-form-urlencoded'
				}, 'https://open.ys7.com').then(res => {
					_this.taskId = res.data.data.taskId
				}).catch(err => {
					console.error(err);
				});
			}
  • 根据任务ID查询视频文件,并获取下载链接

接口:https://open.ys7.com/api/v3/open/cloud/task/files

文档:https://open.ys7.com/api/v3/open/cloud/task/files

taskFiles() {
				let _this = this
				get('/api/v3/open/cloud/task/files', {
					'accessToken': _this.ezuikitData.accessToken,
					'taskId': _this.taskId,
					'hasUrl': true
				}, {
					'content-type': 'application/x-www-form-urlencoded'
				}, 'https://open.ys7.com').then(res => {
					uni.downloadFile({
						url: res.data.data[0].downloadUrls[0],
						success: (downloadResult) => {
							if (downloadResult.statusCode === 200) {
								uni.saveVideoToPhotosAlbum({
									filePath: downloadResult.tempFilePath,
									success: () => {
										_this.$refs.messagePopup.showMessage('default', '保存到相冊成功')
									},
									fail: (err) => {
										console.log(err)
									}
								});
							}
						},
						fail: (err) => {
							console.log(err)
						}
					})
				}).catch(err => {
					console.error(err);
				});
			}

历史映像

player = new EZUIKit.EZUIKitPlayer({
					id: 'ezuikit', // 视频容器ID
					accessToken: this.ezuikitDataM.accessToken,
					url: 'ezopen://open.ys7.com/' + this.ezuikitDataM.deviceSerial + '/'+this.ezuikitDataM.channelNo+'.live',
					// simple - 极简版; pcLive-pc直播;pcRec-pc回放;mobileLive-移动端直播;mobileRec-移动端回放;security - 安防版;voice-语音版;
					template: 'mobileRec',
					width: windowWidth,
					height: windowWidth * 2 / 3
				});

<script module="ezuikit" lang="renderjs">

  • renderjs的概念

运行在视图层的js,只支持app-vue和h5(简单来说就是开了另外一条线程)

  • renderjs的作用

大幅降低逻辑层和视图层的通讯损耗,提供高性能视图交互能力(减少通讯损耗提升性能,例如一些手势或canvas动画的场景)

在视图层操作dom,运行for web的js库(可以操作dom,意味着拥有window、document等这些全局变量,在app-vue的service层没有这些

uniapp官网说明地址:renderjs | uni-app官网

  •  renderjs的使用

在原先的script标签的同级新增一个script,设置lang=renderjsmodule=(值任意,相当于命名空间,之后会根据这个名字调用其中的方法)

renderjs和service层的通信示例一

<template>
	<view class="content">
		<!-- #ifdef APP-PLUS || H5 -->
		<view @click="echarts.onClick" :prop="option" :change:prop="echarts.updateEcharts" id="echarts" class="echarts"></view>
		<button @click="changeOption">更新数据</button>
		<!-- #endif -->
		<!-- #ifndef APP-PLUS || H5 -->
		<view>非 APP、H5 环境不支持</view>
		<!-- #endif -->
	</view>
</template>

<script>
	export default {
		data() {
			return {
				option: {
					title: {
						text: 'ECharts 入门示例'
					},
					tooltip: {},
					legend: {
						data: ['销量']
					},
					xAxis: {
						data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
					},
					yAxis: {},
					series: [{
						name: '销量',
						type: 'bar',
						data: [5, 20, 36, 10, 10, 20]
					}]
				}
			}
		},
		onLoad() {

		},
		methods: {
			changeOption() {
				const data = this.option.series[0].data
				// 随机更新示例数据
				data.forEach((item, index) => {
					data.splice(index, 1, Math.random() * 40)
				})
			},
			onViewClick(options) {
				console.log(options)
			}
		}
	}
</script>

<script module="echarts" lang="renderjs">
	let myChart
	export default {
		mounted() {
			if (typeof window.echarts === 'function') {
				this.initEcharts()
			} else {
				// 动态引入较大类库避免影响页面展示
				const script = document.createElement('script')
				// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
				script.src = 'static/echarts.js'
				script.onload = this.initEcharts.bind(this)
				document.head.appendChild(script)
			}
		},
		methods: {
			initEcharts() {
				myChart = echarts.init(document.getElementById('echarts'))
				// 观测更新的数据在 view 层可以直接访问到
				myChart.setOption(this.option)
			},
			updateEcharts(newValue, oldValue, ownerInstance, instance) {
				// 监听 service 层数据变更
				myChart.setOption(newValue)
			},
			onClick(event, ownerInstance) {
				// 调用 service 层的方法
				ownerInstance.callMethod('onViewClick', {
					test: 'test'
				})
			}
		}
	}
</script>

<style>
	.content {
		display: flex;
		flex-direction: column;
		align-items: center;
		justify-content: center;
	}

	.echarts {
		margin-top: 100px;
		width: 100%;
		height: 300px;
	}
</style>

renderjs和service层的通信示例二

<template>
	<view class="videoDetails">
		<view class="CommonTop_top"></view>
		<view class="CommonTop_app">
			<view class="left" @click="returnPage()"><uni-icons type="left" color="#8c8c8c" :size="28"></uni-icons>
			</view>
			<view class="tilte">{{ezuikitData?.channelName}}</view>
		</view>
		<view class="CommonTop_bottom"></view>
		<view class="CommonTop_bottom_two" style="height: var(--status-bar-height);"></view>
		<view class="content">
			<view class="videoBoxDetail">
				<view class="preview" :info="ezuikitData" :change:info="ezuikit.receiveInfo" id="ezuikit"></view>
			</view>
			<view class="tips">{{$t('VIDEO.16')}}</view>
		</view>
	</view>
</template>

<script>
	import {
		reactive,
		ref,
		toRefs,
		onMounted
	} from 'vue';
	import {
		onReady,
		onLoad
	} from "@dcloudio/uni-app"
	import {
		get,
		post
	} from '@/util/request/request.js'
	import localStorage from '@/util/commen/localStorage.js'

	export default {
		data() {
			return {
				ezuikitData: {},
				userInfo: JSON.parse(localStorage.get('userInfo')),
				projInfo: JSON.parse(localStorage.get('projInfo'))
			}
		},
		onLoad(option) {
			let newData = JSON.parse(decodeURIComponent(option.data))
			console.log(newData,'...........................')
			this.ezuikitData = newData
		},
		methods: {
			returnPage() {
				uni.navigateBack({
					delta: 1
				})
			}
		}
	}
</script>
<script module="ezuikit" lang="renderjs">
	var player = null
	var ezuikitDataM = null
	export default {
		mounted() {
			if (typeof window.EZUIKit !== 'undefined') {
				this.initPlayer();
			} else {
				const script = document.createElement('script')
				script.src = 'static/ezuikit/ezuikit.js'
				script.onload = this.initPlayer.bind(this)
				document.head.appendChild(script)
			}
		},
		methods: {
			receiveInfo(newValue, oldValue, ownerInstance, instance) {
				if (JSON.stringify(newValue) != '{}') {
					this.ezuikitDataM = newValue
					console.log('新值', JSON.stringify(this.ezuikitDataM))
				}
			},
			initPlayer() {
				const windowWidth = uni.upx2px(750)
				player = new EZUIKit.EZUIKitPlayer({
					id: 'ezuikit', // 视频容器ID
					accessToken: this.ezuikitDataM.accessToken,
					url: 'ezopen://open.ys7.com/' + this.ezuikitDataM.deviceSerial + '/'+this.ezuikitDataM.channelNo+'.live',
					// simple - 极简版; pcLive-pc直播;pcRec-pc回放;mobileLive-移动端直播;mobileRec-移动端回放;security - 安防版;voice-语音版;
					template: 'mobileLive',
					plugin: ['talk', 'ptz'], // 加载插件,talk-对讲
					width: windowWidth,
					height: windowWidth * 2 / 3,
				});
				window.player = player;
			}
		}
	}
</script>
<style scoped>
	.videoDetails {
		position: relative;
	}

	.videoDetails .tips {
		position: absolute;
		bottom: -70rpx;
		color: #8c8c8c;
		width: 100%;
		text-align: center;
	}
</style>

其他关于renderjs文章推荐:uniapp中使用renderjs的一些细节 - 掘金

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/497726.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

贝朗生物邀您到场参观2024第13届生物发酵展

参展企业介绍 贝朗生物工程设备&#xff08;江苏&#xff09;有限公司是一家专业从事成套发酵设备的研发、制造和销售的企业。我公司与中国科学院、中国农科院、甘肃省科学院、清华大学、兰州大学、天津科技大学、河北农业大学&#xff0c;甘肃农业大学、青海大学、新疆农业大…

服务器停止解析域名,但仍然可以访问到

1.centos7 如何刷新dns缓存 在CentOS 7上&#xff0c;DNS缓存由nscd&#xff08;Name Service Cache Daemon&#xff09;管理&#xff0c;如果系统上安装了nscd&#xff0c;可以通过清除nscd缓存来刷新DNS缓存。 要刷新DNS缓存&#xff0c;请执行以下命令&#xff1a; sudo …

人工智能(pytorch)搭建模型26-基于pytorch搭建胶囊模型(CapsNet)的实践,CapsNet模型结构介绍

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型26-基于pytorch搭建胶囊模型(CapsNet)的实践&#xff0c;CapsNet模型结构介绍。CapsNet&#xff08;Capsule Network&#xff09;是一种创新的深度学习模型&#xff0c;由计算机科学家Geo…

前后端分离开发【Yapi平台】【Swagger注解自动生成接口文档平台】

前后端分离开发 介绍开发流程Yapi&#xff08;api接口文档编写平台&#xff09;介绍 Swagger使用方式1). 导入knife4j的maven坐标2). 导入knife4j相关配置类3). 设置静态资源映射4). 在LoginCheckFilter中设置不需要处理的请求路径 查看接口文档常用注解注解介绍 当前项目中&am…

Gitlab CI---could not read username for xxx: no such device or address

0 Preface/Foreword 项目开发中&#xff0c;经常会使用第三方的算法或者功能&#xff0c;那么就需要把对应的repo以子模块的方式添加到当前repo中。 添加命令&#xff1a; git submodule add <URL> 1 问题表现 子模块添加成功&#xff0c;但是GitLab CI阶段&#xff…

(C++) 属性说明符-标准属性

文章目录 前言标准属性&#x1f3f7;️noreturn⭐(C11) 指示函数不返回 &#x1f3f7;️carries_dependency⭐(C11) 指示在函数内外传播“释放-消费” std::memory_order 中的依赖链 &#x1f3f7;️deprecated⭐(C14) 指示以此属性声明的名字或实体&#xff0c;允许使用但因某…

GPT:多轮对话并搭建简单的聊天机器人

1 多轮对话 多轮对话能力至关重要&#xff0c;它不仅能深化交流&#xff0c;精准捕捉对方意图&#xff0c;还能促进有效沟通&#xff0c;增强理解。在智能客服、教育辅导等领域&#xff0c;多轮对话更是提升服务质量、增强用户体验的关键。 注意&#xff1a;大模型没有多轮对话…

如何在 Oracle 中使用 CREATE SEQUENCE 语句

在本文中&#xff0c;我们将讨论 Oracle CREATE SEQUENCE 语句&#xff0c;其主要目的是提供一种可靠的方法来生成唯一且连续的数值&#xff0c;通常用于数据库表中的主键字段。此功能对于维护数据完整性和效率、确保不同记录之间的标识符有序分配尤其重要。从本质上讲&#xf…

STM32G473之flash存储结构汇总

STM32G4系列单片机&#xff0c;为32位的微控制器&#xff0c;理论上其内部寄存器地址最多支持4GB的命名及查找&#xff08;2的32次方&#xff0c;地址命名为0x00000000至0xFFFFFFFF&#xff09;。STM32官方对4GB的地址存储进行编号时&#xff0c;又分割成了8个block区域&#x…

【python】网络编程socket TCP UDP

文章目录 socket常用方法TCP客户端服务器UDP客户端服务器网络编程就是实现两台计算机的通信 互联网协议族 即通用标准协议,任何私有网络只要支持这个协议,就可以接入互联网。 socket socke模块的socket()函数 import socketsock = socket.socket(Address Family, type)参…

SQLyog连接MySQL8.0+报错:错误码2058的解决方案

最近把mysql从5.7迁移到8.3.0发现连接不上 因为 MySQL 从 8.0 版本开始&#xff0c;新增了caching_sha2_password授权插件 技术博客 http://idea.coderyj.com/ 1.更换sqlyog 更新到13.1.3之后的版本 2.取消mysql8的加密授权机制 mysql> ALTER USER sqlyog% IDENTIFIED WIT…

ArcGIS制作风向频率玫瑰图

风玫瑰图是气象科学专业统计图表,用来统计某个地区一段时期内风向、风速发生频率,又分为“风向玫瑰图”和“风速玫瑰图” ;因图形似玫瑰花朵,故名。风玫瑰图对于涉及城市规划、环保、风力发电等领域有着重要的意义。风玫瑰图能够直观的显现某地区不同方位风向的频率特征,进…

边缘计算与云计算总结

一. EdgeGallery 简介 MEC场景下的EdgeGallery是让资源边缘化&#xff0c;实时完成移动网络边缘的业务处理&#xff0c;MEC场景下的EdgeGallery让开发者能更便捷地使用 5G 网络能力&#xff0c;让5G能力在边缘触手可及。 EdgeGallery是由华为、信通院、中国移动、中国联通、…

最优算法100例之11-和为S的两个数字

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个…

从小白-入门-进阶-高阶,四个阶段详细讲解单片机学习路线!

大家好&#xff0c;今天给大家介绍从小白-入门-进阶-高阶&#xff0c;四个阶段详细讲解单片机学习路线&#xff01;&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 单片机学习路…

Jackson 2.x 系列【6】注解大全篇二

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 注解大全2.11 JsonValue2.12 JsonKey2.13 JsonAnySetter2.14 JsonAnyGetter2.15 …

【进程控制】进程程序替换的原理以及exec函数族

文章目录 替换原理exec函数族解释函数名解释参数 替换原理 在Linux中&#xff0c;进程的程序替换&#xff08;Process Program Replacement&#xff09;是指一个正在运行的进程使用exec函数族系统调用来加载并执行另一个程序的过程。这个新程序将替换掉原先正在执行的程序&…

VR全景赋能智慧农业,打造沉浸式种植体验平台

随着人口的增长&#xff0c;传统农业也正在面临着不一样的挑战&#xff0c;加上很多人对农业的固有印象&#xff0c;很少有年轻人愿意下到农田里&#xff0c;那么该如何提高产量、降低成本以及引导年轻人深刻感受现代农业成为了急需解决的问题。 随着城市化脚步的推进&#xff…

Codeforces Round 841 (Div. 2) C. Even Subarrays

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; co…

Tomcat配置https

前言&#xff1a;本文内容为实操记录&#xff0c;仅供参考&#xff01; 一、证书 CA证书申请下载不赘述了。 二、上传证书 进入tomcat根目录&#xff0c;conf同级目录下创建cert文件夹&#xff0c;并将证书两个文件上传到该文件夹&#xff1b; 三、编辑conf/server.xml文件 ① …