添加权限
一、录音(存文件)输出
1、录音至本地文件
import android.media.MediaRecorder;
import android.util.Log;
import java.io.File;
import java.io.IOException;
public class MicrophoneRecording {
private static final String TAG = "MicrophoneRecording";
private MediaRecorder mRecorder;
private File audioFile;
public void startRecording() {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
try {
audioFile = File.createTempFile("recording", ".amr");
mRecorder.setOutputFile(audioFile.getAbsolutePath());
mRecorder.prepare();
Log.d(TAG, "startRecording");
} catch (IOException e) {
e.printStackTrace();
}
mRecorder.start();
}
public String getAudioFile() {
return this.audioFile.getAbsolutePath();
}
public void stopRecording() {
if (mRecorder != null) {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
}
}
}
2、音源播放器
import android.media.MediaPlayer;
import android.util.Log;
import java.io.IOException;
public class AudioSourcePlay {
private static final String TAG = "AudioSourcePlay";
private MediaPlayer mPlayer;
public void startPlaying(String fileName) {
mPlayer = new MediaPlayer();
try {
mPlayer.setDataSource(fileName);
mPlayer.prepare();
mPlayer.start();
Log.d(TAG, "startPlaying");
} catch (IOException e) {
e.printStackTrace();
}
}
public void stopPlaying() {
if (mPlayer != null) {
mPlayer.release();
mPlayer = null;
}
Log.d(TAG, "stopPlaying");
}
}
3、调用
ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//开启录音
startRecording();
}
});
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 停止录音
stopRecording();
}
});
mUpgrade.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 播放
AudioSourcePlay();
}
});
private void startRecording() {
mMicrophoneRecording = new MicrophoneRecording();
mMicrophoneRecording.startRecording();
Log.d("ModuleService", "openMicrophone: ");
}
private void stopRecording(){
mMicrophoneRecording.stopRecording();
Log.d("ModuleService", "stopMicrophone: ");
}
private void AudioSourcePlay(){
mAudioSourcePlay = new AudioSourcePlay();
mAudioSourcePlay.startPlaying(mMicrophoneRecording.getAudioFile());
Log.d("ModuleService", "playing: ");
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mMicrophoneRecording != null) {
stopRecording();
mMicrophoneRecording = null;
}
if (mAudioSourcePlay != null){
mAudioSourcePlay.stopPlaying();
mAudioSourcePlay = null;
}
}
二、实时录音并播放
1、
// 线程处理数据流
private class RecordThread extends Thread{
static final int frequency = 44100;
static final int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
@Override
public void run() {
int recBufSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding)*2;
int plyBufSize = AudioTrack.getMinBufferSize(frequency, channelConfiguration, audioEncoding)*2;
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelConfiguration, audioEncoding, recBufSize);
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, frequency, channelConfiguration, audioEncoding, plyBufSize, AudioTrack.MODE_STREAM);
byte[] recBuf = new byte[recBufSize];
audioRecord.startRecording();
audioTrack.play();
while(true){
int readLen = audioRecord.read(recBuf, 0, recBufSize);
audioTrack.write(recBuf, 0, readLen);
}
}
}
2、调用
private MicrophoneRecording mMicrophoneRecording;
private AudioSourcePlay mAudioSourcePlay;
private AudioRecord audioRecord;
private AudioTrack audioTrack;
mUpgrade.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 播放
RecordThread recordThread = new RecordThread();
recordThread.start();
}
});
@Override
protected void onDestroy() {
super.onDestroy();
audioTrack.stop();
audioRecord.stop();
}



