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.查看效果

十分完美!

uni-app中,你可以使用内置的H5 Video标签来播放FLV流。首先,你需要确保已经安装了uni-app的Video组件,并且需要在项目中引入支持FLV格式的插件,如`flv.js`。以下是一个简单的步骤以及示例代码: 1. **安装依赖**: 在`npm`包管理器中安装`flv.js`库: ``` npm install flv.js --save ``` 2. **引入并初始化Flv.js**: 在Vue或WXML文件中,导入`flv.js`并在适当的地方初始化它: ```javascript(Vue) import FlvJs from 'flv.js'; created() { this.player = new FlvJs.Player(); } // ...其他生命周期钩子或者模板中 <template> <!--...--> <video id="myPlayer" ref="playerRef"></video> <!--...--> </template> ``` 或者 ```wxml <import src="/uni_modules/flv.min.js"/> <!--...--> <video id="myPlayer" bindready="onPlayerReady"></video> <!--...--> <script> onLoad(() => { const player = new flvjs.createPlayer(...); // ...后续初始化代码 }); </script> ``` 3. **处理视频源和播放**: 设置FLV流地址作为Video的src属性,然后绑定事件处理播放状态: ```javascript(Vue) methods: { onPlayerReady() { this.player.load('path_to_your_flv_file.flv'); this.player.play(); // 开始播放 this.player.on('error', (err) => { console.error(err); }); // 监听错误 } }, ``` 或者 ```wxml <block wx:if="{{player && !player.paused}}"> <wx:audio src="{{player.src}}" controls></wx:audio> </block> <script> onPlayerReady() { this.$refs.myPlayer.src = 'path_to_your_flv_file.flv'; this.$refs.myPlayer.play(); } </script> ``` 4. **注意事项**: - 确保你的服务器提供跨域访问,因为FLV是二进制流,可能会遇到跨域问题。 - 如果有直播需求,可能需要使用实时流协议(如RTMP),这时可能需要额外的库或服务。
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值