微信js-sdk 录音功能的示例代码


Posted in Javascript onNovember 01, 2019

需求描述

制作一个H5页面,打开之后可以录音,并将录音文件提交至后台

微信js-sdk 录音功能的示例代码

微信js-sdk 录音功能的示例代码

微信js-sdk 录音功能的示例代码

微信js-sdk 录音功能的示例代码

微信js-sdk 录音功能的示例代码

微信录音最长时长为1min

微信官方文档--音频接口

代码如下

// isVoice: 0-未录音 1-录音中 2-录完音 
  // 点击录音/录音中 按钮展示
   <div class="vm-voice-box" v-show="isVoice < 2">
    <p v-show="!isVoice" @click="voiceStart">点击录音</p>
    <img v-show="isVoice" @click="voiceEnd" src="../../xxx/ico-voice.png" alt="">
   </div>
   
  // isListen  // 0-未试听/试听结束 1-试听中 2-暂停试听
  // 录完音 按钮展示
   <div class="vm-voice-player" v-show="isVoice == 2">
    <div class="vm-vp-button">
     <p class="vm-vp-revoice" @click="openMask(0)">重录</p>
     <p class="vm-vp-submit" :class="{'vm-vp-no-submit' : isSubmit}" @click="openMask(1)">提交</p>
     <p class="vm-vp-pause" v-show="!isListen" @click="play">试听</p>
     <p class="vm-vp-pause" v-show="isListen==1" @click="pause">| |</p>
     <p class="vm-vp-pause vm-vp-border" v-show="isListen==2" @click="play"> ▶ </p>
    </div>
   </div>
   
   data() {
     return {
      id: '',
      startTime: 0,
      recordTimer: null,
      localId: '', // 录音本地id
      serverId: '', // 录音微信服务id
      showMask: false,
      tip: 1, //提交 0- 重录
      isVoice: 0, // 0-未录音 1-录音中 2-录完音
      isListen: 0, // 0-未试听/试听结束 1-试听中 2-暂停试听
      data1: 0,
      work: {},
      isPlay: false, // 是否播放
      isSubmit: false, // 是否已提交
     }
   }
   
   
   // 微信配置
   getConfig() {
    let _url = encodeURIComponent(window.location.href)
    // 后台提供接口,传入当前url(返回基础配置信息)
    voiceApi.wechatConfig(_url)
    .then(res => {
      if (res.data.code == 200) {
       wx.config({
        debug: false,
        appId: res.data.content.appid,
        timestamp: res.data.content.timestamp, // 必填,生成签名的时间戳
        nonceStr: res.data.content.nonceStr, // 必填,生成签名的随机串
        signature: res.data.content.signature, // 必填,签名
        // 需要授权的api接口
        jsApiList: [
          'startRecord', 'stopRecord', 'onVoiceRecordEnd', 'uploadVoice', 'downloadVoice', 'playVoice', 'pauseVoice', 'onVoicePlayEnd'
        ]
       })
wx.ready( () => {
      wx.onVoiceRecordEnd({
        // 录音时间超过一分钟没有停止的时候会执行 complete 回调
        complete: function (res) {
         _this.isVoice = 2
         _this.localId = res.localId;
        }
      })
     })
    }
  })
 },
 // 开始录音
 voiceStart(event) {
  let _this = this
  event.preventDefault()
  // 延时后录音,避免误操作
  this.recordTimer = setTimeout(function() {
   wx.startRecord({
    success: function() {
     _this.startTime = new Date().getTime()
     _this.isVoice = 1
    },
    cancel: function() {
     _this.isVoice = 0
    }
   })
  }, 300)
 },
 // 停止录音
 voiceEnd(event) {
  this.isVoice = 2
  let _this = this
  event.preventDefault()
  // 间隔太短
  if (new Date().getTime() - this.startTime < 300) {
   this.startTime = 0
   // 不录音
   clearTimeout(this.recordTimer)
  } else {
   wx.stopRecord({
    success: function(res) {
    // 微信生成的localId,此时语音还未上传至微信服务器
     _this.localId = res.localId
    },
    fail: function(res) {
     console.log(JSON.stringify(res))
    }
   })
  }
 },
 
 // 试听
 tryListen() {
  let _this = this
  wx.playVoice({
   localId: _this.localId // 需要播放的音频的本地ID,由stopRecord接口获得
  })
  console.log('试听。。。')
  wx.onVoicePlayEnd({ // 监听播放结束
    success: function (res) {
     console.log('试听监听结束')
     _this.isListen = 0
    }
  });
 },
 // 试听停止
 tryStop() {
  let _this = this
  wx.pauseVoice({
   localId: _this.localId // 需要停止的音频的本地ID,由stopRecord接口获得
  })
 },
 
 
 // 处理录音数据
 voiceHandle() {
  let _this = this
  wx.uploadVoice({
   localId: this.localId, // 需要上传的音频的本地ID,由stopRecord接口获得
   isShowProgressTips: 1, // 默认为1,显示进度提示
   success: function (res) {
   // 微信语音已上传至 微信服务器并返回一个服务器id
    _this.serverId = res.serverId; // 返回音频的服务器端ID
    _this.upVoice()
   }
  })
 },
 // 自己后台上传接口
 upVoice() {
  let data = {
   id: this.id,
   serviceId: this.serverId
  }
  voiceApi.upVoice(data)
  .then(res => {
   if(res.data.code == 200) {
    // !! todo 隐藏loading
    this.isSubmit = true
    this.$Message.message('提交成功')
    this.closeMask()
   } else {
    this.$Message.message(res.data.message)
   }
  })
  .catch(err => {
   console.log(err)
  })
 },

