项目需求简单描述

用户长按录音,松手后直接结束录音,结束录音后,用户可以选择重新录音、播放刚才的录音,上传录音(这里的上传录音指上传到自己服务器,上传步骤是,前端调用wx.uploadVoice,后台再到微信服务器下载音频文件,上传到自己的服务器)。注意,音频文件自上传时间算起在微信服务器的有效期为3天。由于后台从微信服务器下载的音频文件是amr格式的,需要后台先把amr文件转换成MP3,前端用audio播放。我们公司是购买阿里云的媒体处理服务进行文件转码的。

调用到的微信接口

// 开始录音接口
wx.startRecord();// 停止录音接口
wx.stopRecord({
success: function (res) {var localId = res.localId;}
});// 监听录音自动停止接口
wx.onVoiceRecordEnd({// 录音时间超过一分钟没有停止的时候会执行 complete 回调complete: function (res) {var localId = res.localId;}
});// 播放语音接口
wx.playVoice({localId: '' // 需要播放的音频的本地ID,由stopRecord接口获得
});// 暂停播放接口
wx.pauseVoice({localId: '' // 需要暂停的音频的本地ID,由stopRecord接口获得
});// 监听语音播放完毕接口
wx.onVoicePlayEnd({wx.onVoicesuccess: function (res) {var localId = res.localId; // 返回音频的本地ID}
});// 上传语音接口
wx.uploadVoice({localId: '', // 需要上传的音频的本地ID,由stopRecord接口获得isShowProgressTips: 1, // 默认为1,显示进度提示success: function (res) {var serverId = res.serverId; // 返回音频的服务器端ID}
});

主要涉及的知识点

//项目用到的框架:vue.js
@touchstart // 手指触碰屏幕,开始长按
@touchend //手指离开屏幕,结束长按
@touchmove //手指在屏幕上滑动

开发流程

说明:项目用到的框架:Vue
1.引入微信jssdk,做好微信配置

2.HTML结构:

<div @touchstart="gtouchstart()" @touchend="gtouchend()" @touchmove="gtouchmove()"></div>

touchstart事件:MDN的定义是:当触点与触控设备表面接触时触发touchstart 事件,换句话来说,就是手指触碰屏幕时触发,所以这里监听开始长按。

@touchend事件:当手指从屏幕上离开的时候触发,这里今天长按结束。

@touchmove事件:当手指在屏幕上滑动的时候连续地触发。在这个长按录音的场景中,当手指在屏幕上移动了,也视为录音结束,所以要监听手指在屏幕上滑动。

3.js代码

methods:{gtouchstart(){// 当用户长按500ms以上再真正开始录音setTimeout(() => {this.longPress()}, 500)}},longPress(){wx.startRecord() // 微信开始录音接口},gtouchmove(){wx.stopRecord({ // 微信结束录音接口success: res => {this.localId = res.localId;console.log('中断结束录音')}})},gtouchend(){wx.stopRecord({ // 微信结束录音接口success: res => {this.localId = res.localId;console.log('正常结束录音成功了')}})},wxUpload() { // 上传到微信服务器wx.uploadVoice({localId: this.localId, // 需要上传的音频的本地ID,由stopRecord接口获得isShowProgressTips: 1, // 默认为1,显示进度提示success: res => {this.serverId = res.serverId; // 返回音频的服务器端ID}});},
}

大致过程如上面代码所示:

  1. 在某个html元素监听开始长按事件、结束长按事件、在屏幕上移动事件;
  2. 长按事件开始,这时调用微信接口wx.startRecord开始录音;
  3. 长按事件结束,这时调用微信接口wx.stopRecord结束录音,得到音频的localId;
  4. 当用户在长按过程中手指移动了,也调用wx.stopRecord结束录音;
  5. 录音结束后,调用微信接口wx.uploadVoice把音频上传到微信服务器。

开发过程遇到的问题

1.调用微信录音超过60秒时,微信会自动结束录音并且返回一个localId,并且这个localId是无效的
解决方案:
在 wx.startRecord() 开始之前添加定时器,如果录音时间到达59秒,执行wx.stopRecord主动停止录音,避免用户录音时间过长导致录音无效。
2.微信录音功能授权引发的交互问题
使用微信jssdk接口录音,在同一个域只需要授权一次,即第一次使用录音的时候,微信自己会弹出对话框询问是否允许录音,用户点击允许后,之后再使用录音时,便不会再咨询用户是否允许。
在第一次按住录音后,由于用户未曾允许录音,微信会提示用户授权允许在本页面使用微信录音功能,这时用户会放开录音按钮转而去点击允许,在用户允许后,才真正会开始录音,而此时用户早已放开录音按钮,那么录音按钮上便不会再有touchend事件,录音便会一直进行。
解决策略:使用localStorage记录用户是否曾授权,并以此来判断是否需要在刚进入页面是自动录一段录音来触发用户授权

if(!localStorage.rainAllowRecord || localStorage.rainAllowRecord !== 'true'){wx.startRecord({success: function(){localStorage.rainAllowRecord = 'true';wx.stopRecord();},cancel: function () {alert('用户拒绝授权录音');}});
}

3.在ios下不能自动播放audio的问题
关于音频的播放,为了页面美观,处理方式是隐藏audio的播放控件,然后给一个按钮添加时间,通过audio.play()来控制音频的播放的。但是在ios下有个问题,audio.play()是不能直接播放音频的,只能显式地通过操作音频的播放控件来。这是因为iOS Safari 不允许自动播放 audio,只能通过用户交互触发。这大概是苹果公司出于用户体验而做的限制。
解决方案:

// 在页面初始化成功后,在wx.ready的回调函数内,收到执行下面的方法,这样ios用户在点击播放按钮时就能正常播放音频
wx.ready(() => {this.$nextTick(() => {this.$refs.audio.load()this.$refs.audio.play()this.$refs.audio.pause();})
})

4.终极问题:某些手机屏幕不灵敏导致长按录音出现各种各样的问题
描述:在初次完成长按录音的功能后,我在公司多台贴了膜或者屏幕摔烂的手机测试发现,这些手机长按、和取消长按的事件相当不灵敏,误差很大,有时莫名其秒地结束录音,体验非常差。
解决方案:我们和产品经过商量,摆出这个避免不了的问题,最终把长按录音的交互模式改成了点击录音。

最后,参考链接:http://www.cnblogs.com/liujun...

微信开发之微信jssdk录音功能开发相关推荐

  1. php开发微信jssdk录音功能,微信 JS-SDK 录音功能开发

    云娜 今天分享一下我第一次接触微信开发,微信JS-SDK录音功能开发的经历. 在开发微信JS-SDK录音功之前我是没有接触过微信开发的,第一反应就是去百度.建议第一次接触微信开发的同学去微信JSSDK ...

  2. 微信jssdk录音功能开发记录

    微信jssdk录音功能开发记录 标签(空格分隔): 前端 0.需求描述 在微信浏览器内打开的页面,制作一个按钮,用户按住按钮后开始录音,松手后停止录音并将录音上传并长期保存. 1.开发流程 如果开发的 ...

  3. jssdk更新日志_微信jssdk录音功能开发记录

    微信jssdk录音功能开发记录 标签(空格分隔): 前端 0.需求描述 在微信浏览器内打开的页面,制作一个按钮,用户按住按钮后开始录音,松手后停止录音并将录音上传并长期保存. 1.开发流程 如果开发的 ...

  4. html 苹果微信录音js,微信jssdk录音功能开发记录

    jvm三的三种类加载器 JVM有三种类加载器:bootstrap负责加载系统类,extclassloader负责加载扩展类,appclassloader负责加载应用类.他们主要是分工不一样,各自负责不 ...

  5. 微信开发---微信网页授权、JS-SDK和微信公众号的基本设置

    用了好几个小时的时间,整理了一下关于公众号的思维导图,由于CSDN不能上传相对应的文件,所以萍子一一的分解开的截图附上来,希望对大家有所帮助哦~ 因为是电脑设备自动截图,又鉴于内容比较多,可能不是太清 ...

  6. 微信公众平台开发:接入JS-SDK和实现分享功能

    微信公众平台开发:接入JS-SDK和实现分享功能 一.本文是实现微信公众号自定义的分享功能开发,也是亲自实践实现该功的一些总结体会. 首先贴上微信JS-SDK说明文档地址:http://mp.weix ...

  7. 腾讯位置服务--微信小程序JSSDK地图开发

    腾讯位置服务–微信小程序JSSDK地图开发 1.腾讯位置服务 文档传送门:https://lbs.qq.com/miniProgram/jsSdk/jsSdkGuide/jsSdkOverview [ ...

  8. 微信jssdk开发 java_Java微信公众平台开发(十三)--微信JSSDK中Config配置

    前端开发工程师和关注前端开发的开发者们在2015年中肯定被腾讯的JSSDk引爆过,搞APP的.搞前端的甚至是是搞后端的都跑过来凑热闹,一时之间也把微信JSSDK捧得特别牛逼,但是在我们的技术眼里它的实 ...

  9. 企业微信开发:使用 JS-SDK 实现图像接口功能(六)

    前言   本文主要是实现图像接口,之前我以为企业微信和微信应该大差不差的,结果这玩意坑还挺多,写篇文章记录一下自己踩过的坑,希望对你们有所帮助!这个地方就不介绍配置 wx.config 了详细请看上一 ...

  10. (第三方平台)开发相关,解除80端口占用,微信公众号分享jssdk实现,微信开放平台登录接口接入,2022微信分享接入本地调试,微信分享定制

    一.开发相关 1.平台地址 微信开放平台 QQ互联平台SDK 2.文章收集 来自CSDN兄台的QQ登录使用的教程 微信网站应用开发的详细流程和引导 VueJs单页应用实现微信网页授权及微信分享功能 [ ...

最新文章

  1. Leangoo Talk第一期——Scrum与OKR融合实践
  2. 【ros】2.ros的xx.msg编译
  3. 执行计划信息Oracle 执行计划总结
  4. 电流源并联怎么合并_一种特殊的并联切换电力系统,长见识了
  5. 剑指offer之从上到下打印二叉树
  6. 04 bbed修复system文件头损坏
  7. 左右边界二分查找小总结
  8. tengine快速安装
  9. 什么软件可以换电脑ip地址
  10. 全球十大外汇交易平台2020最新排名
  11. python使用mq-fw包
  12. 二十一世纪大学英语读写教程(第二册)学习笔记(原文)——9 - Get Ready for Some Wild Weather(准备应对厄尔尼诺)
  13. 带你Dart带你Diao之类(一)
  14. 【慧河网络安全组】Web基础和http协议培训题_1
  15. IntelliJ IDEA 最新版完美破解激活(转)
  16. 启发式与元启发式算法
  17. 2018中国汽车企业排行榜TOP10
  18. OSG 球体参数方程绘制
  19. MFC Windows 程序设计[218]之网络打印机(附源码)
  20. 笔记本外接显示器画质不清晰怎么办?

热门文章

  1. Kodak Preps 8 for Mac(专业拼版软件)
  2. 简单实用的web打印方案-网页精准打印
  3. java soap服务_「java调用webservice」java调用webservice接口 三种方法 - seo实验室
  4. 获取ipa文件下载链接(appstore下载链接)
  5. html 内容写入数据库中,FoxPro数据库写入html文件中
  6. 魔兽世界模型浏览器WowModelExplorer演示
  7. python16_day14【jQuery】
  8. 安装配置fcitx输入法
  9. win10鼠标主题linux,win10系统安装鼠标指针主题包的操作方法
  10. SitePoint播客#108:Kevin的最后一场演出