linux下安装ffmpeg将微信下载得amr格式音频转成mp3格式上传到阿里云oss

下载微信语音到服务器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];
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值