封装的工具类:
package com.example.voaactest;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import com.sinaapp.bashell.VoAACEncoder;
import android.R.integer;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Handler;
import android.os.SystemClock;
import android.util.Log;
/**
* aac音频处理
*
* @author liueg
*
*/
public class VoAACRecordManager {
private final String TAG = "VoAAVRecordManager";
private AudioRecord mAudioRecord;
private File file;
private int SAMPLERATE = 8000;// 设置采样率
private int bitRate = 16000;// 设置bit率
private Handler mHandler;
private long startTime;
private long endTime;
private boolean isRecodering;
private int SPACE = 300;// 间隔取样时间
private FileOutputStream fos;
private int r;
private int v;
public VoAACRecordManager() {
}
public VoAACRecordManager(File file) {
File parentFile = file.getParentFile();
if (!parentFile.exists()) {
parentFile.mkdirs();
}
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
this.file = file;
}
/**
* 开始录音,使用aac格式
*/
public void startRecord() {
new Thread(new Runnable() {
@Override
public void run() {
try {
fos = new FileOutputStream(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
VoAACEncoder vo = new VoAACEncoder();
int min = AudioRecord.getMinBufferSize(SAMPLERATE,// 得到一个需要的最小录音缓存大小,SAMPLERATE:采样率
AudioFormat.CHANNEL_IN_MONO,// 声道设置,单声道
AudioFormat.ENCODING_PCM_16BIT);// 编码制式
vo.Init(SAMPLERATE, 16000, (short) 1, (short) 1);// 采样率:8000,bitRate:16000,声道数:1,编码:0.raw
// 1.ADTS
if (min < 2048) {
min = 2048;
}
byte[] temp = new byte[2048];
mAudioRecord = new AudioRecord(
MediaRecorder.AudioSource.MIC,// 麦克风音源
SAMPLERATE, AudioFormat.CHANNEL_IN_DEFAULT,
AudioFormat.ENCODING_PCM_16BIT, min);
mAudioRecord.startRecording();
isRecodering = true;
startTime = System.currentTimeMillis();
updateMicStatus();
while (isRecodering) {
r = mAudioRecord.read(temp, 0, min);
if (r > 0) {
v = 0;
for (int i = 0; i < temp.length; i++) {
v += temp[i] * temp[i];
}
byte[] ret = vo.Enc(temp);
try {
fos.write(ret);
} catch (IOException e) {
// TODO Auto-generated catch block
isRecodering = false;
e.printStackTrace();
}
}
}
mAudioRecord.stop();
mAudioRecord.release();
mAudioRecord = null;
vo.Uninit();
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
private void updateMicStatus() {
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
if (mHandler != null) {
while (isRecodering) {
int value = (int) (Math
.abs((int) (v / (float) r) / 100) >> 1);// 得到即时声音的振幅(测试的是0-30之间)
mHandler.sendEmptyMessage(value);
SystemClock.sleep(SPACE);
}
}
}
}).start();
}
/**
* 停止录音返回录音时长
*
* @return
*/
public long stopRecord() {
if (mAudioRecord == null)
return 0L;
isRecodering = false;
endTime = System.currentTimeMillis();
return endTime = startTime;
}
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public Handler getmHandler() {
return mHandler;
}
public void setmHandler(Handler mHandler) {
this.mHandler = mHandler;
}
}
在activity中的使用: package com.example.voaactest; import java.io.File; import java.io.IOException; import android.app.Activity; import android.media.MediaPlayer; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { private String FileName = null; private Button startRecord; private Button stopRecord; private Button startPlay; private Button stopPlay; private TextView tv_voice; private MediaPlayer mPlayer = null; private MediaRecorder mRecorder = null; private String mRecordFileName; VoAACRecordManager manager; private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { int v =msg.what; tv_voice.setText("voice:"+v); }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); manager = new VoAACRecordManager(); manager.setmHandler(handler); mRecordFileName = Environment.getExternalStorageDirectory() .toString() + "/testAAC.aac"; File file = new File(mRecordFileName); manager.setFile(file); tv_voice = (TextView) findViewById(R.id.tv_voice); startRecord = (Button)findViewById(R.id.startRecord); startRecord.setOnClickListener(new startRecordListener()); stopRecord = (Button)findViewById(R.id.stopRecord); stopRecord.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub manager.stopRecord(); } }); startPlay = (Button)findViewById(R.id.startPlay); startPlay.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub mPlayer = new MediaPlayer(); try { mPlayer.setDataSource(mRecordFileName); mPlayer.prepare(); mPlayer.start(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); stopPlay = (Button)findViewById(R.id.stopPlay); stopPlay.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub mPlayer.release(); mPlayer = null; } } ); } class startRecordListener implements OnClickListener{ @Override public void onClick(View v) { // TODO Auto-generated method stub manager.startRecord(); //mRecorder = new MediaRecorder(); //mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //mRecorder.setOutputFile(FileName); //mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //try { //mRecorder.prepare(); //} catch (Exception e) { //e.printStackTrace(); //} //mRecorder.start(); } } }