单纯限制了我对小程序坑爹的想象
最近写录音功能时候又验证了一次;
其中的辛酸泪;
不搞过是不会懂的;
为了让后面的童鞋少走点弯路;
于是就有了这篇文章;
先来说下我们的目标;
我们要让用户录音;
然后把录音上传到服务器;
管理员可以在后台听录音;
以及进一步对录音处理;
小程序是开放了录音api的;
这个翻开发文档是可以找到的;
同时还有一个上传文件的接口;
这两个以配合不就轻松实现了?
刚开始的时候我也是这么年轻;
当我开始搞起的时候才发现是多森破;
首先我们需要调用wx.stopRecord
api开始录音;
然后调用wx.stopRecord
api结束录音;
在success
回调方法中可以得到tempFilePath
;
这是一个录音生成的临时文件路径;
用console.log打印的话是下面这个样子;
调用wx.uploadFile
api;filePath
就是上面的这个tempFilePath
;
这样就可以把录音上传到自己服务器了;
霎时心情愉悦踱起了魔鬼的步伐开始摩擦摩擦;
然而如果就这么轻松的搞定的话;
那就没法说坑了;
因为这个音频文件根本不是什么mp3等常见通用格式;
再认真一看会发现这个文件是silk
格式;
百之谷之必应之;
原来是skype的音频转码格式;
那就找个转码的方案吧;
于是在全球最大的同性交友网站github上找到了silk-v3-decoder;
然后就发现silk-v3-decoder依赖ffmpeg
;
又于就又去安装ffmpeg
;
又然后发现想用ffmpeg
转mp3
需要先安装lame
;
下载lame
wget http://downloads.sourceforge.net/lame/lame-3.100.tar.gz
解压
tar -zxvf lame-3.100.tar.gz
cd lame-3.100
编译安装
./configure --prefix=/usr/local
make
make install
如果是64位的系统;
需要增加一个软连接;
ln -s /usr/local/lib/libmp3lame.so.0.0.0 /usr/lib64/libmp3lame.so.0
下载 ffmpeg
wget http://ffmpeg.org/releases/ffmpeg-3.4.1.tar.bz2
解压
tar -jxvf ffmpeg-3.4.1.tar.bz2
编译安装
cd ffmpeg-3.4.1
./configure --prefix=/usr/local --pkg-config-flags=--static --enable-libmp3lame --disable-x86asm
make
make install
剩下的就简单了;
下载 silk-v3-decoder
cd /opt
wget https://github.com/kn007/silk-v3-decoder/archive/master.zip
解压
unzip master.zip
mv silk-v3-decoder-master silk-v3-decoder
给予执行权限
chmod -R +x /opt/silk-v3-decoder/
然后就可以调用命令了;
/opt/silk-v3-decoder/converter.sh file mp3'
心想折腾这么大半天了;
终于可以转码了吧;
没想到又森破了;
上来就是一个失败;
又于是用编辑器打开上传的silk
文件;
发现是下面这个样子的;
原来是用base64转码了;
还好世界上最好的语言php解决这个问题so easy;
// $file 是 silk文件路径 删掉前面的加密说明
$base64 = str_replace('data:audio/webm;base64,', '', file_get_contents($file));
// 转码
$content = base64_decode($base64);
// 把转码后的内容存入文件
file_put_contents($file, $content);
转码后再打开应该是这个样子的;
再然后写个方法用php调用silk-v3-decoder;
/**
* 把 silk 转成MP3
*
* @param $file
*
* @return mixed
*/
function silkToMp3($file)
{
set_time_limit(0);
$path = $_SERVER['DOCUMENT_ROOT'] . '/Upload/record/' . $file;
$command = '/usr/bin/sh /opt/silk-v3-decoder/converter.sh ' . $file . ' mp3';
exec($command, $result);
return $result;
}
大舒一口气总算是搞完了;
可没想到还是森破了;
使用开发工具录音生成的是base64转码后的silk文件;
在真机中使用微信录音上传的silk是未被转码的;
于是最好做个判断;
判断文件中如果含有 data:audio/webm;base64
;
那就使用base64转码;
如果没有则不需要转了;
最后再说一些需要注意的地方;
小程序api的request请求最长时间为60秒;
还有就是调试的时候先在系统中通过命令行使用 silk-v3-decoder;
成功后再用php调用;
如果转码失败可以查看 silkToMp3 的返回值;
里面有错误的原因;
补充: 现在小程序可以直接录制 mp3 了;
录音管理
本文为白俊遥原创文章,转载无需和我联系,但请注明来自白俊遥博客https://baijunyao.com 欢迎捐赠赞赏加入组织创建QQ群及捐赠渠道
阿轩 :老司机 我俩的辛酸史是一样样的呀, 我比你多了一步 就是调用百度的语音识别 哈哈哈
2018-02-05 20:03:20 回复
Karin :哈哈哈,一模一样的经历
2018-09-05 15:34:44 回复
J :真要 少走弯路 小程序 可以直接生成mp3的文件················
2018-02-01 13:32:56 回复
云淡风晴 :1.6以后的版本可以了;我补充文章说明;
2018-02-05 00:32:49 回复
J :小程序的录音文件是base 处理过的 webm,甚至是多种格式混合的·············你能这样直接base接出来 生成 mp3?
2018-02-01 13:31:14 回复
J :你好! 为什么 用base64解码的时候我弄出来是乱码···············
2018-02-01 12:40:38 回复
yi丶抹浅笑 :https://baijunyao.com/statics/emote/tuzki/3.gif
2017-12-22 17:59:10 回复
卡卡 :
2017-12-21 15:01:00 回复
缺氧 :
2017-12-18 20:33:18 回复
﹎ゞ很√想迩 :
2017-12-21 18:03:59 回复
null :先赞一个
2017-12-18 10:37:57 回复
最新评论