uniapp中使用live-player组件&&全屏功能的实现&&控制栏自动隐藏

本文介绍如何在小程序中实现RTMP直播流播放,包括权限配置、live-player组件使用及自定义控制栏实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了在小程序中播放rtmp直播流,研究了下小程序的live-player控件,首先必须在小程序后台开通权限才可以播放视频,个人账号暂时没有权限,必须是公司账号,需要在小程序后台的服务类目设置相应的类目,具体类目可以看文档,设置好类目之后在开发中的接口设置中打开实时播放音视频流,这样你才能够看到视频。
功能组件使用权限开通之后,其他不多说直接上代码:

<template>
	<view class="content">
		<view class="player-content">
			<!-- #ifdef MP-WEIXIN -->
			<live-player id="livePlayer" class="live-player" catchtouchmove :src="sourceUrl" autoplay
			 background-mute sound-mode="speaker" mode='RTC' @statechange="statechange" @click="handleControlbar">
				<view class="player-tool" :style="{bottom:(showControlbar?'0':'-60rpx')}">
					<view class="tools">
						<view class="full-screen" @tap.stop="handleFullScreen()">
							<text class="iconfont" v-if="!fullScreenFlag">&#xe824;</text>
							<text class="iconfont" v-else>&#xe67e;</text>
						</view>
						<view class="cruise" @tap.stop="handleCruise()" v-if="streamIndex == 2">
							<text class="iconfont">&#xe625;</text>
						</view>
					</view>
				</view>
			</live-player>
			<!-- #endif -->
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				isPlaySource: false, //是否有播放源
				isVideoLive: false, //是否是直播
				isAutoplay: true, //是否自动播放
				videoMsg: '', //video消息
				sourceUrl: '', //播放路径
				showControlbar: true,
				timer:null,
			}
		},
		watch: {
			showControlbar(val, oldVal) {
				if(val){
					 this.timer = setTimeout(()=>{
						this.showControlbar = false
					},5000)
				}else{
					clearTimeout(this.timer);
				}
			}
		},
		onLoad() {
			// #ifdef MP-WEIXIN
			this.playerCtx = uni.createLivePlayerContext('livePlayer');
			// #endif
		},
		created() {
			// #ifdef  MP-WEIXIN
			this.getLiveList()  //视频流列表
			//自定义控制栏自动隐藏的实现
			setTimeout(()=>{
				this.showControlbar = false
			},10000)
			// #endif
		},

		methods: {
			handleControlbar() {
				this.showControlbar = !this.showControlbar
			},
			getLiveList() {
				this.$api.livePage.getLiveList().then(res => {
					//业务逻辑
				}).catch(err => {
					console.log('err');
				});
			},
			// 巡航
			handleCruise() {
				// #ifdef  MP-WEIXIN
				uni.vibrateShort();
				// #endif
			},
			//全屏功能的实现
			handleFullScreen() {
				var that = this
				if (!that.fullScreenFlag) {
					//全屏
					that.playerCtx.requestFullScreen({
						success: res => {
							that.fullScreenFlag = true
							console.log('我要执行了');
						},
						fail: res => {
							console.log('fullscreen fail');
						},
						direction: 90
					});
				} else {
					//缩小
					that.playerCtx.exitFullScreen({
						success: res => {
							that.fullScreenFlag = false
							console.log('我要执行了');
						},
						fail: res => {
							console.log('exit fullscreen success');
						}
					});
				}
			},
		}
	}
</script>


<style lang="scss" scoped>
	.content {
		width: 100%;
		height: 100%;
		display: flex;
		flex-direction: column;
		.player-content {
			position: relative;
			width: 100%;
			height: 450rpx;
			display: flex;
			background-size: 100% 100%;

			.live-player {
				width: 100%;
				height: 100%;
				position: relative;
			}
		}
	}
	//播放器弹出工具
	.player-tool {
		width: 100%;
		height: 60rpx;
		background-image: linear-gradient(0deg, rgba(0, 0, 0, .6), transparent);
		display: flex;
		align-items: center;
		justify-content: space-between;
		position: absolute;
		left: 0;
		padding: 0 45rpx;
		transition: all 0.3s;
		.tools {
			height: 100%;
			width: auto;
			display: flex;
			align-items: center;

			.full-screen {
				height: 100%;
				display: flex;
				align-items: center;
				justify-content: center;

				.iconfont {
					color: #fff;
					font-weight: bold;

				}
			}

			.cruise {
				display: flex;
				align-items: center;
				justify-content: center;
				margin-left: 25rpx;

				.iconfont {
					color: #E45A3E;
					font-size: 45rpx;
				}
			}
		}

	}
