微信公众号音频接口开发

根据业务需求,我们可能需要将微信录音保存到服务器,而通过微信上传语音接口上传到微信服务器的语音文件的有效期只有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", "");// 连接超时30秒
System.setProperty("sun.net.client.defaultReadTimeout", ""); // 读取超时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[];
int len = ;
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)) != -) {
fileOutputStream.write(data, , 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转换办法,如有更好方法,请留言指教,谢谢

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

  1. 微信录音文件上传到服务器以及amr转化成MP3格式

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

  2. DedeCMS使用方法----如何将网站上传到服务器

    我们如果在本地已经把网站做好了,上传到服务器上去的正确姿势是什么样的呢?简单的很~跟着我的步调来~ 方法一(推荐此方法): 1.把你本地所有的文件压缩,上传至服务器上的根目录,再解压. 2.把本地的数 ...

  3. java文件上传到服务器

    最近项目中使用到了文件从本地到服务器的功能.其实是为了解决目前浏览器不支持获取本地文件全路径.不得已而想到上传到服务器的固定目录,从而方便项目获取文件,进而使程序支持EXCEL批量导入数据. 在前台界 ...

  4. HTML5 文件域+FileReader 分段读取文件并上传到服务器(六)

    说明:使用Ajax方式上传,文件不能过大,最好小于三四百兆,因为过多的连续Ajax请求会使后台崩溃,获取InputStream中数据会为空,尤其在Google浏览器测试过程中. 1.简单分段读取文件为 ...

  5. HTML5 文件域+FileReader 读取文件并上传到服务器(三)

    一.读取文件为blob并上传到服务器 HTML <div class="container"> <!--读取要上传的文件--> <input type ...

  6. SpringMVC中文件的上传(上传到服务器)和下载问题(一)

    一.今天我们所说的是基于SpringMVC的关于文件的上传和下载的问题的解决.(这里所说的上传和下载都是上传到服务器与从服务器上下载文件).这里的文件包括我们常用的各种文件.如:文本文件(.txt), ...

  7. Android使用OKHttp库实现视频文件的上传到服务器

    目录 1 服务器接口简介 2 Android端代码实现 2.1 xml布局文件 2.2 Activity类 2.3 Okhttp网络通信类 1 服务器接口简介 此处我使用的服务器接口是使用Flask编 ...

  8. MVC图片上传、浏览、删除 ASP.NET MVC之文件上传【一】(八) ASP.NET MVC 图片上传到服务器

    MVC图片上传.浏览.删除   1.存储配置信息 在web.config中,添加配置信息节点 <appSettings> <add key="UploadPath" ...

  9. Java实现文件上传到服务器(FTP方式)

    Java实现文件上传到服务器(FTP方式) 1,jar包:commons-net-3.3.jar 2,实现代码: //FTP传输到数据库服务器 private boolean uploadServer ...

随机推荐

  1. java.lang.RuntimeException: Cannot create a secure XMLInputFactory 异常处理

    背景:本人在近日的webservice   CXF接口的编写调试过程中,发现一个很奇怪的现象--我在本地对接口进行往返请求时完全没有问题,不管是main方法直接调用还是业务场景里调用都无问题,在其他同 ...

  2. 如何在vue中使用动态使用本地图片路径

    不知道各位小伙伴有没有在开发遇到一个问题,就是在线上的项目使用后台返回本地图片路径,然后加载不上的情况呢? 我的解决方法就是:先在项目的data下定义好这样一个数组用于存放需要加载的路径 [ {nam ...

  3. 第二节,surf特征检测关键点,实现图片拼接

    初级的图像拼接为将两幅图像简单的粘贴在一起,仅仅是图像几何空间的转移和合成,与图像内容无关:高级图像拼接也叫做基于特征匹配的图像拼接,拼接时消去两幅图像相同的部分,实现拼接全景图. 实现步骤: 1.采 ...

  4. Lock类-ReentrantLock的使用

    在Java多线程中可以使用synchronized隐式锁实现线程之间同步互斥,Java5中提供了Lock类(显示锁)也可以实现线程间的同步,而且在使用上更加方便.本文主要研究 ReentrantLoc ...

  5. k64 datasheet学习笔记10---Signal Multiplexing and Signal Descriptions

    1.前言 本文主要描述多功能引脚相关的内容,包括5个32位的引脚的端口,每个32pin端口被指定一个中断 2.Signal Multiplexing Integration 3. Port contr ...

  6. Python运维开发基础08-文件基础【转】

    一,文件的其他打开模式 "+"表示可以同时读写某个文件: r+,可读写文件(可读:可写:可追加) w+,写读(不常用) a+,同a(不常用 "U"表示在读取时, ...

  7. DeprecationWarning: Calling an asynchronous function without callback is deprecated. - how to find where the “function:” is?

    I recently updated my node to 7.2.1 and noticed that there is a warning coming: (node:4346) Deprecat ...

  8. nginx proxy_set_header设置、自定义header

    先来看下proxy_set_header的语法 语法: proxy_set_header field value; 默认值: proxy_set_header Host $proxy_host; pr ...

  9. Java的if判断对象为null时,null放在比较运算符的左边还是右边较好?

    如java中:if(name == null)和if(null == name)有什么讲究吗? 答:在java里面,它们是一样的.但是通常写为null == name.这其实是在C语言里面引申出来的. ...

  10. Qt5.10.1 在windows下vs2017静态编译

    1.在计算机上安装python库和perl库(因为后续的静态编译需要用到这两种语言),可以在命令行敲击“python”和“perl -v”检查是否安装成功. 2.修改msvc-desktop.conf ...