临医app录音管理基类
删除了跟商业隐私有关函数,只剩下功能函数,希望能给大家带来帮助。
其中振幅功能是为了提供根据声音大小而变化的波动动画,有兴趣的同学可以私信我索取。
有MP3转换功能,这方面个人觉得在Android机器上做录音转换并不太好,可以把音频转换模块放到服务器上执行。
package com.utils.tools;
import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.Locale;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.Handler;
import android.text.format.DateFormat;
import android.util.Log;
import it.sauronsoftware.jave.AudioAttributes;
import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.EncoderException;
import it.sauronsoftware.jave.EncodingAttributes;
import it.sauronsoftware.jave.InputFormatException;
public class RecordManger {
private static final String LOG_TAG = "AudioRecord";
/**amr*/
private File file = new File(Environment.getExternalStorageDirectory().getPath()+"/rec/"
+ "luyin"
+ DateFormat.format("yyyyMMdd_HHmmss",
Calendar.getInstance(Locale.CHINA)) + ".amr");
// /**mp3*/
// private File file1 = new File("/sdcard/"
// + "YY/"
// + DateFormat.format("yyyyMMdd_HHmmss",
// Calendar.getInstance(Locale.CHINA)) + ".mp3");
/**android录音*/
private MediaRecorder mr;
/**声音振幅回调*/
private SoundAmplitudeListen soundAmplitudeListen;
private final Handler mHandler = new Handler();
private Runnable mUpdateMicStatusTimer = new Runnable() {
private int BASE = 600;
private int RATIO=5;
private int postDelayed =200;
public void run() {
// int vuSize = 10 * mMediaRecorder.getMaxAmplitude() / 32768;
int ratio =mr.getMaxAmplitude() / BASE;
int db = (int) (20 * Math.log10(Math.abs(ratio)));
int value=db / RATIO;
if(value<0)value=0;
if(soundAmplitudeListen!=null)
soundAmplitudeListen.amplitude(ratio, db, value);
mHandler.postDelayed(mUpdateMicStatusTimer, postDelayed);
}
};
// 生成文件夹
public static void makeRootDirectory() {
File file = null;
try {
file = new File(Environment.getExternalStorageDirectory().getPath()+"/linyirec/");
if (!file.exists()) {
file.mkdir();
}
} catch (Exception e) {
Log.i("error:", e+"");
}
}
/**开始录音*/
public void startRecordCreateFile() throws IOException {
if (!Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED)) {
return;
}
makeRootDirectory();;
file.createNewFile();
// file1.createNewFile();
mr = new MediaRecorder();
mr.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mr.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mr.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mr.setOutputFile(file.getAbsolutePath());
// 按照mediarecorder文档步骤
mr.prepare();
mr.start();
//录音线程
mHandler.post(mUpdateMicStatusTimer);
}
//转换amr为mp3的函数
public static void changeToMp3(String sourcePath, String targetPath) {
File source = new File(sourcePath);
File target = new File(targetPath);
AudioAttributes audio = new AudioAttributes();
Encoder encoder = new Encoder();
audio.setCodec("libmp3lame");
audio.setBitRate(new Integer(128000));
audio.setChannels(new Integer(2));
audio.setSamplingRate(new Integer(44100));
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();
}
}
//停止录音
public File stopRecord() {
if (mr != null ) {
// mr.setOnErrorListener(null);
// mr.setOnInfoListener(null);
// mr.setPreviewDisplay(null);
mr.stop();
mr.reset();
mr.release();
mr = null;
mHandler.removeCallbacks(mUpdateMicStatusTimer);
}
// changeToMp3(file.getAbsolutePath(), file1.getAbsolutePath());
return file;
}
//重置
public void reRecord() {
if (mr != null) {
mr.stop();
mr.reset();
mr.release();
mr = null;
}
shanchu();
// changeToMp3(file.getAbsolutePath(), file1.getAbsolutePath());
}
public File getFile() {
return file;
}
public void shanchu(){
if (file.exists()) { // 判断文件是否存在
if (file.isFile()) { // 判断是否是文件
file.delete(); // delete()方法 你应该知道 是删除的意思;
} else if (file.isDirectory()) { // 否则如果它是一个目录
// File files[] = file.listFiles(); // 声明目录下所有的文件 files[];
// for (int i = 0; i < files.length; i++) { // 遍历目录下所有的文件
// this.deleteFile(files[i]); // 把每个文件 用这个方法进行迭代
// }
}
file.delete();
} else {
// Constants.Logdada("文件不存在!"+"\n");
}
}
public void setFile(File file) {
this.file = file;
}
public MediaRecorder getMr() {
return mr;
}
public void setMr(MediaRecorder mr) {
this.mr = mr;
}
public SoundAmplitudeListen getSoundAmplitudeListen() {
return soundAmplitudeListen;
}
public void setSoundAmplitudeListen(SoundAmplitudeListen soundAmplitudeListen) {
this.soundAmplitudeListen = soundAmplitudeListen;
}
public interface SoundAmplitudeListen{
public void amplitude(int amplitude,int db,int value);
}
}