文档章节

PHP版微信权限验证配置,音频文件下载,FFmpeg转码,上传OSS和删除转存服务器本地文件

Jack088
 Jack088
发布于 2018/04/14 00:20
字数 971
阅读 79
收藏 6

一、概述和通过config接口注入权限验证配置

由于微信的临时素材(如:录音文件)上传到微信服务器上,微信后台保存时间为3天。而我们需要长期保存,我们需要把资源从微信服务器转存到自己服务器,或者阿里云OSS/七牛云。

微信:新增临时素材

通过config接口注入权限验证配置:
步骤三:通过config接口注入权限验证配置

/**
 * 微信JS-SDK权限验证配置
 * 
 * @return array
 */
public function getSignPackage() {
    (new SignPackage())->goCheck();
    $url = input('get.url');
    $jsapiTicket = $this->getJsApiTicket();
    $nonceStr = getRandChar(16);
    $timestamp = time();

    $signature = $this->getSignature($jsapiTicket,$nonceStr,$timestamp,$url);

    $signPackage = array(
        "appId"     => config('wx.g_app_id'),
        "nonceStr"  => $nonceStr,
        "timestamp" => $timestamp,
        "signature" => $signature,
        'expire_id' => config('setting.access_token_expire_in'),
        'url'       => $url
    );
    return $signPackage;
}

/**
 * 获取签名
 * 
 * @param $jsapiTicket
 * @param $nonceStr
 * @param $timestamp
 * @param $url
 * @return string
 */
private  function getSignature($jsapiTicket,$nonceStr,$timestamp,$url)
{
    // 这里参数的顺序要按照 key 值 ASCII 码升序排序
    $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";

    $signature = sha1($string);

    return $signature;
}

/**
 * 获取临时票据
 * {
 * "errcode": 0,
 * "errmsg": "ok",
 * "ticket": "kgt8ON7yVITDhtdwci0qeS9ULEKIkoU74AB_VMOQrWUhbW12MQht4FiX4qLA9Z5puKabs96SARo5f1bylEvwXw",
 * "expires_in": 7200
 * }
 * @return mixed
 * @throws Exception
 * @throws ParameterException
 */
private function getJsApiTicket() {

    $access_token = $this->getAccessToken();
    $wxJSapiTicketUrl = sprintf(config('wx.jsapi_ticket'), $access_token);

    $result = curl_get($wxJSapiTicketUrl);
    $wxResult = json_decode($result, true);

    if (empty($wxResult)) {

        throw new Exception('微信内部错误');

    }else if ($wxResult['errmsg'] != 'ok'){
        throw new ParameterException([
            'errorCode' => $wxResult['errcode'],
            'msg' => $wxResult['errmsg']
        ]);
    };

    return $wxResult['ticket'];
}

二、获取media_id

微信JS-SDK说明文档

三、根据media_id下载录音文件

获取临时素材

/**
 * 获取访问微信接口的access_token
 * 
 * @return mixed
 */
public function getAccessToken()
{
    $redis = Cache::store('redis');
    $wx_access_token = $redis->get('wx_access_token');
    if (!$wx_access_token){
        $access_token = $this->getWXAccessToken();
    }else{
        $access_token = $wx_access_token;
    }

    return $access_token;
}
    /**
     * 根据URL地址,下载文件
     *
     * @param $url
     * @param $savePath
     */
    public 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);
    }

四、FFmpeg将amr格式音频文件转换未mp3格式

PHP 将amr音频文件转换为mp3格式

/**
 * 将amr格式转换成mp3格式
 *
 * @param $amr
 * @param $prefix_filename
 * @return mixed
 */
public function amrTransCodingMp3($amr, $prefix_filename)
{
    $msgId = $prefix_filename;
    $mp3 = $msgId.'.mp3';
    $dir = $_SERVER['DOCUMENT_ROOT'].'/static/audio/';

    exec("ffmpeg -y -i ".$dir.$amr." ".$dir.$mp3);
    return $mp3;
}

