微信小程序接收音频流并播放教程

由于wx.arrayBufferToBase64方法停止维护了,我试了很多其他的方法都不能有效的把文件流转成base64再交给innerAudioContext.src播放声音。

最后的解决办法

  1. 从后端接收文件流。
  2. 将文件通过writeFile方法下载至本地。
  3. 使用下载的路径直接播放。

不知道为什么writeFile方法有时候无法覆盖同位置同名的文件,
播放时会播放之前储存的文件。
索性给文件名加上了不会重复的uuid,获取uuid的方法我是自己写的,放在下面了。

const {
  uuid
} = require('../../utils/util');

wx.request({
      url: `${baseURL}/speech/synthesize`, //调用后端接口
      method: "POST",
      header: {
        //想在fromdata里添加参数需要加这个请求头(重要)
        'content-type': 'application/x-www-form-urlencoded',
        //给后端的token认证,没有可省略👇
        'Authorization': `Bearer ${wx.getStorageSync('token')}`
      },
      //获取文件流
      responseType: 'arraybuffer',
      data: {
        content: content
      },
      success(res) {
        const path = `${wx.env.USER_DATA_PATH}/${that.data.id}-${uuid()}.mp3`;
        const fsm = wx.getFileSystemManager();
        fsm.writeFile({
          filePath: path,
          data: res.data,
          encoding: 'base64',
          success: (res) => {
            const innerAudioContext = wx.createInnerAudioContext();
            innerAudioContext.src = path;
            innerAudioContext.play(); // 开始播放音频
          },
        });
      },
      fail(res) {
        console.log(res);
      }
    })
// 获取uuid的方法,放在util里
const uuid = function () {
  var s = [];
  var hexDigits = "0123456789abcdef";
  for (var i = 0; i < 36; i++) {
    s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
  }
  s[14] = "4";
  s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);
  s[8] = s[13] = s[18] = s[23] = "-";
  var uuid = s.join("");
  return uuid
}
module.exports = {
  uuid
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现在微信小程序中点击播放音频,你可以使用`<audio>`标签和相应的事件监听来实现。以下是一个简单的示例代码,展示了如何在微信小程序中实现点击播放音频的功能: 在 wxml 文件中,添加以下代码: ```html <!-- 播放按钮 --> <button bindtap="playAudio">播放</button> <!-- 音频组件 --> <audio id="audio" src="{{ audioSrc }}" bindplay="onPlay" bindpause="onPause"></audio> ``` 在 js 文件中,添加以下代码: ```javascript Page({ data: { audioSrc: '音频地址', isPlaying: false }, // 播放按钮点击事件 playAudio() { const audio = this.selectComponent('#audio'); if (this.data.isPlaying) { audio.pause(); } else { audio.play(); } }, // 音频播放事件 onPlay() { this.setData({ isPlaying: true }); }, // 音频暂停事件 onPause() { this.setData({ isPlaying: false }); } }); ``` 请将`音频地址`替换为你要播放的实际音频地址。当点击播放按钮时,会触发`playAudio`方法,在该方法中判断当前是否正在播放音频,如果是,则暂停音频;如果不是,则播放音频。同时,通过`bindplay`和`bindpause`事件监听,当音频开始播放和暂停时,会触发相应的事件处理函数`onPlay`和`onPause`,在这些函数中可以根据需要进行相关操作,比如更新播放状态。 这样就可以实现点击播放音频的功能了。当点击播放按钮时,音频会开始播放;再次点击播放按钮,则会暂停音频播放

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值