微信开发之录制语音本地化上传至七牛云并将amr转码为mp3

微信开发 2059浏览 评论

很长一段时间没有更新博客了,是因为最近比较忙,

接了2个项目实在抽不开身,这2天终于将项目交接了,

终于可以更新2篇文章,还是往常的套路,我们还是以

实战为主,分享实际案例,希望能够帮助到你们!

当然了你们可以更好的建议我分享一些什么内容给你们!

说正题,相信大家有用过微信公众号的语音录制功能,

我们要做的是,如何将录制的语音上传至微信平台,然后

再将语音本地持久化。

1、首先使用微信语音录制接口,获取signPackage在PHP里以前在微信地理定位有讲到,还是老方法将获取到的值返回,必要的!

<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script>
//语音
wx.config({
    debug: false,
    appId: '<?php echo $signPackage["appId"];?>',
    timestamp: '<?php echo $signPackage["timestamp"];?>',
    nonceStr: '<?php echo $signPackage["nonceStr"];?>',
    signature: '<?php echo $signPackage["signature"];?>',
    jsApiList: [
        'startRecord',
        'stopRecord',
        'onVoiceRecordEnd',
        'playVoice',
        'stopVoice',
        'uploadVoice',
    ]
});

2、开始录制语音

wx.startRecord();

3、获取localId

wx.onVoiceRecordEnd({
    // 录音时间超过一分钟没有停止的时候会执行 complete 回调
    complete: function (res) {
        var localId = res.localId; 
    }
});

4、上传语音

wx.uploadVoice({
    localId: '', // 需要上传的音频的本地ID,由stopRecord接口获得
    isShowProgressTips: 1, // 默认为1,显示进度提示
        success: function (res) {
        var serverId = res.serverId; // 返回音频的服务器端ID
    }
});

上述这几点大家看下文档其实都会做,很简单,重点是语音上传之后,我们如何将文件本地化。

5、文件本地化接口地址

//token和serverID不用多说,获取token的方法不必多介绍,serverid在上传之后会返回。

$url = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token={$token}&media_id={$post['serverId']}";

6、http get方法

function httpGet($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);
    $http_info = curl_getinfo($ch);
    curl_close($ch);
    $res = array_merge(array_merge(array('header' => $http_info)),array('body' => $package));
    return $res;
}

7、保存下载的文件的方法

function saveWeixinFile($file_name,$file_content){
    $local_file = fopen($file_name,'w');
    if(false !== $local_file){
        if(false !== fwrite($local_file,$file_content)){
            fclose($local_file);
        }else{
            return false;
        }
    }else{
        return false;
    }
}

8、调用下载和保存的方法

$res = httpGet($url);
//文件保存路径
$file_name  = ROOT_PATH . 'public/uploads/audio/'.$post['serverId'].'.mp3';
$save = saveWeixinFile($file_name,$res['body']);
if(false === $save){
    exit('音频文件本地化失败');
}

9、保存下来的音频文件为amr格式的,大家懂得audio是播放不了的,我们需要进行转码,而利用程序转码我们可以使用七牛云提供的转码存储,资源o s s化是必须的嘛。

七牛云这里就不做介绍了吧,直接帖代码,七牛云封装的上传转码类

<?php
namespace app\extra;
use Qiniu\Auth;
use Qiniu\Storage\BucketManager;
use Qiniu\Storage\UploadManager;

class Qiniu{
    private $accessKey = '';
    private $secretKey = '';
    private $bucket = '';
    
    public function uploads($media_id,$file_path){
        $auth = new Auth($this->accessKey,$this->secretKey);
        $bucket = trim($this->bucket);
        $savekey = \Qiniu\base64_urlSafeEncode($bucket.':'.$media_id.'.mp3');
        //设置转码参数
        $fops = "avthumb/mp3/ab/320k/ar/44100/acodec/libmp3lame";
        $fops = $fops.'|saveas/'.$savekey;
        $policy = array(
            'persistentOps' => $fops
        );
        $up_token = $auth->uploadToken($bucket, null, 3600, $policy);
        $key = $media_id.'.mp3'; //七牛云中保存的amr文件名
        $uploadMgr = new UploadManager();
        list($ret, $err) = $uploadMgr->putFile($up_token, $key, $file_path);
        if ($err !== null) {
            return false;
        }else {
            //此时七牛云中同一段音频文件有amr和MP3两个格式的两个文件同时存在
            $bucketMgr = new BucketManager($auth);
            //为节省空间,删除amr格式文件
            $bucketMgr->delete($bucket, $key);
            return $ret['key'];
        }
    }
}

10、调用

$up_audio = $qiniu->uploads($post['serverId'],$file_name);

11、处理商户业务逻辑


整理下业务逻辑

1、首先调用微信语音录制接口录制语音,

2、然后上传录制好的语音文件

3、a ja x将serverId传入后台使用http get方式下载语音文件,使文件本地化

4、本地化文件不能使用,我们使用七牛云存储将文件上传至云空间并转码返回能够播放的mp3文件地址。

问题:为何要将文件上传至七牛,犹豫http get下载的语音文件格式在h5中不能播放我们需要转码,第二是为了节约服务器资源。

本文连接:http://www.phpbloger.com/article/49.html 文章都为原创,转载请注明出处!

相关文章