五、将转码后MP3文件上传至OSS

阿里云OSS视频上传概述
PHP-SDK上传文件

/**
 * 上传指定的本地文件内容
 *
 * @param OssClient $ossClient OSSClient实例
 * @param string $bucket 存储空间名称
 * @param string $object 名字
 * @return mixed
 */
function uploadFile($ossClient, $bucket, $object)
{
    $filePath = $_SERVER['DOCUMENT_ROOT'].'/static/audio/'.$object;

    try{
        $res = $ossClient->uploadFile($bucket, $object, $filePath);
        return $res;
    } catch(OssException $e) {
        return [
            'error' => 'FAILED',
            'msg'   => $e->getMessage()
        ];
    }
}

注:
坑一:貌似服务端只有JAVA的,其实通过PHP-SDK也是可以通过上传文件来上传音频文件。


坑二

六、删除本地文件

由于我把微信音频文件存到阿里云OSS,所以将从微信服务器下载的amr和转码的mp3两个音频文件删除。

/**
 * 删除本地音频文件
 *
 * @param $filename
 * @return bool
 * @throws ParameterException
 */
public function deleteDownloadFile($filename)
{
    $filename = $_SERVER['DOCUMENT_ROOT'].'/static/audio/'.$filename;
    if (!unlink($filename))
    {
        throw new ParameterException([
            'msg' => "Error deleting $filename"
        ]);
    }
    else
    {
        return true;
    }
}

七、测试样例

微信录音时长最多为60s,经测试H5端录音60s语音后,后台下载,转码后如下图:

然后将mp3文件上传OSS后返回给客户端如下:

{
    "server": "AliyunOSS",
    "date": "Mon, 09 Oct 2017 05:52:28 GMT",
    "content-length": "0",
    "connection": "keep-alive",
    "x-oss-request-id": "59DB0E9BE8DFE89CE466195A",
    "etag": "\"A6D50FD012FE2C6AA03EBF38CE23BEEB\"",
    "x-oss-hash-crc64ecma": "8903374940512099110",
    "content-md5": "ptUP0BL+LGqgPr84ziO+6w==",
    "x-oss-server-time": "243",
    "info": {
        "url": "http://xds-test.oss-cn-beijing.aliyuncs.com/wx_download_2017100913522559db0e99d3420.mp3",
        "content_type": null,
        "http_code": 200,
        "header_size": 335,
        "request_size": 472,
        "filetime": -1,
        "ssl_verify_result": 0,
        "redirect_count": 0,
        "total_time": 0.250512,
        "namelookup_time": 0.001418,
        "connect_time": 0.004533,
        "pretransfer_time": 0.004535,
        "size_upload": 60309,
        "size_download": 0,
        "speed_download": 0,
        "speed_upload": 240742,
        "download_content_length": 0,
        "upload_content_length": 60309,
        "starttransfer_time": 0.007707,
        "redirect_time": 0,
        "redirect_url": "",
        "primary_ip": "59.110.185.134",
        "certinfo": [],
        "method": "PUT"
    },
    "oss-request-url": "http://xds-test.oss-cn-beijing.aliyuncs.com/wx_download_2017100913522559db0e99d3420.mp3",
    "oss-redirects": 0,
    "oss-stringtosign": "PUT\n\naudio/mpeg\nMon, 09 Oct 2017 05:52:27 GMT\n/xds-test/wx_download_2017100913522559db0e99d3420.mp3",
    "oss-requestheaders": {
        "Accept-Encoding": "",
        "Content-Type": "audio/mpeg",
        "Date": "Mon, 09 Oct 2017 05:52:27 GMT",
        "Host": "xds-test.oss-cn-beijing.aliyuncs.com",
        "Authorization": "OSS LTAIiKza8Qoz9q4A:PB8WBZp75iaN/pvpbIewFs3Rn08="
    },
    "body": false,
    "process_time": "2.2304130s"
}

