amr是一种主要用于移动设备上的音频文件格式,由于占用资源小,便于发录音彩信,所以手机上的录音大多是amr格式。amr是曾是Nokia手机中的铃声音频文件格式,Nokia手机中录音的文件也是运用的amr格式。amr文件的容量很小,每秒钟的amr文件大小可控制在1K左右,因此可符合彩信大小不超过50k的技术规范。
微信h5开发调用微信录音功能开发,默认的音频文件是amr文件格式的,但是直接是amr的格式的文件在浏览器是无法播放的,需要进行mp3模式的转换才能正常在浏览器下播放,下面我们就来看看转换的方法吧。
一、服务器安装ffmpeg
1、准备编译环境
yum install -y automake autoconf libtool gcc gcc-c++ #CentOS
2、编译所需源码包
#yasm:汇编器,新版本的ffmpeg增加了汇编代码 wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz tar -xzvf yasm-1.3.0.tar.gz cd yasm-1.3.0 ./configure make make install #lame:Mp3音频解码 wget http://jaist.dl.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz tar -xzvf lame-3.99.5.tar.gz cd lame-3.99.5 ./configure make make install #amr支持 wget http://downloads.sourceforge.net/project/opencore-amr/opencore-amr/opencore-amr-0.1.3.tar.gz tar -xzvf opencore-amr-0.1.3.tar.gz cd opencore-amr-0.1.3 ./configure make make install #amrnb支持 wget http://www.penguin.cz/~utx/ftp/amr/amrnb-11.0.0.0.tar.bz2 tar -xjvf amrnb-11.0.0.0.tar.bz2 cd amrnb-11.0.0.0 ./configure make make install #amrwb支持 wget http://www.penguin.cz/~utx/ftp/amr/amrwb-11.0.0.0.tar.bz2 tar -xjvf amrwb-11.0.0.0.tar.bz2 cd amrwb-11.0.0.0 ./configure make make install #ffmpeg wget http://ffmpeg.org/releases/ffmpeg-2.5.3.tar.bz2 tar -xjvf ffmpeg-2.5.3.tar.bz2 cd ffmpeg-2.5.3 ./configure --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-version3 --enable-shared make make install #加载配置 #最后写入config后,终端运行ffmpeg命令,出现success和已安装的扩展,则运行成功。 ldconfig
3、shell使用方法
ffmpeg -i test.mp3 -ac 1 -ar 8000 test.amr #MP3转换AMR ffmpeg -i test.amr test.mp3 #AMR转换MP3
4、错误解决办法
执行转换代码时如果出现错误
①错误:“ffmpeg: error while loading shared libraries: libmp3lame.so.0: cannot open shared object file: No such file or directory”
原因:ffmpeg默认安装目录为“/usr/local/lib”,有些64位系统下软件目录则为“/usr/lib64
解决:建立软链接ln -s /usr/local/lib/libmp3lame.so.0.0.0 /usr/lib64/libmp3lame.so.0
②错误:ffmpeg: error while loading shared libraries: libavdevice.so.54: cannot open shared object file: No such file or directory
原因:动态链接库未找到
解决:
1、可以通过如下方式查看ffmpeg的动态链接库哪些没有找到
ldd `which ffmpeg` libavdevice.so.54 => not found libavfilter.so.3 => not found libavformat.so.54 => not found libavcodec.so.54 => not found libswresample.so.0 => not found libswscale.so.2 => not found libavutil.so.51 => not found libm.so.6 => /lib64/libm.so.6 (0x00002ab7c0eb6000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00002ab7c100b000) libc.so.6 => /lib64/libc.so.6 (0x00002ab7c1125000) /lib64/ld-linux-x86-64.so.2 (0x00002ab7c0d9a000)
2、查找对应库所在位置
find /usr/local/lib/ | grep -E "libavdevice.so.54|libavfilter.so.3|libavcodec.so.54" /usr/local/lib/libavfilter.so.3.17.100 /usr/local/lib/libavcodec.so.54.59.100 /usr/local/lib/libavdevice.so.54 /usr/local/lib/libavcodec.so.54 /usr/local/lib/libavfilter.so.3 /usr/local/lib/libavdevice.so.54.2.101
3、查看链接库配置文件
more /etc/ld.so.conf | grep /usr/local/lib
4、如果不包含的话,需要编辑此文添加
vi /etc/ld.so.conf /usr/local/lib /usr/local/lib64 #运行配置命令 ldconfig
二、部署PHP脚本
1、创建目录
mkdir /home/www/amr mkdir /home/www/mp3
2、转换PHP脚本
<?phpnamespace app\script\controller;use think\Controller; class Mp3 extends Controller{ /** * amr转MP3 */ public function amrToMp3() { set_time_limit(0); //每秒执行一次 for ($i = 1; $i <= 60; $i++) { $path = '/home/www/script/amr'; if (is_dir($path)) { $dir = scandir($path); foreach ($dir as $value) { if ($value == '.' || $value == '..') { continue; } else { $amr = '/home/www/amr/' . $value; $mp3 = '/home/www/mp3/' . substr($value, 0, -4) . '.mp3'; $command = "/usr/local/bin/ffmpeg -i $amr $mp3"; shell_exec($command); } } } //转换需要时间,避免未转换完就删除文件 sleep(1); //删除amr后缀的所有文件 $command = "rm -rf /home/www/amr/*.amr"; shell_exec($command); } } }
3、设置定时任务实时调用转换脚本
* * * * * /usr/bin/php /home/www/mp3.php
4、下载微信录音文件并保存到服务器的脚本
<?php class uploadMp3 { public function upload() { //下载 $url = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=" . $_GET['token'] . "&media_id=" . $_GET['id']; $data = $this->downLoadFile($url); //文件名称 $file_name = $_GET['name']; //扩展名 $ext = '.amr'; //保存路径 $file_dir = './amr/'; $this->saveWeixinFile($file_dir . $file_name . $ext, $data); } /** * 下载 * @param $url * @return mixed */ public function downLoadFile($url) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_NOBODY, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $package = curl_exec($ch); curl_close($ch); return $package; } /** * 保存MP3到本地 * @param $name * @param $content */ public function saveWeixinFile($name, $content) { $local_file = fopen($name, 'w'); if (false !== $local_file) { if (false !== fwrite($local_file, $content)) { fclose($local_file); } } } } $uploadMp3 = new uploadMp3(); $uploadMp3->upload();
三、流程