微信jssdk录音功能开发记录

标签(空格分隔): 前端


0.需求描述

在微信浏览器内打开的页面,制作一个按钮,用户按住按钮后开始录音,松手后停止录音并将录音上传并长期保存。


1.开发流程

如果开发的是普通的展示性页面,就和开发普通的页面没有区别,不过这里要用到设备(手机)的录音功能,就需要调用微信app的录音接口,需要使用微信jssdk。

使用微信jssdk:微信JS-SDK说明文档

  • 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。[需要有微信公众号]
  • 引入JS文件
  • 通过config接口注入权限验证配置
  • 通过ready接口处理成功验证
  • 通过error接口处理失败验证
//假设已引入微信jssdk。【支持使用 AMD/CMD 标准模块加载方法加载】
wx.config({debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。appId: '', // 必填,公众号的唯一标识timestamp: , // 必填,生成签名的时间戳nonceStr: '', // 必填,生成签名的随机串signature: '',// 必填,签名,见附录1jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});wx.ready(function(){// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});wx.error(function(res){// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。});

本次需求核心功能:录音并保存

//假设全局变量已经在外部定义
//按下开始录音
$('#talk_btn').on('touchstart', function(event){event.preventDefault();START = new Date().getTime();recordTimer = setTimeout(function(){wx.startRecord({success: function(){localStorage.rainAllowRecord = 'true';},cancel: function () {alert('用户拒绝授权录音');}});},300);
});
//松手结束录音
$('#talk_btn').on('touchend', function(event){event.preventDefault();END = new Date().getTime();if((END - START) < 300){END = 0;START = 0;//小于300ms,不录音clearTimeout(recordTimer);}else{wx.stopRecord({success: function (res) {voice.localId = res.localId;uploadVoice();},fail: function (res) {alert(JSON.stringify(res));}});}
});//上传录音
function uploadVoice(){//调用微信的上传录音接口把本地录音先上传到微信的服务器//不过,微信只保留3天,而我们需要长期保存,我们需要把资源从微信服务器下载到自己的服务器wx.uploadVoice({localId: voice.localId, // 需要上传的音频的本地ID,由stopRecord接口获得isShowProgressTips: 1, // 默认为1,显示进度提示success: function (res) {//把录音在微信服务器上的id(res.serverId)发送到自己的服务器供下载。$.ajax({url: '后端处理上传录音的接口',type: 'post',data: JSON.stringify(res),dataType: "json",success: function (data) {alert('文件已经保存到七牛的服务器');//这回,我使用七牛存储},error: function (xhr, errorType, error) {console.log(error);}});}});
}//注册微信播放录音结束事件【一定要放在wx.ready函数内】
wx.onVoicePlayEnd({success: function (res) {stopWave();}
});

2.小麻烦

要防止用户误操作(如:反复点击、误触摸)导致的无效录音。

小于300ms不录音

防止用户长按导致的浏览器默认弹出微信浏览器默认的“复制对话框”。

使用css设置按钮 user-select:none;

微信播放录音接口事件回调函数无效

微信注册事件一定要放在wx.ready中。

阻止默认事件

touch 事件记得加 event.preventDefault(); 防火防爆

微信存储静态资源时间为3天,如何长期保存

要么存到自己服务器,要么利用其它资源,比如七牛,还可以帮我们自由转换amr格式到mp3等格式呢!
微信服务器默认资源格式为amr,这个格式在android机器可以使用audio标签播放,在ios机器使用audio标签无法播放。

微信录音功能授权引发的交互问题

使用微信jssdk接口录音,在同一个域只需要授权一次,即第一次使用录音的时候,微信自己会弹出对话框询问是否允许录音,用户点击允许后,之后再使用录音时,便不会再咨询用户是否允许。
在第一次按住录音后,由于用户未曾允许录音,微信会提示用户授权允许在本页面使用微信录音功能,这时用户会放开录音按钮转而去点击允许,在用户允许后,才真正会开始录音,而此时用户早已放开录音按钮,那么录音按钮上便不会再有touchend事件,录音便会一直进行。
解决策略:使用localStorage记录用户是否曾授权,并以此来判断是否需要在刚进入页面是自动录一段录音来触发用户授权

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

3.难题

音量bug:在ios设备上,使用微信录音功能后,再播放audio标签的音频,音量极低。
但是使用微信接口(wx.playVoice)播放录音的音量是正常的,而且之后,audio标签的音量会有所增大(但是依然音量很低)。

该问题正在沟通微信相关技术人员。
暂时的解决策略为:对于刚刚录音的音频,使用wx.playVoice来播放,否则使用audio播放服务器资源。原因是不确定该音频本地是否存在,刚刚录音的音频肯定是存在的。

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

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

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

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

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

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

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

  4. 微信JSSDK录音功能

    微信网页端录音功能,尝试了其他方法,发现都不行,微信网页端只能依靠微信JSSDK实现录音功能,有点恶心了. 安装微信JSSDK npm install weixin-js-sdk 通过config接口 ...

  5. 微信小程序开发记录一,开发工具的使用

    工欲善其事,必先利其器. 开发工具的下载> 1.微信开发者工具的下载: 下载地址:https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/downl ...

  6. 微信JSSDK javascript 开发 代码片段,仅供参考

    最全面最专业的微信公众平台开发教程:http://www.cnblogs.com/txw1958/p/weixin-js-sdk-demo.html 比较完整的分享教程:http://www.cnbl ...

  7. 微信企业号__开发记录__二次验证

    本博文只是针对自己开发当中的记录,并非教程! 对于详细内容,请参看博客 http://blog.csdn.net/hanxuemin12345/article/details/44645303#0-t ...

  8. 微信小程序开发记录1——创建小程序

    临近开学,打算做一个新生信息填报的采集程序,新生报道时可以扫码填写. 目前其实已经有很多好用的小程序可供我们选择了,但是因为我们的信息采集中涉及很多学生的个人隐私(管理工作需要,必须采集的),因此对其 ...

  9. 微信小程序开发记录2——获取openid失败

    今天在尝试的时候发现点击获取openid时,获取失败,查了很多可能的原因,包括未开通云开发.未上传部署云函数.未指定环境.未配置环境ID.以及未安装sdk等,都没有发现问题. 可以看到我的云开发是开通 ...

最新文章

  1. 百度:YOLOX和NanoDet都没我优秀!轻量型实时目标检测模型PP-PicoDet开源
  2. 不懂编程可以自学python吗-我不会编程,也可能学会Python吗?
  3. ACCESS数据库连接字符串
  4. 17.默认值Default.rs
  5. php一句话过狗,整理的最新WebSHell (php過狗一句話,過狗菜刀,2016過狗一句話,2016php免殺一句話)...
  6. 批量保存到mysql_关于保存批量数据进入mysql
  7. html5 canvas简易时钟
  8. 10.程序员的自我修养---内存
  9. educoder 使用线程锁(lock)实现线程同步_Java8并发包源码分析:重入锁ReentrantLock和Condition实现原理...
  10. python转js对象_将Python对象转换为PyV8的JavaScript
  11. c语言 误差函数erf代码,高斯(余补)误差函数erf和erfc
  12. BUUCTF:sqltest
  13. 阴阳师android转ios,阴阳师手游IOS自动刷御魂?IOS切换控制教程[多图]
  14. DocumentBuilderFactory.newInstance() 异常解决
  15. android 设置默认铃声,我的Android进阶之旅------gt;Android系统设置默认来电铃声、闹钟铃声、通知铃声,android进阶...
  16. 【毕业设计】深度学习 python opencv 实现人脸年龄性别识别
  17. ACTS:首屈一指的软件测试策略是什么?
  18. 【JVAV】—继承、多态、抽象类
  19. JVM笔记 - Java 虚拟机关于 Synchronized 实现以及锁实现的总结
  20. OSChina 周六乱弹 —— 啊,谢谢好心的先生

热门文章

  1. 说散就散乃是人生常态
  2. Navicat连接mysql时出现 Access denied for user ‘root‘@‘xxx.xxx.xxx.xxx‘ (using password: YES) 的原因及解决办法。
  3. sparkSQL1.1入门
  4. 天梯赛-L2-027 名人堂与代金券(25)(多条件排序)
  5. Python的大数据之旅(1)---Anaconda与WingIDE安装
  6. ROS机器人操作系统现场培训课程|2017年9月
  7. 研究生如何进行文献检索和文献阅读
  8. RTK固定解什么意思
  9. 逍遥模拟器拷贝android根目录文件,逍遥安卓模拟器怎样将已安装的镜像文件转移到别的磁盘上...
  10. 【题解】1118 Birds in Forest (25分)⭐⭐ 【并查集】