录音、上传、播放音频微信小程序实践

录音、上传、播放音频微信小程序实践

最近上线了一款智能外呼机器人产品,需要开发一款录音、上传、播放音频功能的
微信小程序给录音师配置外呼话术真人录音。

代码已开源,数据均已本地化处理。适合新手参考学习的完整原生微信小程序小项目。

实践分析

依赖接口

主要使用以下 api

  1. wx.getRecorderManager :获取全局唯一的录音管理器 RecorderManager
  2. wx.createInnerAudioContext : 创建内部 audio 上下文 InnerAudioContext 对象

PS.

  1. 默认 audio 组件样式不符合需求,目前只需播放进度条,InnerAudioContext 配合 process 组件实现
  2. InnerAudioContext 退出小程序自动停止播放,需要退出小程序依然可播放请使用背景音频 BackgroundAudioManager 代替

为什么要声明全局变量:

  1. 录音本身就是唯一全局
  2. 语音播放,如果每次离开、进入页面动态生成、销毁(好像有 bug),会有多条音频同时播放,为避免这个问题,使用全局唯一对象管理
const recorderManager: WechatMiniprogram.RecorderManager = wx.getRecorderManager();
const innerAudioContext: WechatMiniprogram.InnerAudioContext = wx.createInnerAudioContext();

录音

  • 录音开始配置
const recordOptions = {
   
  duration: 10 * 60 * 1000, // 最多录音时长 10 分钟
  sampleRate: 8000, // 采样率
  numberOfChannels: 1, // 1 个录音通道即可
  format: 'wav', // 服务端指定格式
};
recorderManager.start(recordOptions)
  • 初始状态
录音
  • 录音检测是否收到声音,本想利用 RecorderManager.onFrameRecorded 来感知是否收到声音,
    展示波形图,但该事件不支持 wav 格式文件。目前监听到开始事件即显示录音计时。
// 监听已录制完指定帧大小的文件事件。如果设置了 frameSize,则会回调此事件。
recorderManager.onFrameRecorded(({
     frameBuffer, isLastFrame }) => {
   
  console.log('frameBuffer.byteLength: ', frameBuffer.byteLength)
  console.log('isLastFrame: ', isLastFrame);
});
  • 监听录音开始事件,设置录音进行中状态,并展示录音计时器
recorderManager.onStart(() => {
   
  console.log('recorder start');
  this.startClock();
  this.setData({
   
    ...recordingData,
  });
});
录音中
  • 停止录音事件,可以接收到本地录音文件地址、录音时长信息。一般上传文件至 CDN ,然后把地址存储到业务服务器,接着试听播放。
recorderManager.stop();
// 停止录音事件
recorderManager.onStop(async (res) => {
   
  • 0
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
以下是微信小程序云开发录音播放页面的代码示例: index.wxml: ```html <!-- 录音按钮 --> <button bindtouchstart="startRecord" bindtouchend="stopRecord">按住录音</button> <!-- 播放录音按钮 --> <button bindtap="playRecord">播放录音</button> ``` index.js: ```javascript const recorderManager = wx.getRecorderManager() const innerAudioContext = wx.createInnerAudioContext() Page({ data: { tempFilePath: '' }, // 开始录音 startRecord() { recorderManager.start({ format: 'mp3' }) }, // 停止录音 stopRecord() { recorderManager.stop() recorderManager.onStop(res => { console.log('录音文件路径:', res.tempFilePath) this.setData({ tempFilePath: res.tempFilePath }) }) }, // 播放录音 playRecord() { innerAudioContext.src = this.data.tempFilePath innerAudioContext.play() } }) ``` 在上述代码中,我们首先使用 `wx.getRecorderManager()` 获取录音管理器,并使用 `recorderManager.start()` 开始录音,使用 `recorderManager.stop()` 停止录音,并在 `recorderManager.onStop()` 中获取录音文件的路径。 接着,我们使用 `wx.createInnerAudioContext()` 创建一个内部音频播放器,并使用 `innerAudioContext.play()` 播放录音文件。 需要注意的是,由于涉及到录音播放,需要在小程序的 `app.json` 文件中设置相应的权限: ```json { "permission": { "scope.record": { "desc": "用于录音" }, "scope.writePhotosAlbum": { "desc": "用于保存录音文件" } } } ``` 同时,还需要在小程序的云开发控制台中开通云存储服务,并在 `project.config.json` 文件中添加以下配置: ```json { "cloudfunctionRoot": "./functions", "setting": { "urlCheck": true, "es6": true, "postcss": true, "preloadBackgroundData": false, "minified": true, "newFeature": true, "coverView": true, "nodeModules": true, "autoAudits": false, "useMultiFrameRuntime": true, "enablePullDownRefresh": true, "enableShareAppMessage": true, "enableShareTimeline": true, "enablePageScroll": true, "enablePageReachBottom": true, "enablePageShare": true }, "packOptions": { "ignore": [] }, "compileType": "miniprogram", "appid": "your appid", "projectname": "your project name", "miniprogramRoot": "./" } ``` 以上代码中的 `your appid` 和 `your project name` 需要替换为真实的小程序 appid 和项目名称。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值