微信录音文件上传到服务器以及amr转化成MP3格式,linux上转换简单方法

时间:2024-01-30 15:36:26

微信公众号音频接口开发

根据业务需求,我们可能需要将微信录音保存到服务器,而通过微信上传语音接口上传到微信服务器的语音文件的有效期只有3天,所以需要将文件下载到我们自己的服务器。

上传语音接口

wx.uploadVoice({

    localId: \'\', // 需要上传的音频的本地ID,由stopRecord接口获得

    isShowProgressTips: 1, // 默认为1,显示进度提示

        success: function (res) {

        var serverId = res.serverId; // 返回音频的服务器端ID

    }

});

这里,在我们将录音文件上传之后,需要把这个sercerId传给后台然后通过get请求微信资源服务器获取录音文件

 

http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESSTOKEN&media_id=MEDIAID

 

这里需要传2个参数:1、access_token 2、media_id也就是上面的serverId

下面是我处理文件的方法:

public static InputStream getInputStream(String accessToken, String media_id) {
        InputStream is = null;
        String url = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token="+accessToken+"&media_id="+media_id;
        try {
            URL urlGet = new URL(url);
            HttpURLConnection http = (HttpURLConnection) urlGet
                    .openConnection();
            http.setRequestMethod("GET"); // 必须是get方式请求
            http.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");
            http.setDoOutput(true);
            http.setDoInput(true);
            System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒
            System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒
            http.connect();
            // 获取文件转化为byte流
            is = http.getInputStream();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return is;

    }

    public static String saveFile(String accessToken, String mediaId) throws Exception {
        InputStream inputStream = getInputStream(accessToken, mediaId);
        byte[] data = new byte[10240];
        int len = 0;
        FileOutputStream fileOutputStream = null;
        UUID audioName = UUID.randomUUID();
        //filePath:服务器文件路径
        //fileName:文件名,一般直接用UUID随机生成就行
        String uploadFile = "filePath"+"fileName"+".amr";
        //String mpsUploadFile =  "filePath"+"fileName"+".mp3";
        try {
            fileOutputStream = new FileOutputStream(uploadFile);
            while ((len = inputStream.read(data)) != -1) {
                fileOutputStream.write(data, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fileOutputStream != null) {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        //change(uploadFile,mpsUploadFile);
        //return mpsUploadFile;
        return uploadFile;
    }      

 

上面代码就是将音频文件从微信服务器下载到自己服务器上的代码

一、window环境

由于amr的文件压缩格式比MP3的压缩空间更大,所以智能手机一般的音频格式都是amr的,而amr格式的音频文件在audio标签是不支持播放的,所以,我们想用audio标签播放音频就需要通过插件或者后台将amr格式文件转化成MP3,这里我就是通过文件格式转换来做的,下面是分享代码

这里需要下载并添加 jave-1.0.2.jar的jar包

//文件格式转化 amr-->mp3
    public static void change(String amrUrl,String mp3Url)
    {
        File source = new File(amrUrl);
        File target = new File(mp3Url);
        AudioAttributes audio = new AudioAttributes();
        Encoder encoder = new Encoder();


        audio.setCodec("libmp3lame");
        EncodingAttributes attrs = new EncodingAttributes();
        attrs.setFormat("mp3");
        attrs.setAudioAttributes(audio);

        try {
            encoder.encode(source, target, attrs);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InputFormatException e) {
            e.printStackTrace();
        } catch (EncoderException e) {
            e.printStackTrace();
        }
    }

在上面下载代码中有几行被注释掉的代码,就是关于amr转化MP3的引用,到时候直接将mpsUploadFile返回,就可以了,它就是MP3格式音频文件的路径,以上就是把通过微信录音接口生成的amr格式音频文件转化成audio标签们识别的MP3格式并上传到我们自己服务器的java实现代码。

附:由于我们使用的是阿里云服务器,所以我也将上传到阿里服务器的java实现代码贴出来,有需要的朋友,可以看一下:

public static String putObject(String uploadFileName) throws FileNotFoundException {
        String accessKeyId = "**";
        String accessKeySecret = "**";
        String endPoint = "http://oss-cn-beijing.aliyuncs.com";
        String bucketName = "**";
        // 初始化OSSClient
        OSSClient client = new OSSClient(endPoint, accessKeyId, accessKeySecret);
        // 获取指定文件的输入流
        File file = new File(uploadFileName);
        InputStream content = new FileInputStream(file);
        // 创建上传Object的Metadata
        ObjectMetadata meta = new ObjectMetadata();
        // 必须设置ContentLength
        meta.setContentLength(file.length());
        UUID fileName = UUID.randomUUID();
        String okey = "**" + fileName + ".mp3";
        // 上传Object.
        PutObjectResult result = client.putObject(bucketName, okey, content, meta);
        // 打印ETaghttp://chemahe.oss-cn-beijing.aliyuncs.com/viewpost/view0.jpg
        //System.out.println(result.getETag());
        return "http://chemahe.oss-cn-beijing.aliyuncs.com/" + okey + "";
    }

对了,最后提一句,文件路径中的文件夹一定要提前创建,要不会报错!

二、linux环境


经测试 jave-1.0.2.jar只试用于window环境,linux上转换之后文件字节为0,经过查阅资料,找到了一个简单的能够在linux上进行转换的方法

下载ffmpeg文件,解压找到里面的ffmpeg这个文件

 

上传到linux上,然后使用Runtime执行linux命令,代码如下

 

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by SongZS on 2017/10/9.
 */
public class AmrToMp3Util {
    public static void to(String amrFile,String mp3File){
        List<String> commend = new ArrayList<String>();
        //./ffmpeg  -i test.amr  test.mp3
        commend.add("/home/audio/./ffmpeg");
        commend.add("-i");
        commend.add(amrFile);
        commend.add(mp3File);
        StringBuffer test=new StringBuffer();
        for(int i=0;i<commend.size();i++)
            test.append(commend.get(i)+" ");
        try {
            Runtime rt = Runtime.getRuntime();
            Process proc = rt.exec(test.toString());
            InputStream stderr = proc.getErrorStream();
            InputStreamReader isr = new InputStreamReader(stderr);
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            while ( (line = br.readLine()) != null) ;

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

  

String amrFile amr文件在linux上路径,String mp3File转换成MP3文件在linux上的路径

上面只是简单的linux转换办法,如有更好方法,请留言指教,谢谢