概述
AudioRecord、AudioTrack 的使用都比较简单,基本流程:
AudioRecord:
1) AudioRecord.getMinBufferSize()
2) new AudioRecord()
3) mAudioRecord.read()
如此,即可得到录制好的音频裸数据(PCM)。
AudioTrack 有两种播放方式:
1) static:把音频数据一次性写入 AudioTrack,再进行播放
2) stream:边写边播
播放流程基本都是:
1) AudioTrack.getMinBufferSize()
2) new AudioTrack()
3) mAudioTrack.write() // static 方式必须先 write,再 play
4) mAudioTrack.play()
其中 getMinBufferSize()、new AudioRecord()、new AudioTrack() 需要传入 sampleRate、channel、sampleFormat 等参数,这些参数涉及到音频开发的一些基础知识,可参考我的另一篇博客:音视频开发基础概述 - PCM、YUV、H264、常用软件介绍
AudioRecord 录制 PCM 数据
public class AudioRecorder {
private static final String TAG = "AudioRecorder";
private static final int DEFAULT_SAMPLE_RATE = 48000;
private static final int DEFAULT_PCM_DATA_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
private ExecutorService mExecutor = Executors.newCachedThreadPool();
private AudioRecord mAudioRecord;
private int mBufferSize;
private int mSampleRate = DEFAULT_SAMPLE_RATE;
private int mPcmFormat = DEFAULT_PCM_DATA_FORMAT;
private AudioRecordCallback mRecordCallback;
private Handler mHandler;
private boolean mIsRecording = false;
public void setSampleRate(int sampleRate) {
mSampleRate = sampleRate;
}
public void setPcmFormat(int pcmFormat) {
mPcmFormat = pcmFormat;
}
public void setRecordCallback(AudioRecordCallback recordCallback) {
mRecordCallback = recordCallback;
}
public int getChannels() {
return 1;
}
public boolean start() {
try {
mBufferSize = AudioRecord.getMinBufferSize(mSampleRate, AudioFormat.CHANNEL_IN_MONO,
mPcmFormat);
mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, mSampleRate,
AudioFormat.CHANNEL_IN_MONO, mPcmFormat, mBufferSize);
} catch (Exception e) {
Log.e(TAG, "init AudioRecord exception: " + e.getLocalizedMessage());
return false;
}
if (mAudioRecord.getState() != AudioRecord.STATE_INITIALIZED) {
Log.e(TAG, "cannot init AudioRecord&