<template> <view class="container global-video-box" v-if="showVideoPop"> <view class="video-content"> <video :id="videoPopList.Id" :src="videoPopList.ResourceUrl" :poster="videoPopList.BackgroundImg" enable-play-gesture :custom-cache="false" object-fit="contain" show-mute-btn @ended="handleVideoEnd" @timeupdate="handleVideoTimeUpdate" @fullscreenchange="handleFullscreenchange" autoplay > <view class="video-inner-right-box" v-if="isShowControls"> <!-- 倍速控制按钮 --> <view class="video-speed-btn" @click.stop="showSpeedOpt = true">倍速</view> </view> <!-- 倍速选项模块 --> <view class="speed-opt-box" v-if="showSpeedOpt"> <view class="item" :style="{ color: item == curSpeed ? '#F3A52F' : '' }" v-for="item in speedOpts" :key="item" @click.stop="handleVideoSpeedChange(item)">{{ item }}X</view> </view> </video> <view class="title text_twoLine"> {{ videoPopList.Title }} </view> </view> <view class="close-icon" v-if="showCloseBtn"> <image @click="handleShow" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/close-icon.png"> </image> </view> </view> </template> <script> import { Home } from "@/config/api"; export default { name: "", filters: {}, components: {}, props: { showVideoPop: { default: false, type: Boolean, }, videoPopList: { default: {}, type: Object, }, }, computed: { curVideoId() { return this.$store.state.videoPlay.playVideoId; }, activityVideoId() { return this.$store.state.videoPlay.playVideoActId; }, }, data() { return { videoContext: null, curVideoTime: 0, showSpeedOpt: false, speedOpts: ["0.5", "0.8", "1.0", "1.25", "1.5", "2.0"], curSpeed: "1.0", isShowControls: false, //是否显示视频的控制栏 showCloseBtn: true, }; }, watch: { showVideoPop: { handler(newVal) { if (newVal) { setTimeout(() => { this.handelVideoPlayChild(); }, 300); } }, }, }, created() {}, mounted() {}, methods: { //视频的播放事件 handelVideoPlayChild() { this.videoContext = wx.createVideoContext(this.videoPopList.Id.toString(), this); Home.microAideoHistoryAdd({ SourceId: this.videoPopList.ActivityId || this.videoPopList.Id, SourceType: this.videoPopList.ActivityId ? 2 : 3, PageRouter: this.$store.state.pageRouterReport }); this.curVideoTime = 0; if (this.curVideoId == this.videoPopList.Id || this.activityVideoId == this.videoPopList.ActivityId) { this.curVideoTime = this.$store.state.videoPlay.palyCurrentTime; } this.videoContext.seek(this.curVideoTime); this.videoContext.play(); }, //视频播放结束 handleVideoEnd() { // 此处因为如果不调用退出全屏方法 安卓和ios页面均会表现异常,安卓横屏不恢复竖屏,ios底部tabbar渲染异常 this.curVideoTime = 0; this.$store.commit("videoPlay/palyTimeUpdate", 0); this.videoContext.exitFullScreen(); }, handleVideoTimeUpdate(e) { let time = parseInt(e.detail.currentTime); this.$store.commit("videoPlay/palyTimeUpdate", time); }, handleShow() { this.showSpeedOpt = false; this.curSpeed = "1.0"; // this.$parent.showVideoPop = false; this.$emit("update:showVideoPop", false); }, // 倍速切换 handleVideoSpeedChange(item) { const num = Number(item); this.videoContext.playbackRate(num); this.curSpeed = item; this.showSpeedOpt = false; }, handleFullscreenchange(e) { this.showCloseBtn = !e.detail.fullScreen; this.isShowControls = e.detail.fullScreen; }, }, }; </script> <style scoped lang="scss"> .global-video-box { display: flex; height: 100%; position: fixed; width: 100%; top: 0; left: 0; z-index: 111; background-color: rgba(0, 0, 0, 0.7); .video-content { position: absolute; top: 500rpx; left: 50%; transform: translateX(-50%); width: 95%; height: 456rpx; background-color: #fff; z-index: 112; font-size: 28rpx; color: #333333; video { width: 100%; height: 340rpx; } .title { padding: 15rpx 0 0 15rpx; } } .close-icon { position: absolute; width: 95%; height: 48rpx; top: 430rpx; left: 50%; transform: translateX(-50%); z-index: 112; display: flex; justify-content: flex-end; z-index: inherit; image { height: 48rpx; width: 48rpx; } } .video-inner-right-box { position: absolute; bottom: 30%; right: 5%; display: flex; flex-direction: column; align-items: center; } .video-speed-btn { width: 80rpx; height: 44rpx; display: flex; align-items: center; justify-content: center; background: rgba(0, 0, 0, 0.4); border-radius: 22rpx; color: #fff; font-size: 12px; } .speed-opt-box { position: absolute; right: 0; top: 0; bottom: 0; width: 20%; background: rgba(0, 0, 0, 0.8); display: flex; flex-direction: column; justify-content: space-around; padding-top: 55rpx; .item { color: #fff; font-size: 26rpx; flex: 1; width: 100%; text-align: center; } } } </style>