微信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 相关文章推荐
IE8 中使用加速器(Activities)
May 14 Javascript
js事件冒泡实例分享(已测试)
Apr 23 Javascript
JavaScript的作用域和块级作用域概念理解
Sep 21 Javascript
jQuery实现的精美平滑二级下拉菜单效果代码
Mar 28 Javascript
JS封装的选项卡TAB切换效果示例
Sep 20 Javascript
完美解决jQuery 鼠标快速滑过后,会执行多次滑出的问题
Dec 08 Javascript
jQuery实现菜单栏导航效果
Aug 15 jQuery
js插件实现图片滑动验证码
Sep 29 Javascript
初探js和简单隐藏效果的实例
Nov 23 Javascript
inquirer.js一个用户与命令行交互的工具详解
May 18 Javascript
JS数据类型STRING使用实例解析
Dec 18 Javascript
js如何验证密码强度
Mar 18 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
如何给phpcms v9增加类似于phpcms 2008中的关键词表
2013/07/01 PHP
php中操作memcached缓存进行增删改查数据的实现代码
2014/08/15 PHP
php根据一个给定范围和步进生成数组的方法
2015/06/19 PHP
ubuntu下配置nginx+php+mysql详解
2015/09/10 PHP
thinkphp3.x自定义Action、Model及View的简单实现方法
2016/05/19 PHP
Laravel多域名下字段验证的方法
2019/04/04 PHP
JavaScript的eval JSON object问题
2009/11/15 Javascript
判断浏览器的javascript版本的代码
2010/09/03 Javascript
基于JQuery的一个简单的鼠标跟随提示效果
2010/09/23 Javascript
基于jQuery的左右滚动实现代码
2010/12/03 Javascript
JQuery模板插件 jquery.tmpl 动态ajax扩展
2011/11/10 Javascript
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
jQuery操作select下拉框的text值和value值的方法
2014/05/31 Javascript
JavaScript实现文字与图片拖拽效果的方法
2015/02/16 Javascript
Bootstrap模态框水平垂直居中与增加拖拽功能
2016/11/09 Javascript
vue一个页面实现音乐播放器的示例
2018/02/06 Javascript
vue-cli3+ts+webpack实现多入口多出口功能
2019/05/30 Javascript
解决vue v-for src 图片路径问题 404
2019/11/12 Javascript
python多维数组切片方法
2018/04/13 Python
Python字符串逆序输出的实例讲解
2019/02/16 Python
python获取微信企业号打卡数据并生成windows计划任务
2019/04/30 Python
使用Python实现毫秒级抢单功能
2019/06/06 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
2019/10/12 Python
Python 自由定制表格的实现示例
2020/03/20 Python
浅谈JupyterNotebook导出pdf解决中文的问题
2020/04/22 Python
Python3+PyCharm+Django+Django REST framework配置与简单开发教程
2021/02/16 Python
浅析rem和em和px vh vw和% 移动端长度单位
2016/04/28 HTML / CSS
慕尼黑山地运动、户外服装和体育用品专家:Sporthaus Schuster
2019/08/27 全球购物
机械制造专业个人的自我评价
2013/12/28 职场文书
编辑找工作求职信分享
2014/01/03 职场文书
教师评优事迹材料
2014/01/10 职场文书
教师节活动主持词
2014/04/02 职场文书
《独坐敬亭山》教学反思
2014/04/08 职场文书
马丁路德金演讲稿
2014/05/19 职场文书
MySQL查看表和清空表的常用命令总结
2021/05/26 MySQL
vue-cropper组件实现图片切割上传
2021/05/27 Vue.js