uniApp通过xgplayer(西瓜播放器)接入视频实时监控

🚀 个人简介:某大型国企资深软件开发工程师,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~

💟 作 者:码喽的自我修养🥰

📝 专 栏:uniApp与微信小程序 🎉

🌈 创作不易,如果能帮助到带大家,欢迎 收藏+关注 哦**💕**

​ 🌈🌈文章目录

开发背景

开发准备

基础代码

monitor.vue

xgplayer.vue

完成效果图

相关文档

​

开发背景

最近有个需求,需要在app中展示对应站房的实时监控画面,因为uniapp原有的video组件 功能比较少就考虑到引入西瓜播放器的视频组件

西瓜播放器 | 快速上手https://v2.h5player.bytedance.com/gettingStarted/

开发准备

因为是直播流就选择了flvjs, 项目安装xgplayer-flv

javascript 复制代码
npm install xgplayer-flv

通过render.js去做视图层,要注意的是nvue无法使用renderjs

详细文档可以自己去uniapp官网查看用法 renderjs | uni-app官网uni-app,uniCloud,serverless,renderjs,使用方式,示例,功能详解,注意事项https://uniapp.dcloud.net.cn/tutorial/renderjs.html

​renderjs 是一个运行在视图层的js。它比WXS更加强大。它只支持app-vue和web。
renderjs 的主要作用有2个:

  1. 大幅降低逻辑层和视图层的通讯损耗,提供高性能视图交互能力

  2. 在视图层操作dom,运行 for web 的 js库

基础代码

monitor.vue
javascript 复制代码
<!-- monitor.vue -->
<template>
	<view class="uni-padding-wrap monitor_box list_box">
		<uni-row style="background-color: #fff;" class="list_video_box">
			<uni-col :span="8" class="list_video_item" v-for="(item,i) in videoLlist" :key="i">
				<xgplayer :id='`myVideo${i}`' :videoData="item"></xgplayer>
				<text class="text">{
  
  {item.mpName}}</text>
			</uni-col>
		</uni-row>
	</view>
</template>
<script>
	import xgplayer from './xgplayer.vue'
	export default {
		components: { xgplayer },
		data(){
			return {
				videoList: [], // 视频列表
			}
		}
	}
</script>
xgplayer.vue
html 复制代码
<template>
	<view class="media-box" style="width: 264px;height: 160px;" :start='startUrl' :change:start="xgplayer.startPlay" >
		<view :id="id" :detail="videoData" :change:detail="xgplayer.initJs"></view>
	</view>
</template>

<script>
	// 逻辑层
	export default {
		props: ['id', 'videoData'],
		data(){
			return {
				startUrl:1
			}
		},
		methods: {
			onPlay(){
				console.log('响应视图层方法')
			}
		}
	}
</script>