1. 微信jsdk配置

2. 调取微信录音开始方法  wx.startRecord

3. 调取微信录音结束方法  wx.stopRecord
成功后返回一个本地音频id  localId
⚠️ 如果不调用录音结束方法,待录音1min后自动结束,需要wx.onVoiceRecordEnd 监听录音结束

4. 上传录音至微信服务器  wx.uploadVoice
返回serverId
⚠️ 微信存储时间有限,有效期3天
⚠️ 目前多媒体文件下载接口的频率限制为10000次/天,如需要调高频率,请登录微信公众平台,在开发 - 接口权限的列表中,申请提高临时上限。

5. 调取自己后台上传至自己服务器
这部可以看做,将 serverId 传给自己的服务器,然后自己服务器调微信提供的接口去下载(serverId)至自己服务器存储

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript面向对象扩展库代码分享
Mar 27 Javascript
jquery延迟加载外部js实现代码
Jan 11 Javascript
ExtJS4如何给同一个formpanel不同的url
May 02 Javascript
图片懒加载插件实例分享(含解析)
Jan 09 Javascript
基于JavaScript实现全选、不选和反选效果
Feb 15 Javascript
vue动态组件实现选项卡切换效果
Mar 08 Javascript
javascript实现多张图片左右无缝滚动效果
Mar 22 Javascript
浅谈vue.js中v-for循环渲染
Jul 26 Javascript
详解node单线程实现高并发原理与node异步I/O
Sep 21 Javascript
angularJs中$scope数据序列化的实例
Sep 30 Javascript
浅谈Vue.js中如何实现自定义下拉菜单指令
Jan 06 Javascript
详解vue 组件
Jun 11 Javascript
使用 Angular RouteReuseStrategy 缓存(路由)组件的实例代码
Nov 01 #Javascript
vue实现计步器功能
Nov 01 #Javascript
详解小程序如何改变onLoad的执行时机
Nov 01 #Javascript
js canvas实现星空连线背景特效
Nov 01 #Javascript
jQuery鼠标滑过横向时间轴样式(代码详解)
Nov 01 #jQuery
微信小程序定义和调用全局变量globalData的实现
Nov 01 #Javascript
vue-router 中 meta的用法详解
Nov 01 #Javascript
You might like
PHP分页函数代码(简单实用型)
2010/12/02 PHP
与文件上传有关的php配置参数总结
2013/06/14 PHP
mac下多个php版本快速切换的方法
2016/10/09 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
2017/06/13 PHP
PHP命名空间与自动加载机制的基础介绍
2019/08/25 PHP
phpstudy隐藏index.php的方法
2020/09/21 PHP
关于JS中的闭包浅谈
2013/08/23 Javascript
thinkphp中常用的系统常量和系统变量
2014/03/05 Javascript
js实现从中间开始往上下展开网页窗口的方法
2015/03/02 Javascript
JS实现文字放大效果的方法
2015/03/03 Javascript
JavaScript中instanceof运算符的使用示例
2016/06/08 Javascript
详解vue2.0 资源文件assets和static的区别
2018/11/27 Javascript
JavaScript多种页面刷新方法小结
2019/04/04 Javascript
vue轻量级框架无法获取到vue对象解决方法
2019/05/12 Javascript
[01:46]DOTA2上海特锦赛小组赛英文解说KotlGuy采访
2016/02/27 DOTA
python实现类似ftp传输文件的网络程序示例
2014/04/08 Python
Python多进程机制实例详解
2015/07/02 Python
Python脚本实现12306火车票查询系统
2016/09/30 Python
Python RabbitMQ消息队列实现rpc
2018/05/30 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
2019/01/17 Python
Python3字符串encode与decode的讲解
2019/04/02 Python
python控制台实现tab补全和清屏的例子
2019/08/20 Python
python 动态调用函数实例解析
2019/10/21 Python
python 实现读取csv数据,分类求和 再写进 csv
2020/05/18 Python
Pytorch自定义Dataset和DataLoader去除不存在和空数据的操作
2021/03/03 Python
介绍下WebSphere的安全性
2013/01/31 面试题
公务员的自我鉴定
2013/10/26 职场文书
数控技术专业毕业自荐书范文
2014/02/05 职场文书
大课间活动实施方案
2014/03/06 职场文书
项目施工员岗位职责
2014/03/09 职场文书
治超工作实施方案
2014/05/04 职场文书
"9.18"国耻日演讲稿范文
2014/09/14 职场文书
上班迟到检讨书
2014/09/15 职场文书
倡议书作文
2015/01/19 职场文书
幼儿园见习总结
2015/06/23 职场文书
Vue的过滤器你真了解吗
2022/02/24 Vue.js