微信小程序上传silk格式录音并转码为mp3


单纯限制了我对小程序坑爹的想象
最近写录音功能时候又验证了一次;
其中的辛酸泪;
不搞过是不会懂的;
为了让后面的童鞋少走点弯路;
于是就有了这篇文章;

先来说下我们的目标;
我们要让用户录音;
然后把录音上传到服务器;
管理员可以在后台听录音;
以及进一步对录音处理;

小程序是开放了录音api的;
这个翻开发文档是可以找到的;
同时还有一个上传文件的接口;
这两个以配合不就轻松实现了?
刚开始的时候我也是这么年轻;
当我开始搞起的时候才发现是多森破;

首先我们需要调用wx.stopRecordapi开始录音;
然后调用wx.stopRecordapi结束录音;
success回调方法中可以得到tempFilePath;
这是一个录音生成的临时文件路径;
用console.log打印的话是下面这个样子;

调用wx.uploadFileapi;
filePath就是上面的这个tempFilePath
这样就可以把录音上传到自己服务器了;
霎时心情愉悦踱起了魔鬼的步伐开始摩擦摩擦;
然而如果就这么轻松的搞定的话;
那就没法说坑了;
因为这个音频文件根本不是什么mp3等常见通用格式;
再认真一看会发现这个文件是silk格式;
百之谷之必应之;
原来是skype的音频转码格式;
那就找个转码的方案吧;
于是在全球最大的同性交友网站github上找到了silk-v3-decoder;
然后就发现silk-v3-decoder依赖ffmpeg
又于就又去安装ffmpeg
又然后发现想用ffmpegmp3需要先安装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 了;
录音管理

白俊遥博客
请先登录后发表评论
  • latest comments
  • 总共11条评论
白俊遥博客

阿轩 :老司机 我俩的辛酸史是一样样的呀, 我比你多了一步 就是调用百度的语音识别 哈哈哈

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 回复