为了在小程序中播放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"></text>
<text class="iconfont" v-else></text>
</view>
<view class="cruise" @tap.stop="handleCruise()" v-if="streamIndex == 2">
<text class="iconfont"></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,否则会发现点击无效