通过audioRecord 录音、AudioTrack 播放
1、引入
boolean isRecording = false;
static final int freq = 8000;
static final int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
int recBuffSize =AudioRecord.getMinBufferSize(freq, channelConfiguration, audioEncoding);
int playBufSize = AudioTrack.getMinBufferSize(freq, channelConfiguration, audioEncoding);
AudioRecord audioRecord =new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, freq,
AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, recBuffSize);
//new AudioRecord(MediaRecorder.AudioSource.MIC, freq, channelConfiguration, audioEncoding, recBuffSize);
AudioTrack audioTrack =new AudioTrack(AudioManager.STREAM_MUSIC, freq, channelConfiguration, audioEncoding, playBufSize, AudioTrack.MODE_STREAM);
第二
class RecordPlayThread extends Thread {
@Override
public void run() {
super.run();
try {
byte[] buffer = new byte[recBuffSize];
audioRecord.startRecording(); // 开始录音
//自动增强控制器
/* if(AutomaticGainControl.isAvailable()){
automaticGainControl = AutomaticGainControl.create(audioRecord.getAudioSessionId());
automaticGainControl.setEnabled(true);
}
//消除噪音
if(NoiseSuppressor.isAvailable()){
noiseSuppressor = NoiseSuppressor.create(audioRecord.getAudioSessionId());
noiseSuppressor.setEnabled(true);
}
//回音消除控制器
if(AcousticEchoCanceler.isAvailable()){
acousticEchoCanceler = AcousticEchoCanceler.create(audioRecord.getAudioSessionId());
acousticEchoCanceler.setEnabled(true);
}*/
audioTrack.play(); // 开始放音
while (isRecording) {
// 从MIC保存数据到buffer
int bufferReadResult = audioRecord.read(buffer, 0, recBuffSize);
byte[] tmpBuffer = new byte[bufferReadResult];
System.arraycopy(buffer, 0, tmpBuffer, 0, bufferReadResult);
// 写入数据到AudioTrack即可播放
audioTrack.write(tmpBuffer, 0, tmpBuffer.length);
}
audioRecord.stop();
audioTrack.stop();
} catch (Throwable t) {
}
}
}
第三
if (event.getAction() == MotionEvent.ACTION_DOWN) {
isRecording = true;
new RecordPlayThread().start();// 开线程边录边放
};
if (event.getAction() == MotionEvent.ACTION_UP) {
isRecording = false;
break;
}