<template>
|
|
<view class="voice-content">
|
|
<view class="voice-item">
|
|
<view class="voice-icon">
|
|
<uv-icon name="mic" size="40rpx" color="#D03F25"></uv-icon>
|
|
</view>
|
|
<view class="voice-info">
|
|
<text class="voice-desc">通过语音识别下单</text>
|
|
<text class="voice-tip">点击播放语音内容</text>
|
|
</view>
|
|
<view class="voice-play" @click="playVoice">
|
|
<uv-icon :name="isPlaying ? 'pause-circle-fill' : 'play-circle-fill'" size="50rpx" color="#D03F25"></uv-icon>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
name: 'VoicePlayer',
|
|
props: {
|
|
voiceUrl: {
|
|
type: String,
|
|
default: ''
|
|
},
|
|
autoPlay: {
|
|
type: Boolean,
|
|
default: false
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
innerAudioContext: null, // 音频播放器
|
|
isPlaying: false // 是否正在播放语音
|
|
};
|
|
},
|
|
mounted() {
|
|
this.initAudioPlayer();
|
|
},
|
|
beforeDestroy() {
|
|
this.destroyAudioPlayer();
|
|
},
|
|
methods: {
|
|
// 初始化音频播放器
|
|
initAudioPlayer() {
|
|
this.innerAudioContext = uni.createInnerAudioContext();
|
|
|
|
// 监听播放结束事件
|
|
this.innerAudioContext.onEnded(() => {
|
|
console.log('播放结束');
|
|
this.isPlaying = false;
|
|
this.$emit('playEnded');
|
|
});
|
|
|
|
// 监听播放开始事件
|
|
this.innerAudioContext.onPlay(() => {
|
|
console.log('开始播放');
|
|
this.isPlaying = true;
|
|
this.$emit('playStarted');
|
|
});
|
|
|
|
// 监听播放暂停事件
|
|
this.innerAudioContext.onPause(() => {
|
|
console.log('播放暂停');
|
|
this.isPlaying = false;
|
|
this.$emit('playPaused');
|
|
});
|
|
|
|
// 监听播放停止事件
|
|
this.innerAudioContext.onStop(() => {
|
|
console.log('播放停止');
|
|
this.isPlaying = false;
|
|
this.$emit('playStopped');
|
|
});
|
|
|
|
// 监听播放错误事件
|
|
this.innerAudioContext.onError((err) => {
|
|
console.error('播放错误', err);
|
|
uni.showToast({
|
|
title: '播放失败',
|
|
icon: 'none'
|
|
});
|
|
this.isPlaying = false;
|
|
this.$emit('playError', err);
|
|
});
|
|
},
|
|
|
|
// 销毁音频播放器
|
|
destroyAudioPlayer() {
|
|
if (this.innerAudioContext) {
|
|
this.innerAudioContext.destroy();
|
|
this.innerAudioContext = null;
|
|
}
|
|
},
|
|
|
|
// 播放语音
|
|
playVoice() {
|
|
if (!this.voiceUrl) {
|
|
uni.showToast({
|
|
title: '语音文件不存在',
|
|
icon: 'none'
|
|
});
|
|
return;
|
|
}
|
|
|
|
if (this.isPlaying) {
|
|
// 如果正在播放,则停止播放
|
|
this.innerAudioContext.stop();
|
|
this.isPlaying = false;
|
|
return;
|
|
}
|
|
|
|
// 设置音频源并播放
|
|
this.innerAudioContext.src = this.voiceUrl;
|
|
this.innerAudioContext.play();
|
|
|
|
uni.showToast({
|
|
title: '正在播放语音',
|
|
icon: 'none'
|
|
});
|
|
},
|
|
|
|
// 停止播放
|
|
stopPlay() {
|
|
if (this.innerAudioContext && this.isPlaying) {
|
|
this.innerAudioContext.stop();
|
|
}
|
|
},
|
|
|
|
// 暂停播放
|
|
pausePlay() {
|
|
if (this.innerAudioContext && this.isPlaying) {
|
|
this.innerAudioContext.pause();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.voice-content {
|
|
padding: 30rpx;
|
|
|
|
.voice-item {
|
|
display: flex;
|
|
align-items: center;
|
|
padding: 30rpx;
|
|
background-color: #f9f9f9;
|
|
border-radius: 12rpx;
|
|
|
|
.voice-icon {
|
|
width: 80rpx;
|
|
height: 80rpx;
|
|
background-color: rgba(208, 63, 37, 0.1);
|
|
border-radius: 40rpx;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
margin-right: 30rpx;
|
|
}
|
|
|
|
.voice-info {
|
|
flex: 1;
|
|
|
|
.voice-desc {
|
|
display: block;
|
|
font-size: 30rpx;
|
|
color: #333;
|
|
margin-bottom: 8rpx;
|
|
}
|
|
|
|
.voice-tip {
|
|
font-size: 24rpx;
|
|
color: #999;
|
|
}
|
|
}
|
|
|
|
.voice-play {
|
|
width: 80rpx;
|
|
height: 80rpx;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
background-color: rgba(208, 63, 37, 0.1);
|
|
border-radius: 40rpx;
|
|
}
|
|
}
|
|
}
|
|
</style>
|