</style>

实现之后的效果如下图(图画面隐私问题知道那个意思就行):
在这里插入图片描述

在这里插入图片描述

以上就是除去业务逻辑数据的整个组件的代码,记录点如下:

<live-player id="livePlayer" class="live-player" catchtouchmove :src="sourceUrl" autoplay
			 background-mute sound-mode="speaker" mode='RTC' @statechange="statechange" @click="handleControlbar" />

1.组件live-player中加catchtouchmove为了解决全屏以及还原时下方会有黑色可滚动区域问题,其他参数参考文档说明

2.由于原生的live-player组件是没有控制栏的所以video播放器常见的暂停,全屏,音量等(这里也希望官方能支持,自定义真的很麻烦),具体各个功能的实现可以参考文档说明,这里只对全屏功能做了处理。

3.关于自定义控制栏,状态栏悬浮在视频上方正常情况下应该使用cover-view,但是我还是使用的view发现也可以,如果又遇到不可以的将view换成cover-view包裹即可,可参考说明文档

4.由于控制栏是悬浮在视频层上的所以全屏事件的按钮使用重叠事件区分一下,把@click换成@click.stop或者@tap.stop,否则会发现点击无效

5.控制栏自动隐藏的实现,这里采用css+watch监听的方式去实现,有更好的方法或者有什么疑问欢迎下方留言

如果有帮助到你,记得点一个赞关注一下哦~

### 集成抖音 Video PlayerUniAppUniApp 中集成抖音风格的 `video-player` 播放器主要依赖于平台提供的原生组件以及自定义样式来模拟抖音视频播放体验。考虑到 uni-app 的跨平台特性,在不同平台上可能需要采用不同的策略。 对于微信小程序、百度小程序等支持特定原生组件的情况,可以直接利用 `<video>` 或者专门针对直播场景设计的 `<live-player>` 组件[^1]。这些组件能够提供较为流畅的视频加载与播放性能,并允许开发者通过属性配置来自定义外观和行为。 然而,为了创建更加贴近抖音用户体验的效果——比如全屏手势控制、自动循环播放下一个视频等功能,则需额外编写 JavaScript 和 CSS 来增强交互逻辑并优化视觉呈现效果。下面是一个简单的例子展示如何设置基本的 video player: ```html <template> <view class="container"> <!-- 使用uni自带的video标签 --> <video id="myVideo" :src="currentSrc" controls autoplay loop muted></video> <!-- 如果目标环境不支持内置video, 可考虑使用cover-view作为占位符配合js操作底层api --> <cover-view v-if="!isSupportedPlatform">当前平台暂未开放此功能</cover-view> <!-- 控制按钮和其他UI元素可以放置在这里 --> </view> </template> <script> export default { data() { return { currentSrc: 'https://example.com/path/to/video.mp4', isSupportedPlatform: true // 判断是否为支持该特性的平台 }; }, onLoad(){ const platform = plus.os.name; this.isSupportedPlatform = ['Android', 'iOS'].includes(platform); if(this.isSupportedPlatform){ let myPlayer = document.getElementById('myVideo'); // 添加事件监听器处理用户交互或其他需求 myPlayer.addEventListener('ended', function () { console.log('视频已结束'); // 自动跳转到下一则影片... }); } } }; </script> <style scoped lang="scss"> .container{ width: 100%; height: 100vh; /* 设置video尺寸 */ #myVideo{ object-fit: cover; width: 100%; height: calc(100% - var(--status-bar-height)); } } </style> ``` 需要注意的是,上述代码片段假设运行在一个兼容 HTML5 `<video>` 标签及其相应 API 的环境中;而对于某些特殊的小程序平台(如支付宝),由于其对部分 DOM 操作存在限制,因此实际开发过程中还需要根据具体情况进行调整。 此外,如果希望进一步模仿抖音的应用界面,还可以参考其他开源项目中的实现方式,例如基于 Flutter 构建的仿抖音应用程序案例[^3],从中获取灵感和技术思路应用于自己的 UniApp 开发当中。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你好!YOYO

你的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值