问题描述:我是真无语啊,就是有一个目录切换的地方,然后切换音频,结果你猜怎么着,嘿,音频他不播放了。也就是下面这个方法都不进去了打印的时候,音频播放都播放不了了,我尝试了销毁在播也不行。然后我寻思着,我写代码相同的我也喜欢return出去,会不会是这个原因,结果抱着试一试的态度,好家伙,真这样。
解决方法:在后台设置的时候,换成两个不同的音频进行切换就完事了。一般测试阶段才会出现,我觉得正式用,人家也不会放两个相同的视频在一个课程里面把,并且呢,这个在h5是好的,小程序才会出现。
代码:
<template>
<view class="wrap" v-if="!loadding">
<view class="videoWrap">
<view class="videoBox">
<template v-if="!videoPause">
<view class="masterPic">
<image class="img" :src="detail.video_image" mode="scaleToFill"></image>
</view>
<image class="startIcon" src="/static/image/bofang.png" mode="scaleToFill" @click="startVideo"></image>
</template>
<template v-else>
<video id="video" :src="detail.video_link" :autoplay="true" style="width: 100%;height: 100%"></video>
</template>
</view>
<view class="contnet">
<view class="title">{{ detail.title }}</view>
<!-- <view class="num">视频已播放2596次</view> -->
<view class="num">{{ detail.update_time }}</view>
</view>
</view>
<view class="auditorWrap" v-if="detail.audio_image">
<image class="imgAuditor" :src="detail.audio_image" mode="scaleToFill"></image>
<view class="contnet">
<view class="title">{{ detail.title }}</view>
<view class="num">{{ detail.update_time }}</view>
</view>
<view class="auditorBox">
<view class="iconList">
<image class="icon" src="/static/image/bofang1.png" mode="scaleToFill" v-if="!status" @click="changeto"></image>
<image class="icon" src="/static/image/zanting.png" mode="scaleToFill" v-else @click="changeto"></image>
</view>
<view class="progressBox">
<view class="progress">
<view class="activeProgress" :style="{width:`${progress}%`}">
<view class="activeRightBox">
<view class="circle" v-show="progress > 0"></view>
</view>
</view>
</view>
<view class="timeBox">
<view>{{ formatTime(currentTime) }}</view>
<view>{{ formatTime(duration) }}</view>
</view>
</view>
</view>
</view>
<view class="intro" v-if="detail.content">
<view v-html="detail.content"></view>
</view>
<movable-area class="recordWrap">
<movable-view :x="removeArea.x" :y="removeArea.y" direction="all" class="record">
<view @click.stop="gotoRecourd">
<image class="img" src="/static/image/recourdIcon.png" mode="scaleToFill"></image>
<view class="label">课程目录</view>
</view>
</movable-view>
</movable-area>
<recourdVue :list="course.section" ref="recourdRef" />
</view>
</template>
<script>
import utils from '@/common/utils.js';
import recourdVue from './part/recourd.vue';
const innerAudioContext = uni.createInnerAudioContext();
export default {
components: {
recourdVue
},
data() {
return {
/*商品id*/
section_id: null,
course_id: null,
course: {},
/*商品详情*/
detail: {},
status: false,
beforeAudio: true,
duration: 0,
currentTime: 0,
progress: 0,
xpjAudio: null,
videoPause: false,
videoContext: null,
removeArea:{
x: 0,
y: 0,
}
};
},
onReady() {
console.log("onReady")
this.videoContext = uni.createVideoContext('video', this);
},
onLoad(e) {
console.log("onLoad")
this.videoPause = false;
/*商品id*/
let scene = utils.getSceneData(e);
this.section_id = e.section_id ? e.section_id : scene.sid;
this.course_id = e.course_id ? e.course_id : scene.cid;
this.getSystemInfo();
},
mounted() {
console.log("mounted")
/*获取产品详情*/
this.getData();
},
methods: {
getSystemInfo(){
let self = this;
uni.getSystemInfo({
success(res) {
self.removeArea.x = res.windowWidth - 70;
self.removeArea.y = res.windowHeight - 120;
}
});
},
initAudit(){
innerAudioContext.src = this.detail.audio_link;
this.getAudioInfo();
},
getAudioInfo(){
innerAudioContext.onCanplay(()=>{
innerAudioContext.duration;
setTimeout(() => {
this.duration = innerAudioContext.duration;
this.watchAuditTime();
});
})
},
watchAuditTime(){
innerAudioContext.onTimeUpdate(() => {
const { currentTime,duration} = innerAudioContext;
this.currentTime = currentTime;
if(this.duration == this.currentTime){
this.progress = 100;
this.status = false;
}else{
this.progress = currentTime/duration * 100;
}
});
},
gotoRecourd(){
this.$refs.recourdRef.open(
{
section_id: this.section_id,
course_id: this.course_id,
}
);
},
startVideo(){
this.videoPause = true;
this.$nextTick(()=>{
this.videoContext.play();
})
},
changeto(){
this.status = !this.status;
if (this.status) {
innerAudioContext.play();
innerAudioContext.onPlay(() => {
// 播放监听
console.log('播放!');
});
} else {
innerAudioContext.pause()
this.currenttime = innerAudioContext.currentTime
}
},
/*获取数据*/
getData() {
let self = this;
let section_id = self.section_id;
let course_id = self.course_id;
self.loadding = true;
uni.showLoading({
title: '加载中'
});
self._get(
'course.course/sectionDetail', {
course_id: course_id,
section_id: section_id,
},
function (res) {
const { data: { detail: { course, detail } } } = res;
self.course = course;
self.detail = detail;
self.initAudit();
self.loadding = false;
uni.hideLoading();
},
function (err) {
}
);
},
changeSwiper() {
this.isVideoPlay = false;
},
formatTime(num) {
num = Math.floor(num)
let second = num % 60;
if (second < 10) second = '0' + second;
let min = Math.floor(num / 60);
if (min < 10) min = '0' + min;
return min + ":" + second;
},
}
};
</script>
<style lang="scss" scoped>
.videoWrap,.auditorWrap {
background: #fff;
.videoBox,.imgAuditor {
width: 100%;
height: 564rpx;
position: relative;
.masterPic {
height: 100%;
&::before {
content: "";
position: absolute;
top: 0;
left: 0;
background: rgb(0, 0, 0, 0.45);
width: 100%;
height: 100%;
z-index: 1;
}
.img {
width: 100%;
height: 100%;
}
}
.startIcon {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
width: 92rpx;
height: 92rpx;
z-index: 10;
}
}
.contnet{
padding: 28rpx;
.title{
font-size: 32rpx;
color: #333333;
margin-bottom: 20rpx;
}
.num{
font-size: 23rpx;
color: #999999;
}
}
}
.auditorWrap{
margin-top: 20rpx;
}
.auditorBox{
display: flex;
gap: 16rpx;
padding: 28rpx;
.iconList{
width: 62rpx;
height: 62rpx;
.icon{
width: 100%;
height: 100%;
}
}
.progressBox{
flex: 1;
}
.progress{
width: 100%;
height: 20rpx;
background: #EDE8E8;
border-radius: 20rpx;
position: relative;
.activeProgress{
position: absolute;
left: 0;
top: 0;
background: #F2473F;
height: 100%;
border-radius: 20rpx;
transition: width 1s ease;
.activeRightBox{
position: relative;
height: 100%;
.circle{
width: 42rpx;
height: 42rpx;
background: #FFFFFF;
border: 2rpx solid #F2473F;
box-shadow: 0px 5rpx 5rpx 0px rgba(0,0,0,0.1);
border-radius: 50%;
position: absolute;
right: 0;
top: -12rpx;
}
}
}
}
.timeBox{
display: flex;
justify-content: space-between;
color: #F2473F;
font-size: 32rpx;
padding-top: 8rpx;
}
}
.intro{
margin-top: 20rpx;
padding: 28rpx;
background: #fff;
}
.recordWrap{
position: fixed;
bottom: 0;
top: 0;
width: 100vw;
height: 100vh;
pointer-events: none;
}
.record{
width: 111rpx;
height: 111rpx;
background: linear-gradient(45deg, #F2473F, #F26E2F);
border-radius: 50%;
position: relative;
pointer-events: visible;
.img{
width: 54rpx;
height: 53rpx;
position: absolute;
top: 40%;
left: 50%;
transform: translate(-50%,-50%);
}
.label{
width: 131rpx;
height: 43rpx;
line-height: 43rpx;
background: linear-gradient(45deg, #F2473F, #F26E2F);
box-shadow: 0px 5rpx 5rpx 0px rgba(9,2,4,0.25);
font-size: 26rpx;
color: #fff;
text-align: center;
position: absolute;
bottom: -10rpx;
left: -8rpx;
border-radius: 20rpx;
}
}
</style>
recourd.vue 子组件
<template>
<view class="recourdMask" v-if="show">
<view class="recourdBox">
<view class="closeIcon" @click="closeIcon">
<u-icon name="close" color="#424242" size="40rpx"></u-icon>
</view>
<view class="title">课程目录</view>
<scroll-view :scroll-top="scrollTop" :scroll-y="true" class="content" scroll-with-animation="true">
<view class="list">
<view class="item" v-for="v in list" :key="v" @click="gotoLook(v)">
<view class="txt">{{ v.title }}</view>
<view class="status" v-if="v.is_see == 1">试学</view>
</view>
</view>
</scroll-view>
</view>
</view>
</template>
<script>
export default {
props: {
list: {
type: Array,
default: [],
}
},
components: {},
data() {
return {
params: {},
show: false,
}
},
methods: {
open(params){
this.params = params;
this.show = true;
},
gotoLook(v){
if(v.payStatus == 0 || v.is_see == 0){
uni.showToast({
icon: 'none',
title: '此章节需要购买后查看'
});
return
}
this.params.section_id = v.section_id;
this.gotoPage(`pages/knowledge/course/section-detail?section_id=${this.params.section_id}&course_id=${this.params.course_id}`,'redirect');
},
closeIcon(){
this.show = false;
}
}
}
</script>
<style lang="scss">
.recourdMask{
position: fixed;
bottom: 0;
background: rgba(0,0,0,0.45);
top: 0;
width: 100%;
height: 100%;
z-index: 10;
.recourdBox{
position: fixed;
bottom: 0;
height: 882rpx;
background: #fff;
width: 100%;
border-top-left-radius: 20rpx;
border-top-right-radius: 20rpx;
z-index: 2;
.list{
padding: 20rpx;
padding-top: 0;
box-sizing: border-box;
.item{
display: flex;
justify-content: space-between;
align-items: center;
background: #F5F6F8;
padding: 26rpx 22rpx;
box-sizing: border-box;
border-radius: 20rpx;
margin-bottom: 20rpx;
}
}
.title{
font-size: 32rpx;
font-weight: bold;
color: #333333;
text-align: center;
height: 124rpx;
line-height: 124rpx;
}
.status{
width: 112rpx;
height: 48rpx;
text-align: center;
line-height: 48rpx;
background: rgba(249,156,49,0.15);
font-size: 22rpx;
color: #F2473F;
border-radius: 20rpx;
}
.txt{
font-size: 26rpx;
color: #666666;
}
}
.content{
height: 882rpx;
}
.closeIcon{
position: absolute;
right: 28rpx;
top: 28rpx;
}
}
</style>
实现效果
目前呢,这个播放器还没有做拖动的。这个得后续优化。