uniapp(微信小程序)播放flv视频(萤石云视频)解决方案(使用web-view组件完美适配)

情况:

现在我们的项目需要能够在微信小程序中播放萤石云摄像头的直播以及录播视频,但是官方提供的组件要么就是原生的微信小程序,uniapp无法直接使用,要么就是提供的uniapp方案只能h5页面下使用,而且要引入一堆文件才行,还有的方案就是使用萤石云的自定义组件,但是无法按照我们自己的需求来设置页面了,因此我们准备将所有视频链接转换成flv视频流(调用萤石云api,自行上官方文档查看),只要能够在微信小程序中播放flv视频,就能完成我们的需求

在尝试了多种方法之后,我整出了一个能够完美适配微信小程序页面的播放方法

大致思路:

使用mui-player组件(一个h5页面专用的组件)播放flv视频,但是微信小程序无法使用该组件,所以将使用了该组件的页面,编译成h5页面并运行,然后在微信小程序的页面中使用web-view组件显示该页面即可

mui-player的官方网址:

MuiPlayer

开始实现:

1.使用mui-palyer组件

先下载必须的依赖包(我这里只使用了flv视频,如果有需要其他视频格式的可去官网查看)

npm install mui-player -save
npm install flv -save

 2.开始封装组件

<template>
	<view>
		<div id="mui-video"></div>
	</view>
</template>

<script>
	import 'mui-player/dist/mui-player.min.css'
	import MuiPlayer from 'mui-player'
	import Flv from 'flv.js'

	export default {
		name: "H5Player",
		props: {
			// 播放标题
			title: {
				type: String,
				default: ''
			},
			// 播放地址
			src: {
				type: String,
				default: ''
			},
			// 播放格式
			type: {
				type: String,
				default: 'flv'
			},
			// 自动播放
			autoplay: {
				type: Boolean,
				default: true
			},
			// 循环播放
			loop: {
				type: Boolean,
				default: true
			},
			// 静音播放
			muted: {
				type: Boolean,
				default: false
			},
			// 播放器容器是否自适应视频高度
			autoFit: {
				type: Boolean,
				default: false
			},
			// 直播模式
			live: {
				type: Boolean,
				default: false
			},
			// 封面地址
			poster: {
				type: String,
				default: ''
			}
		},
		data() {
			return {
				mui_video: null,
				parse: {}
			};
		},
		watch: {
			// 播放地址变化
			src(newVal, oldVal) {
				if (this.mui_video != null) {
					this.mui_video.src = newVal
					this.mui_video.reloadUrl(newVal)
				} else{
					this.init();
				}
			},
			// 播放格式变化
			type(newVal, oldVal) {
				// console.log(newVal, oldVal)
				
				if(newVal == 'mp4') {
					this.parse = {}
				}		
				if(newVal == 'flv') {
					this.parse = {
						type: 'flv',
						loader: Flv,
						config: { 
							// hls config to:https://github.com/video-dev/hls.js/blob/HEAD/docs/API.md#fine-tuning
							debug: false,
						},
					}
				}
				// 重置播放器
				this.init()
			}
		},
		mounted() {
			setTimeout(()=>{
				if(this.type == 'mp4') {
					this.parse = {}
				}
				
				if(this.type == 'flv') {
					this.parse = {
						type: 'flv',
						loader: Flv,
						config: { 
							// hls config to:https://github.com/video-dev/hls.js/blob/HEAD/docs/API.md#fine-tuning
							debug: false,
						},
					}
				}
				this.init()
			},500)
		},
		methods: {
			init() {
				this.mui_video = new MuiPlayer({
					container: '#mui-video',
					title: this.title,
					// 设置个默认地址 否则会弹出视频为空
					src: this.src,
					autoplay: this.autoplay,
					autoFit: this.autoFit,
					loop: this.loop,
					muted: this.muted,
					live: this.live,
					poster: this.poster,
					height: '220px',
					parse: this.parse
				})
				console.log(this.mui_video.getControls())
			}
		}
	}
</script>

<style>

</style>

 3.创建用于使用mui-player组件的页面,该页面将会被运行成h5

由于我的微信小程序页面有登录信息验证,因此需要传入token参数,并在加载时存入store里面,这个主要是避免访问时被拦截了,根据自己的情况添加即可,H5Player就是上面我创建的组件

