在uniapp中实现聊天对话中的语音播放【点击同一条语音是暂停和播放,如果当前这条语音播放完毕之后再次点击就是从头播放,如果点击的是不同的语音就是从头播放不同的语音】

效果描述

在与好友的聊天对话框页面中点击语音进行播放的时候

如果你先点击了一条语音,此时该条语音开始进行播放,如果在该条语音播放结束之前再次进行点击,那么该条语音的播放就会被暂停,然后再次点击该条语音,此时该条语音就会从上次播放终端的位置继续开始播放;

如果在该条语音播放完毕之后再次点击该条语音,则该条语音将从头进行播放;

如果你在该条语音播放播放过程中或者该条语音播放完毕之后,点击了另一条语音,那么将会从头播放你刚才点击的那条语音。

对话框页面展示

代码实现

渲染层

<view class="message" v-if="item.textType == 2" @click="playVoice(item.msgText.voice)">
  <!-- 音频 -->
  <view class="msg-text voice" :style="{width:item.msgText.time*4+'rpx'}">
    {{item.msgText.time}}″
     
    // 当前语音正在播放
    <image v-if="currentSrc==item.msgText.voice&&palying" src="/static/message/voice_gif.gif"
      class="voice-img" mode="aspectFit"></image>
    
    // 当前语音没有被播放
    <image v-else src="/static/message/voice.svg" class="voice-img" mode="aspectFit"></image>
  </view>
</view>

逻辑层

 //音频播放
  const innerAudioContext = uni.createInnerAudioContext();
  const palying = ref(false)

  const currentSrc = ref('')
  // 播放语音
  const playVoice = (e) => {
    console.log("点击播放按钮", e, currentSrc.value)
    // 如果点击的是当前正在播放的音频,则切换播放/暂停状态
    if (currentSrc.value == e) {
      console.log("点击的是当前正在播放的音频")
      if (innerAudioContext.paused) {
        innerAudioContext.play();
      } else {
        innerAudioContext.pause();
      }
      palying.value = !palying.value;
    } else {
      console.log("当前点击的是不同的音频", innerAudioContext.src, e, )
      // 如果点击的是不同的音频,停止当前播放的音频并从头播放新的音频
      if (innerAudioContext.src != e) {
        innerAudioContext.offEnded();
        innerAudioContext.stop();
        innerAudioContext.src = e;
        innerAudioContext.autoplay = true;
        innerAudioContext.play();
        currentSrc.value = e; // 更新当前播放的音频源
        palying.value = true;
      }
    }

    // 监听播放结束事件
    innerAudioContext.onEnded(() => {
      console.log('播放结束');
      palying.value = false;
      // currentSrc.value = null; // 清除当前播放的音频源
      innerAudioContext.seek(0) //将播放位置重置到开头
    });
  }

语音消息格式

 {
   id: 3,
   "sendName": "゛时光い",
   "receviceName": "xpq",
   "msgSendHeadImg": "https://profile-avatar.csdnimg.cn/d29edf7348024b8f834e7a8b90887173_qq_45569925.jpg!1",
   "msgSendId": 1,
   "msgText": {
     "voice": "https://web-ext-storage.dcloud.net.cn/uni-app/ForElise.mp3",
     "time": 175 //秒
    },
    "createTime": "2022-01-06 12:22:12",
    "updateTime": null,
    "chatmState": 1,
    "TextType": 2
 },

实现在线文本转语音播放,可以使用uniappuni.request函数来调用第三方语音合成API,将文本转换成语音文件,并使用uni.createInnerAudioContext函数来播放语音。以下是一个简单的示例代码: ``` <template> <view> <textarea v-model="text"></textarea> <button @click="textToSpeech">转换为语音播放</button> </view> </template> <script> export default { data() { return { text: '' } }, methods: { textToSpeech() { uni.request({ url: 'https://api.xxx.com/text-to-speech', // 第三方语音合成API的地址 method: 'POST', data: { text: this.text }, success: (res) => { if (res.statusCode === 200) { const audioCtx = uni.createInnerAudioContext() audioCtx.src = res.data // 将语音文件的链接赋给audioCtx的src属性 audioCtx.play() // 播放语音 } else { uni.showToast({ title: '转换失败', icon: 'none' }) } }, fail: (err) => { uni.showToast({ title: '请求失败', icon: 'none' }) } }) } } } </script> ``` 在这个示例,我们使用了一个第三方语音合成API来实现文本转语音的功能。在textToSpeech方法,我们使用uni.request函数向API发送POST请求,并将文本数据放在请求体,API会返回一个语音文件的链接。如果请求成功,我们就使用uni.createInnerAudioContext函数创建一个音频上下文对象,将语音文件链接赋给它的src属性,并调用play方法来播放语音。如果请求失败,我们就使用uni.showToast函数显示错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值