直到现在,仍然不存在一项旨在网页上播放音频的标准。HTML5 规定了一种通过 audio 元素来包含音频的标准方法。audio 元素能够播放声音文件或者音频流。当前,audio 元素支持三种音频格式:MP3 ,Wav ,Ogg Vorbis。
微信录音的音频为amr格式,不支持网页播放,且上传语音有效期3天,可用微信多媒体接口下载语音到自己的服务器,然后转码转成MP3格式,途径有两种:
一.在服务器上搭建ffmpeg
很多项目不一定放在自己服务器上,而且很多码农并不熟悉服务器方面的配置,所以没办法去搭建ffmpeg,但是对于网络接口的调用并不陌生,所以我着重讲一下使用七牛PHP框架将微信 amr音频转mp3。
二.使用七牛云存储框架转码存储
(1)下载七牛SDK,下载地址:https://developer.qiniu.com/sdk
(2)将下载的整个SDK包解压之后放入项目中
(3)引入入口文件,并写好相应要使用的模块命名空间
require_once 'qiniusdk/autoload.php';
use Qiniu\Auth;
use Qiniu\Storage\UploadManager;
use Qiniu\Storage\BucketManager;
(4)将微信录音amr文件下载到本地(自己的服务器)
function upload($serverid){
$media_id = $serverid;
$access_token = M('accesstoken')->getField('access_token');
$path = './'.C("UPLOADPATH").'audio/'.date('Ymd',time());
if(!is_dir($path)){
mkdir($path);
}
//微 信上传下载媒体文件
$url = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token={$access_token}&media_id={$media_id}";
$mediaid = "wxupload_".time().rand(1111,9999);
$filename = $mediaid . ".amr";
$this->downAndSaveFile($url,$path."/".$filename);
$res = 'audio/'.date('Ymd',time()).'/'.$filename;
$data = array();
$data['res'] = $res;
$data['filename'] = $filename;
$data['mediaid'] = $mediaid;
return $data;
}
(5)将本地amr音频文件上传至七牛云并转码生成MP3文件
private function upchange($filePath,$mediaid){
$accessKey = trim($reply['accessKey']); //七牛公钥
$secretKey = trim($reply['secretKey']); //七牛私钥
$auth = new Auth($accessKey, $secretKey);
$bucket = trim($reply['bucket']);
//数据处理队列名称,不设置代表不使用私有队列,使用公有队列。
$pipeline = trim($reply['pipeline']);
//通过添加'|saveas'参数,指定处理后的文件保存的bucket和key
//不指定默认保存在当前空间,bucket为目标空间,后一个参数为转码之后文件名
$savekey = Qiniu\base64_urlSafeEncode($bucket.':'.$mediaid.'.mp3');
//设置转码参数
$fops = "avthumb/mp3/ab/320k/ar/44100/acodec/libmp3lame";
$fops = $fops.'|saveas/'.$savekey;
if(!empty($pipeline)){ //使用私有队列
$policy = array(
'persistentOps' => $fops,
'persistentPipeline' => $pipeline
);
}else{ //使用公有队列
$policy = array(
'persistentOps' => $fops
);
}
//指定上传转码命令
$uptoken = $auth->uploadToken($bucket, null, 3600, $policy);
$key = $mediaid.'.amr'; //七牛云中保存的amr文件名
$uploadMgr = new UploadManager();
//上传文件并转码$filePath为本地文件路径
list($ret, $err) = $uploadMgr->putFile($uptoken, $key, $filePath);
if ($err !== null) {
return false;
}else {
//此时七牛云中同一段音频文件有amr和MP3两个格式的两个文件同时存在
$bucketMgr = new BucketManager($auth);
//为节省空间,删除amr格式文件
$bucketMgr->delete($bucket, $key);
return $ret['key'];
}
}
(5)将本地amr音频文件上传至七牛云并转码生成MP3文件
function downAndSaveFile($url, $savePath) {
ob_start();
readfile($url);
$img = ob_get_contents();
ob_end_clean();
$size = strlen($img);
$fp = fopen($savePath, 'a');
fwrite($fp, $img);
fclose($fp);
}
function downchange($mediaid) {
$bucket = 'shuiliju';
$accessKey = $this->ak;
$secretKey = $this->sk;
$auth = new Auth($accessKey, $secretKey);
//baseUrl构造成私有空间的域名/key的形式
$baseUrl = 'http://os4top2ks.bkt.clouddn.com/' . $mediaid;
$authUrl = $auth->privateDownloadUrl($baseUrl);
//下载到本地
$filename = $mediaid;
$path = './' . C("UPLOADPATH") . 'audio/' . date('Ymd', time());
$this->downAndSaveFile($authUrl, $path . "/" . $filename);
$res = 'audio/' . date('Ymd', time()) . '/' . $filename;
$data = array();
$data['res'] = $res;
$data['filename'] = $filename;
$data['mediaid'] = $mediaid;
$bucketMgr = new BucketManager($auth);
$bucketMgr->delete($bucket, $mediaid);
return $data;
}