注:以下操作均在centos6.5下进行
在微信开发的过程中,有时候我们会接触到微信语音,这里需要解决两个问题:1. 如何从微信服务器上下载语音文件到我们的服务器上?2. 如何将语音文件的amr格式转化成H5页面可用的mp3格式?
1. 查看微信JSSDK文档可以找到相关的多媒体下载API,这里我们需要用到的是上传多媒体API返回的多媒体id。
//下载多媒体文件
function saveMedia($media_id){
$access_token = $this->wx_access_token();//获取token的方法
$url = 'http://file.api.weixin.qq.com/cgi-bin/media/get?access_token='.$access_token.'&media_id='.$media_id;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_NOBODY, 0); //对body进行输出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$package = curl_exec($ch);
$httpinfo = curl_getinfo($ch);
curl_close($ch);
$media = array_merge(array('mediaBody' => $package), $httpinfo);
//求出文件格式
preg_match('/\w\/(\w+)/i', $media["content_type"], $extmatches);
$fileExt = $extmatches[1];
$filename = time().rand(100,999).".{$fileExt}";
//$dirname = "./Uploads/";
if ($fileExt == 'amr') {//语音文件
$dirname = "./Uploads/video/";
}else{
$dirname = "./Uploads/img/";
}
if(!file_exists($dirname)){
mkdir($dirname,0777,true);
}
file_put_contents($dirname.$filename,$media['mediaBody']);
if ($fileExt == 'amr') {//语音文件
$this->amrToMp3($filename);//amr转mp3的方法,文章后边会详细说明
$filename = substr($filename, 0, strlen($filename)-4).'.mp3';
}
return $dirname.$filename;
}
2. 要下载语音文件到服务器并不难,但是我们下载到的文件是amr格式的,并不能在H5页面中使用,因此要把amr转成可用的mp3格式,这里我们用到了ffmpeg这个工具。
centos6.5下安装ffmpeg的步骤:
一、安装yasm
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
二、安装mp3编码器lame
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转mp3所需的库
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
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
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
五、加载配置
ldconfig
六、可能出现的问题
在使用的时候可能会出现错误:error while loading shared libraries: libavdevice.so.56: cannot open shared object file: No such file or directory
解决方法:
find / -name libavdevice.so.56
找到这个文件的路径后,将其目录添加到ld.so.conf的最后一行
vim /etc/ld.so.conf
再重新加载配置
ldconfig
/usr/local/bin/ffmpeg -i /var/www/html/iread/Uploads/video/1470018722287.amr /var/www/html/iread/Uploads/video/1470018722287.mp3
以上/var/www/html/iread/Upload/video/是我服务器上语音文件所在的目录
这里我直接使用了服务器上的amr文件,执行指令后,发现文件夹中确实生成了对应的mp3文件,说明转码功能可以正常使用。
到此为止,只剩下最后一步了,那就是如何使用php代码实现下载完语音文件后自动执行转码的指令。
//利用Linux服务器执行ffmpeg指令对amr语音文件转mp3格式
function amrToMp3($filename){
$newFilename = substr($filename, 0, strlen($filename)-4).'.mp3';//需要生成的mp3文件名
$command = '/usr/local/bin/ffmpeg -i /var/www/html/iread/Uploads/video/'.$filename.' /var/www/html/iread/Uploads/video/'.$newFilename;
exec($command);
}