下载微信语音到服务器aliyun-oss中
废话不多说,直接上代码↓
注意事项
1. OSS包直接用composer安装(很简单)
命令自行百度
2. 安装ffmpeg(有点麻烦 但是解决了)
linux在官网安装ffmpeg可能会报错各种错误 很麻烦
1.安装系统编译环境
yum install -y automake autoconf libtool gcc gcc-c++
2.编译所需源码包(安装步骤执行就好)
注意安装好包以后记得cd出去不然会套娃
#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
cd ..
#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
#最后
ldconfig
#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
3.安装FFmpeg
我安装的是2.5.3版本的,上一个安装失败的版本是4.1的,不知道跟版本是否有很大的关系,因为现在急于处理问题,等后面有时间再研究一下4.1版本的
#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
安装好以后执行ffmpeg可能会报错这是因为没有配置环境变量
vim /etc/profile
配置到bin目录 记得source
export PATH="$PATH:/usr/ffmpeg-2.5.3/bin"
sudo gedit /etc/ld.so.conf
加入一行ffmpeg下lib得地址
安装完以后ffmpeg -version 看看是否正确
windows安装很简单直接官网下载 配置环境变量 注意最后吧ffmpeg下bin目录得文件复制一份放在C盘windows目录下就可以正常使用了
4.前端调用接口
/**
* 接受音频id处理
* @param $id string
* @return false|string
*/
public function downloadWeixinFile(string $id)
{
// 获取阿里云oss参数
$this->accessKeyId = env('ALY_ACCESSKEYID'); // 阿里云accessKeyId
$this->accessKeySecret = env('ALY_ACCESSKEYSECRET'); // 阿里云accessKeySecret
$this->endpoint = env('ALY_ENDPOINT'); // 阿里云endpoint(域名)
$this->bucket = env('ALY_BUCKET'); // 阿里云bucket
$this->rootDir = env('ALY_ROOTDIR'); // 阿里云存放地址 需要endpoint+bucket+地址拼接
// 获取access_token
$url = '微信获取token得接口用secret+appid获取';
$token = $this->curl_get_https($url, $data);
if ($token[1] == 200) {
$access_token = json_decode($token[0], true)['accessToken'];
}
$path = $_SERVER['DOCUMENT_ROOT']."/uploads/voice/amr/"; // 保存路径
// 微信上传下载媒体音频
$media_url = "https://api.weixin.qq.com/cgi-bin/media/get?access_token=" . $access_token . "&media_id=" .$id;
// 文件名称
$filename = 'wxupload_'.date('Ymd').time().rand(11111,99999).".amr";
// 下载并保存
$this->downAndSaveFile($media_url, $path."/".$filename);
// 将amr格式转换成MP3格式
// 要转换的amr文件地址
$amrFile = $path.$filename;
// 转换成MP3后保存的名字
$mp3Filename = "wxupload_".date("Ymd").time().rand(11111,99999).".mp3";
// 转换以后保存的路径
$mp3File = $_SERVER['DOCUMENT_ROOT']."/uploads/voice/mp3/".$mp3Filename;
$this->amrTransCodingMp3($amrFile, $mp3File);
// 上传到oss
$res = $this->uploadFile($mp3Filename, $mp3File);
unlink($amrFile);
unlink($mp3File);
// 返回mp3地址
return json_encode(['code'=>200,'msg'=>$res['info']['url']], JSON_UNESCAPED_UNICODE);
}
/**
* 上传到oss
* @param $newFilePath string
* @param $saveName string
* @return void|null
*/
public function uploadFile(string $newFilePath, string $saveName){
// 储存空间名称
$bucket = $this->bucket;
// 文件名称
$object = $this->bucket.'/'.$this->rootDir.'/'.$newFilePath;
$filePath = $saveName;
try {
$ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
$res = $ossClient->uploadFile($bucket, $object, $filePath);
return $res;
} catch (OssException $e) {
printf(__FUNCTION__.": FAILED\n");
printf($e->getMessage()."\n");
return;
}
}
/**
* 音频arm转换为mp3格式
* @param $armFile string
* @param $mp3File string
* @return string
*/
public function amrTransCodingMp3(string $armFile, string $mp3File): string
{
$str = "ffmpeg -y -i ".$armFile." ".$mp3File;
exec($str);
return $mp3File;
}
/**
* 根据地址下载文件
* @param $url string
* @param $savePath string
* @return void
*/
public function downAndSaveFile(string $url, string $savePath){
ob_start();
readfile($url);
$img = ob_get_contents();
ob_end_clean();
$size = strlen($img);
$fp = fopen($savePath, 'a');
fwrite($fp, $img);
fclose($fp);
}
/**
* 接口请求
* @param $url string
* @return array
*/
function curl_get_https(string $url, $jsonStr = ''): array
{
$curl = curl_init(); // 启动一个CURL会话
curl_setopt($curl, CURLOPT_URL, $url);
if ($jsonStr) {
curl_setopt($curl, CURLOPT_POSTFIELDS, $jsonStr);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json; charset=utf-8',
'Content-Length: ' . strlen($jsonStr)
)
);
}
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在
$tmpInfo = curl_exec($curl); //返回api的json对象
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
//关闭URL请求
curl_close($curl);
return [$tmpInfo,$httpCode];
}