微信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 相关文章推荐
HTML上传控件取消选择
Mar 06 Javascript
js中arguments,caller,callee,apply的用法小结
Jan 28 Javascript
jQuery中removeProp()方法用法实例
Jan 05 Javascript
jquery实现未经美化的简洁TAB菜单效果
Aug 28 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
Feb 16 Javascript
Boostrap基础教程之JavaScript插件篇
Sep 08 Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
Oct 31 Javascript
Node.js连接mongodb实例代码
Jun 06 Javascript
详解Angular CLI + Electron 开发环境搭建
Jul 20 Javascript
JavaScript基础之this和箭头函数详析
Sep 05 Javascript
layui 监听select选择 获取当前select的ID名称方法
Sep 24 Javascript
JS实现移动端可折叠导航菜单(现代都市风)
Jul 07 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
我的论坛源代码(九)
2006/10/09 PHP
在服务端进行目录建立、删除,文件上传、删除的过程的php代码
2008/09/10 PHP
浅谈使用 Yii2 AssetBundle 中 $publishOptions 的正确姿势
2017/11/08 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
IE6,IE7下js动态加载图片不显示错误
2010/07/17 Javascript
window.open()详解及浏览器兼容性问题示例探讨
2014/05/29 Javascript
jQuery中ajax和post处理json的不同示例对比
2014/11/02 Javascript
jQuery中unwrap()方法用法实例
2015/01/16 Javascript
Select下拉框模糊查询功能实现代码
2016/07/22 Javascript
AngularJS中的API(接口)简单实现
2016/07/28 Javascript
canvas实现图像截取功能
2017/02/06 Javascript
iscroll动态加载数据完美解决方法
2017/07/18 Javascript
JS实现页面内跳转的简单代码
2017/09/03 Javascript
详解Vue 中 extend 、component 、mixins 、extends 的区别
2017/12/20 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
详解vue微信网页授权最终解决方案
2019/06/16 Javascript
小程序如何获取多个formId实现详解
2019/09/20 Javascript
[01:04:30]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python求两个文本文件以行为单位的交集、并集与差集的方法
2015/06/17 Python
Django Admin实现上传图片校验功能
2016/03/06 Python
使用python实现接口的方法
2017/07/07 Python
解决python ogr shp字段写入中文乱码的问题
2018/12/31 Python
Python对象与引用的介绍
2019/01/24 Python
Python浮点数四舍五入问题的分析与解决方法
2019/11/19 Python
python range实例用法分享
2020/02/06 Python
windows、linux下打包Python3程序详细方法
2020/03/17 Python
CSS3教程(9):设置RGB颜色
2009/04/02 HTML / CSS
KLOOK客路:发现更好玩的世界,预订独一无二的旅行体验
2016/12/16 全球购物
出门问问全球官方商城:Tichome音箱和TicWatch智能手表
2017/12/02 全球购物
电信专业应届生自荐信
2013/09/28 职场文书
奖学金自我鉴定范文
2013/10/03 职场文书
住院医师规范化培训实施方案
2014/06/12 职场文书
Go缓冲channel和非缓冲channel的区别说明
2021/04/25 Golang
如何使JavaScript休眠或等待
2021/04/27 Javascript
解决numpy和torch数据类型转化的问题
2021/05/23 Python
Apache Pulsar集群搭建部署详细过程
2022/02/12 Servers