之前在做车载语音微信项目的时候,基于网页版微信原理,在发送语音消息时先将录音消息传到讯飞的车载服务服务器,然后获取URL,只发送URL就可以了。由于录音数据为pcm格式,pcm转wav比较容易,直接加个头文件就可以了,但是wav转mp3呢,在这里我是用了比较出名的MP3 Encoder库Lame,正好通过Lame库的使用熟悉Android NDK开发:
1.首先介绍一下Lame库,LAME是目前最好的MP3编码引擎。LAME编码出来的MP3音色纯厚、空间宽广、低音清晰、细节表现良好,它独创的心理音响模型技术保证了CD音频还原的真实性,配合VBR和ABR参数,音质几乎可以媲美CD音频,但文件体积却非常小。对于一个免费引擎,LAME的优势不言而喻。关于LAME的介绍可以在百度百科,维基百科中找到,我在这里不再赘述了,但是要知道LAME可以帮助我们将wav无损音频文件转码成mp3这种体积相对较小的音频格式文件,哈哈,看了这么多是不是想睡觉了,别急,下面上干货。
2.LAME的源码是托管到sourceforge.net上的,我们开发一个基于LAME的项目,就不得不下载其源码用于编译。获取Lame库源码,戳这里:
LAME主页:http://lame.sourceforge.net/
LAME下载:https://sourceforge.net/projects/lame/files/lame/3.99/
3.OK,在这里我将音频格式转化的操作封装为一个工具类RecordUtil,在这里面实现了pcm转wav以及wav转mp3,pcm转wav很容易,加个头文件就可以了。wav转mp3,使用native方法convertmp3(String wav,String mp3),该native方法将从Java层获取到的两个音频文件的路径传递给C端,C端拿到这两个路径,就可以进行读写和编解码操作了。源代码如下:
public class RecordUtil {
private static final int SAMPLE_RATE_IN_HZ = 8000;
private MediaRecorder recorder = new MediaRecorder();
// 录音的路径
private String mPath;
private Handler mHandler;
static {
System.loadLibrary("Hello");
}
public native void convertmp3(String wav, String mp3);
public RecordUtil(String path, Handler handler) {
mPath = path;
this.mHandler = handler;
}
/**
* 将pcm格式的文件加头处理成wav格式的音频文件
*/
public void pcm2wav(String pcmFilePath, String wavFilePath) {