从返回process_time来看,从客户端请求到最后返回给客户端,60s音频后台大概需要处理2.3秒左右(根据服务器配置而不同)。

参考资料如下:

微信jssdk录音功能开发记录
PHP 将amr音频文件转换为mp3格式

本文转载自:https://segmentfault.com/a/1190000011477229

Jack088
粉丝 46
博文 567
码字总数 90182
作品 0
扬州
程序员
私信 提问
加载中

评论(1)

开源中国首席C菜鸟
开源中国首席C菜鸟
欢迎使用 CSpeed基于C语言的PHP扩展扩展 gitee.com/liqiongfan/cspeed
DotNet 使用阿里云媒体转码服务

公司项目中一部分文件放到了阿里云 OSS 上,其中有些音频文件是 amr 类型的,在后期使用的时候比较麻烦,所以需要转换成 mp3 的文件,方便以后使用。本来想使用 ffmpeg 处理,但由于文件都存...

Charles Zhang
08/06
0
0
给初学者的 20 多个 FFmpeg 命令示例

在这个指南中,我将用示例来阐明如何使用 FFmpeg 媒体框架来做各种各样的音频、视频转码和转换的操作。我已经为初学者汇集了最常用的 20 多个 FFmpeg 命令,我将不时地添加更多的示例来保持更...

作者: Sk
06/03
0
0
给新手的 20 多个 FFmpeg 命令示例

在这个指南中,我将用示例来阐明如何使用 FFmpeg 媒体框架来做各种各样的音频、视频转码和转换的操作。我已经为初学者汇集了最常用的 20 多个 FFmpeg 命令,我将不时地添加更多的示例来保持更...

作者: Sk
06/04
0
0
微信公众号录音文件保存到自己开发的服务器(amr文件转mp3)

音频转码工具,主要用于将微信语音 amr 格式转换为 mp3 格式以便在 html5 的 audio 标签中进行播放 1.调用微信提供的接口获取录音的InputStream字节流 public InputStream getInputStream(St...

llsydn
02/23
98
0
完美解决:Java微信语音amr格式转mp3格式,兼容Linux/Mac/Windows,支持Maven

原文出处:dadiyang 少费话,先上代码 引入 maven 依赖 调用 AudioUtils.amrToMp3 方法 三行代码搞定格式转换 public void amrToMp3() { } 探索过程 最近接到基于微信公众号开发的需求,在处...

dadiyang
2018/12/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

centos 查看删除旧内核

1、查看系统中安装的内核 $ yum list installed | grep kernel 2、删除系统中旧内核 $ yum install yum-utils$ package-cleanup --oldkernels --count=2...

编程老陆
11分钟前
6
0
ES6

ES6:不改变原理的基础上,让API变得更简单 一、let:代替var用于声明变量 1、var的缺点: (1)声明提前 (2)没有块级作用域 2、let的优点: (1)组织了申明提前 (2)让let所在的块({}),...

wytao1995
今天
3
0
kubernetes 环境搭建 —— minikube

创建集群 minikube start 搭建好 k8s 集群后,可以查看集群的状态以及部署应用。主要用到的是 k8s 的 api,这通常需借助于 kutectl 命令行工具 基本操作 kubectl versionkubectl cluster-i...

lemos
今天
9
0
关于js混淆与反混淆还原操作

使用js的混淆加密,其目的是为了保护我们的前端代码逻辑,对应一些搞技术吃饭的公司来说,为了防止被竞争对手抓取或使用自己的代码,就会考虑如何加密,或者混淆js来达到代码保护。 1、为什么...

开源oschina
今天
11
0
用盛金公式解三次方程(ansi c版)

/* cc cubic.c -lm gcc cubic.c -lm Shengjin's Formulas Univariate cubic equation aX ^ 3 + bX ^ 2 + cX + d = 0, (a, b, c, d < R, and a!= 0). Multiple root disc......

wangxuwei
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部