<template>
	<view>
		<!-- #ifdef H5 -->
		<u-sticky offset-top="-40">
			<view class="container">
				<H5Player ref="player" v-if="flag" :title="camera.name" :src="camera.realUrl" :type="'flv'"
				:autoFit="true" :autoplay="true" ></H5Player>  
			</view>
		</u-sticky>
		<!-- #endif --> 	
		
		</view>
	</view>
</template>

<script>
	import { setToken,getToken } from '@/utils/auth';
	import config from '@/config'
	// #ifdef H5
	import H5Player from '@/pages_dam_mdm/components/H5Player/H5Player.vue'
	// #endif
	
	export default {
        components:{
			H5Player
		},
		data() {
			return {
				tabs:[],
				tabIndex:0,
				showCalendar:false,
				showTime:nowDate,//展示时间
				historyType:0,//历史回放类型,0是当天回放,1是往日回放
				historyList:[],//历史回放时间列表
				choiceTime:Date.now(),
				flag:false,
				video:null,//存放视频播放对象
				camera:{
					videoUrl:'',
					videoHistoryUrl:'',
					realUrl:'',
				}
			}
		},
		onLoad(option) {
		    // 获取传递的参数	    
			const token = this.$route.query.token;//如果是从微信小程序打开,则默认是无token的,需要访问时传递token,并且进行设置
			if(token){//如果传递了token
				setToken(token);
			}
		},
		onReady: function(res) {    
		},
		methods: {

		}
	}
</script>

<style lang="scss">

</style>

4.创建用于展示web-view组件的页面

大家可以将h5页面部署(本地测试时,可以先用hbuilder启动至浏览器,模拟部署页面,ip地址就是http://localhost)的ip地址存入config中,便于后续的修改,可以在url中传递必要测参数

<template>
	<view>
		<web-view :src="src"></web-view>
	</view>
</template>

<script>
	import { getToken } from '@/utils/auth';
	import config from '@/config'
	export default {
		data() {
			return {
				src:'',
			}
		},
		onLoad(options){
			//先获取token,然后传递给h5页面
			const token =  getToken();
			this.src = config.baseH5Url + '/#/pages_dam_mdm/mdm/playCamera/index?uuid=' + options.uuid + '&token=' + token;
		},
		methods: {
		}
	}
</script>

<style>

</style>

6.隐藏导航栏

因为h5页面本身自带导航栏,使用web-view组件展示的时候就会出现两个导航栏,因此需要隐藏一个,只需要在pages.json里配置一下即可

{
	"path" : "mdm/playCamera/index",
	"style" : 
	{
		"navigationBarTitleText" : "",
		"app-plus": {
			"titleNView": false //禁用原生导航栏  
		}
	}
}

7.查看效果

十分完美!

要在 uniapp 微信小程序中接入萤石云,您需要完成以下步骤: 1.注册并登录萤石云开发者平台,创建应用并获取 AppKey 和 AppSecret。 2.在 uniapp 项目中安装并引入微信小程序官方提供的“微信小程序 API”插件。 3.在 uniapp 项目中安装并引入“uni-axios”插件,用于发送 HTTP 请求。 4.编写代码实现用户授权登录并获取 AccessToken。 5.编写代码实现调用萤石云提供的 API,例如获取设备列表、打开直播预览等。 下面是一个简单的示例代码: ```javascript // 引入 axios 模块 import axios from 'uni-axios' // 用户授权登录并获取 AccessToken async function login() { const res = await axios.post('https://open.ys7.com/api/lapp/token/get', { appKey: 'your_app_key', appSecret: 'your_app_secret' }) return res.data.data.accessToken } // 获取设备列表 async function getDeviceList(accessToken) { const res = await axios.get('https://open.ys7.com/api/lapp/device/list', { headers: { Authorization: `Bearer ${accessToken}` } }) return res.data.data.deviceList } // 打开直播预览 async function openLivePreview(accessToken, deviceSerial, channelNo) { const res = await axios.post('https://open.ys7.com/api/lapp/live/address/get', { accessToken, deviceSerial, channelNo }) return res.data.data.url } // 调用示例 async function main() { // 用户授权登录并获取 AccessToken const accessToken = await login() // 获取设备列表 const deviceList = await getDeviceList(accessToken) // 打开直播预览 const livePreviewUrl = await openLivePreview(accessToken, deviceList[0].deviceSerial, 1) console.log(livePreviewUrl) } main() ``` 请注意,以上代码仅供参考,实际应用中还需要考虑错误处理、用户体验等方面的问题。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值