在移动端音频录制这里,如果要同时支持:微信小程序录音、微信环境内浏览器录音、非微信环境内浏览器录音,那么每个端的情况都要单独处理,其中稍微比较麻烦的就是微信环境内浏览器录音,因为在网页中录音操作本身属于高级硬件访问操作,但是在微信环境内浏览器录音其实并不是纯粹的正常浏览器录音,本质是:原生硬件 -> 微信客户端 -> 微信网页实现录音,因此要单独引入微信的js-sdk,并按照微信的那套规则进行操作
微信网页录音流程:
前端网页引入js-sdk -> 前端网页向后端接口发送当前url -> 后端生成签名信息返回给前端 -> 前端通过 wx.config注入签名信息 -> 网页调用 wx.startRecord wx.stopRecord 等得到录音的 localId -> 网页调用 wx.uploadVoice 传入 localId得到serverId -> 后端通过serverId请求微信的高清素材下载接口或者普通素材下载接口得到录音的二进制内容 -> 如果是通过普通素材下载接口则可得到标准格式的amr文件、如果是通过高清素材下载接口则可得到非标准格式的speex文件,之后再对speex文件进行特殊转码得到无损wav文件
为什么说高清语音素材下载接口返回的speex文件是非标准格式呢?因为我尝试了很多通用播放器以及专门播放speex音频的软件都无法正常播放此文件,并且解析文件内容发现也是如此。但是微信官方文档对于此的描述仅是一笔带过,最后在企业微信相关文档的解释中才找到方案(https://developer.work.weixin.qq.com/document/path/90391),因为方案涉及到编译微信给的c语言工程,因此这里详细给出如何对speex文件进行转码,下方为企业微信原文:
转码请使用 Speex 的官方解码库(下载地址: https://speex.org/downloads/ ),并结合微信的解码库(含示例代码,下载地址:https://wximg.gtimg.com/shake_tv/mpwiki/declib.zip )
微信给的speex文件,内容更类似于无头无尾的裸speex数据流,所以我们给其解压后加上头尾即可,一些注意事项是:按照微信官方指定的方式读取(每次读6字节、内部FIFO凑满60字节、按 Speex wideband 16k 解一帧),微信这里的格式默认是:SPEEX_MODEID_WB、16000 Hz、单声道、每 60 字节作为一个解码块。
下面以Centos7.9为例,先安装speex开发库,之后编译微信提供的c代码,然后利用编译产物对微信的speex文件做转换:
[root@localhost speex]# yum install -y gcc gcc-c++ make unzip speex speex-devel
已安装:
speex.x86_64 0:1.2-0.19.rc1.el7 speex-devel.x86_64 0:1.2-0.19.rc1.el7
[root@localhost speex]# ls
1775449863_gaoqing.speex declib.zip
[root@localhost speex]# unzip declib.zip
Archive: declib.zip
creating: declib/
inflating: declib/fifo.c
inflating: declib/fifo.h
creating: declib/speex/
inflating: declib/SpeexDecode.c
inflating: declib/speex/speex.h
inflating: declib/speex/speex_bits.h
inflating: declib/speex/speex_buffer.h
inflating: declib/speex/speex_callbacks.h
inflating: declib/speex/speex_config_types.h
inflating: declib/speex/speex_echo.h
inflating: declib/speex/speex_header.h
inflating: declib/speex/speex_jitter.h
inflating: declib/speex/speex_preprocess.h
inflating: declib/speex/speex_resampler.h
inflating: declib/speex/speex_stereo.h
inflating: declib/speex/speex_types.h
inflating: declib/TRSpeex.c
inflating: declib/TRSpeex.h
[root@localhost speex]# ls
1775449863_gaoqing.speex declib declib.zip
[root@localhost speex]# cd declib
[root@localhost declib]# ls
fifo.c fifo.h speex SpeexDecode.c TRSpeex.c TRSpeex.h
[root@localhost declib]# gcc -o speex_decode SpeexDecode.c TRSpeex.c fifo.c -I. -lspeex
[root@localhost declib]# ls
fifo.c fifo.h speex speex_decode SpeexDecode.c TRSpeex.c TRSpeex.h
[root@localhost declib]# ./speex_decode ../1775449863_gaoqing.speex 1775449863_gaoqing.wav
[root@localhost declib]# ls
fifo.c fifo.h 1775449863_gaoqing.wav speex speex_decode SpeexDecode.c TRSpeex.c TRSpeex.h
下面是通过普通素材下载接口得到的amr文件和对应的m4a和mp3文件:
input_1775449863_common.amr
output_1775449863_common.m4a
output_1775449863_common.mp3
下面是通过高清素材下载接口得到的speex文件和对应的wav文件:
input_1775449863_gaoqing.speex
output_1775449863_gaoqing.wav
以上文件均为同一个媒体id下载通过不同下载接口得到,可见高清素材下载接口得到的speex文件确实清晰
原创文章,作者:witersen,如若转载,请注明出处:https://www.witersen.com
微信扫一扫