微信⼩程序上传silk格式录⾳并转码为mp3单纯限制了我对⼩程序坑爹的想象
最近写录⾳功能时候⼜验证了⼀次;
couplets
其中的⾟酸泪;四级听力分值
不搞过是不会懂的;
为了让后⾯的童鞋少⾛点弯路;
于是就有了这篇⽂章;
先来说下我们的⽬标;
我们要让⽤户录⾳;
然后把录⾳上传到服务器;
gateshead管理员可以在后台听录⾳;
handspring
以及进⼀步对录⾳处理;
⼩程序是开放了录⾳api的;
这个翻开发⽂档是可以找到的;
同时还有⼀个上传⽂件的接⼝;
这两个以配合不就轻松实现了?
red tube刚开始的时候我也是这么年轻;
当我开始搞起的时候才发现是多森破;
⾸先我们需要调⽤wx.stopRecord api开始录⾳;
然后调⽤wx.stopRecord api结束录⾳;
在success回调⽅法中可以得到tempFilePath;
这是⼀个录⾳⽣成的临时⽂件路径;
⽤console.log打印的话是下⾯这个样⼦;
调⽤wx.uploadFile api;
filePath就是上⾯的这个tempFilePath;
这样就可以把录⾳上传到⾃⼰服务器了;
霎时⼼情愉悦踱起了魔⿁的步伐开始摩擦摩擦;
然⽽如果就这么轻松的搞定的话;
那就没法说坑了;
因为这个⾳频⽂件根本不是什么mp3等常见通⽤格式;
再认真⼀看会发现这个⽂件是silk格式;
百之⾕之必应之;
原来是skype的⾳频转码格式;
那就找个转码的⽅案吧;
于是在全球最⼤的同性交友⽹站github上找到了;
然后就发现silk-v3-decoder依赖ffmpeg;
⼜于就⼜去安装ffmpeg;
⼜然后发现想⽤ffmpeg转mp3需要先安装lame;
下载lame
wget downloads.sourceforge/lame/lame-3.
Bash
解压
tar -zxvf lame-3.
cd lame-3.100细节英文
Bash
编译安装
./configure --prefix=/usr/local
make
make install眼巴巴
Bash
初一上册英语单词表如果是64位的系统;
需要增加⼀个软连接;
ln -s /usr/local/lib/libmp3lame.so.0.0.0 /usr/lib64/libmp3lame.so.0
Bash
下载 ffmpeg
wget ffmpeg/releas/ffmpeg-3.4.1.tar.bz2
Bash
解压
tar -jxvf ffmpeg-3.4.1.tar.bz2
Bash
编译安装
cd ffmpeg-3.4.1
./configure --prefix=/usr/local --pkg-config-flags=--static --enable-libmp3lame --disable-x86asm make
make install
Bash
剩下的就简单了;
下载 silk-v3-decoder
cd /opt
/kn007/silk-v3-decoder/archive/master.zip
Bash
解压
unzip master.zip
mv silk-v3-decoder-master silk-v3-decoder
Bash
给予执⾏权限
chmod -R +x /opt/silk-v3-decoder/
Bash
然后就可以调⽤命令了;
/opt/silk-v3-decoder/converter.sh file mp3'
Bash
⼼想折腾这么⼤半天了;
终于可以转码了吧;
没想到⼜森破了;
上来就是⼀个失败;
⼜于是⽤编辑器打开上传的silk⽂件;
发现是下⾯这个样⼦的;
原来是⽤ba64转码了;
还好世界上最好的语⾔php解决这个问题so easy;
// $file 是 silk⽂件路径删掉前⾯的加密说明
木瓜是什么意思
$ba64 = str_replace('data:audio/webm;ba64,', '', file_get_contents($file)); // 转码
$content = ba64_decode($ba64);
// 把转码后的内容存⼊⽂件
file_put_contents($file, $content);
PHP
转码后再打开应该是这个样⼦的;
再然后写个⽅法⽤php调⽤silk-v3-decoder;
/**
* 把 silk 转成MP3
*水浒传英语
* @param $file
*
* @return mixed
*/
function silkToMp3($file)
{
t_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;
}
PHP
⼤舒⼀⼝⽓总算是搞完了;
可没想到还是森破了;
使⽤开发⼯具录⾳⽣成的是ba64转码后的silk⽂件;
在真机中使⽤微信录⾳上传的silk是未被转码的;
于是最好做个判断;
判断⽂件中如果含有 data:audio/webm;ba64;
那就使⽤ba64转码;
如果没有则不需要转了;
最后再说⼀些需要注意的地⽅;
⼩程序api的request请求最长时间为60秒;
还有就是调试的时候先在系统中通过命令⾏使⽤ silk-v3-decoder;
成功后再⽤php调⽤;
如果转码失败可以查看 silkToMp3 的返回值;
⾥⾯有错误的原因;
我是⼀条分割线 - - -
补充: 现在⼩程序可以直接录制 mp3 了;