<script module="xgplayer" lang="renderjs">
	// 视图层
	import FlvPlayer from 'xgplayer-flv';
    export default{
		data(){
			return {
				xgPlayer: null
			}
		},
        mounted(){},
		onunload() {
			this.xgPlayer.destroy()
		},
        methods:{
            initJs(newVal,old,ownerInstance,instance){
				if (typeof window.Player === 'function') {
					this.initPlayer(newVal)
				} else {
					// 动态引入较大类库避免影响页面展示
					const script = document.createElement('script')
					// view 层的页面运行在根目录
					script.src = 'static/xgplayer.js'
					document.head.appendChild(script)
					script.onload = this.initPlayer.bind(this,newVal,ownerInstance)
				}
            },
            
            initPlayer(detail,ownerInstance){
				const _this = this
				_this.xgPlayer = new FlvPlayer({
					id: 'myVideo' + detail.index, // 容器ID
					poster: 'https://xxx/xxx.png', // 封面图不支持本地资源
					isLive: true, // 是否直播
					url: detail.videourl + '?url=' + detail.SteamName, // 直播流地址
					autoplay: false, // 是否自动播放
					height: 160,
					width: 264,
					// 播放错误后的站位图
					errorTips: `<image src='http://xxx/xxx.png' id='videoErr${detail.index}' style='width: 50%;'><image>`,
					// 截图
					screenShot: {
						saveImg: true,
						quality: 0.92,
						type: 'image/png',
						format: '.png'
					},
					ignores: ['time', 'progress', 'replay', 'volume'], // 关闭内置控件
					closeInactive: true, // 播放器控制栏常驻不隐藏
					closeVideoClick: true, // video触发click事件后视频切换播放/暂停状态
				})
                
                _this.xgPlayer.once('play',()=>{
                    console.log('播放成功')
                    // 调用逻辑层方法
                    ownerInstance.callMethod('onPlay')
                })
				_this.xgPlayer.on('error',(err)=>{
				    console.log('播放出错', err)
					let videoErr = document.getElementById(`videoErr${detail.index}`)
					// 重新播放
					videoErr.onclick = function () {
						_this.xgPlayer.destroy()
						_this.initPlayer(detail,ownerInstance)
					}
				})
				_this.xgPlayer.on('screenShot',(DOMString)=>{
				    console.log(DOMString);
				    _this.saveScreenshot(new Date().getTime(), DOMString, 100)
				})
            },
			saveScreenshot(fileName, base64, quality) { // fileName:自定义文件名 ,base64:图片base64码, quality: 图片质量1-100
			  const bitmap = new plus.nativeObj.Bitmap()
			  // 从本地加载Bitmap图片
			  bitmap.loadBase64Data(base64, () => {
			    bitmap.save("_doc/" + fileName + ".jpg", {
			      overwrite: true,
			      quality: quality
			    }, (i) => {
			      // callback(i);
			      console.log("保存图片成功:" + JSON.stringify(i))
			      this.capture(i.target)
			    }, (e) => {
			      console.log("保存图片失败:" + JSON.stringify(e))
			    })
			  }, (e) => {
			    console.log("加载图片失败:" + JSON.stringify(e))
			  })
			},
			
			// 保存视频截图到相册
			capture(file) {
			  plus.gallery.save(file, () => {
			    console.log("图片已保存到相册")
			  }, (e) => {
			    if (e.code === -3310 || e.code === 8) {
			      console.log("您已禁止访问相册,请设置开启权限")
			    } else {
			      console.log("图片保存失败:" + JSON.stringify(e))
			    }
			  })
			},

            // 逻辑层触发视图层函数
            startPlay(){
				this.xgPlayer.play()
            },
        }
    }
</script>
完成效果图

相关文档

​​​​​​uniapp官网组件

https://uniapp.dcloud.net.cn/componenthttps://uniapp.dcloud.net.cn/component/

西瓜播放器配置项 西瓜播放器 | 配置https://v2.h5player.bytedance.com/config/#%E5%BF%85%E9%80%89%E9%85%8D%E7%BD%AE

到此这篇文章就介绍到这了,更多精彩内容请关注本人以前的文章或继续浏览下面的文章,创作不易 ,如果能帮助到大家,希望大家点点收藏+关注~💕

​

更多专栏订阅推荐:

🥕 JavaScript深入研究

👍 前端工程搭建

💕 vue从基础到起飞

✈️ HTML5与CSS3

🖼️ JavaScript基础

⭐️ uniapp与微信小程序

📝 前端工作常见问题与避坑指南

✍️ GIS地图与大数据可视化

📚 常用组件库与实用工具

💡 java入门到实战

相关推荐
Dream-Y.ocean42 分钟前
鸿蒙PC平台宅匠 3D 室内设计适配实战:基于 Electron 壳方案的 Three.js 双渲染引擎与参数化户型编辑器开发
javascript·3d·harmonyos
Csvn2 小时前
性能监控
前端
Highcharts.js2 小时前
Highcharts Gantt使用符号的自定义数据标签开发甘特图示例
javascript·甘特图·highcharts·图表开发·实战代码·响应式图表
Csvn2 小时前
构建工具
前端
FRing033 小时前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
小豆庄3 小时前
监控视频脱敏的追踪漂移与ID撞号陷阱
目标跟踪·ffmpeg·音视频·视频·敏捷流程
Java小卷3 小时前
JuanForm vs FormCreate!Vue3 表单引擎联动配置 PK!
vue.js·低代码
码间留白4 小时前
uni-app 跑上鸿蒙,发现蓝牙全瞎:我把 BLE 补齐的实战(一)基建篇
物联网·uniapp·harmonyos next·蓝牙 ble·鸿蒙os开发
kyriewen5 小时前
Skills 榜前 10 我全装了:只有 3 个能直接用
前端·javascript·程序员
IT_陈寒5 小时前
当Java的hashCode遇上Lombok,我的缓存被全清了
前端·人工智能·后端