主要使用到LAME 这个东东,需要用到jni;要装NDK ,要编译so库文件.要这个那个.. 麻烦的很....
果断各种google,然后找到个别人编译好的so和jar包,爽歪歪;
用非很简单:
FLameUtils mFLameUtils = new FLameUtils(1, sampleRateInHz, 96);
mFLameUtils.raw2mp3(lovaPath, path);
调他封装好的 工具类FLameUtils,然后传入对应的参数,相信用过AudioRecord 的都看得懂参数都是什么;这里说几个注意事项:
1.录音时, 读取数据记得用short[]类型,不然格式转换后会是噪音,short[] buffDate = new short[minBufferSizeInBytes];
2.导入工具类时记得要和他原来的包名一样,不然会调用不到本地jni方法;
3.格式转换记得丢在线程里,不然..你懂得;
4.格式转换完成后记得删掉原数据(raw原数据比较大,我记得录了12秒就1M 了... 我用的44100码率);
下面是我用的录音和格式转换代码:
/**
* 开始录音
*/
public void startRecord() {
if (mAudioRecord != null && !isRecording()) {
if (mAudioRecord.getState() == AudioRecord.STATE_INITIALIZED) {
LogUtil.i(TAG, "开始录音...");
new StartRecordThread().start();
isRecording = true;
} else {
LogUtil.e(TAG, "mAudioRecord=STATE_UNINITIALIZED");
}
}
}
/**
*
**************************************************************************
* @Version
* @ClassName: AudioRecordHelper.StartRecordThread
* @Description: 录音线程
* @Author fans
***************************************************************************
*/
class StartRecordThread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
mAudioRecord.startRecording();
writeDateToFile(lovaPath);
}
}
/**
* 写入原数据
*
* @param path
*/
private void writeDateToFile(String path) {
short[] buffDate = new short[minBufferSizeInBytes];
DataOutputStream dos = null;
int readSize = 0;
try {
File recordFile = new File(path);
if (recordFile.exists()) {
recordFile.delete();
recordFile.createNewFile();
}
dos = new DataOutputStream(new BufferedOutputStream(
new FileOutputStream(recordFile)));
while (isRecording()) {
readSize = mAudioRecord.read(buffDate, 0, minBufferSizeInBytes);
for (int i = 0; i < readSize; i++) {
dos.writeShort(buffDate[i]);
}
LogUtil.i(TAG, "录入音频大小:" + buffDate.length);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (dos != null) {
try {
dos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
/**
*
**************************************************************************
* @Version
* @ClassName: AudioRecordHelper.Raw2Mp3Thread
* @Description: 原数据转MP3
* @Author fans
***************************************************************************
*/
class Raw2Mp3Thread extends Thread {
String path;
public Raw2Mp3Thread(String path) {
this.path = path;
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
String drPath = path.substring(0, path.lastIndexOf("/"));
LogUtil.i(TAG, "储存目录:" + drPath);
File file = new File(drPath);
if (!file.exists()) {
file.mkdirs();
}
LogUtil.i(TAG, "录音原始数据:" + lovaPath + ";MP3数据:" + path);
/* 原始raw文件转换成MP3 */
if (new File(lovaPath).length() < 1) {
LogUtil.e(TAG, "原始数据大小为0");
return;
}
File loveFile = new File(lovaPath);
LogUtil.i(TAG, "MP3格式转换开始...;文件大小=" + loveFile.length());
FLameUtils mFLameUtils = new FLameUtils(1, sampleRateInHz, 96);
mFLameUtils.raw2mp3(lovaPath, path);
LogUtil.i(TAG,
"转换完成:" + path + ";MP3文件大小=" + new File(path).length());
loveFile.delete();
CJApplication.getInstance().sendBroadcast(
new Intent(CJConstant.RECORD_FINISH_ACTION));
}
}
工具类和库文件下载地址:下载地址