AudioRecord录制的是PCM格式的音频文件,需要用AudioTrack来播放。也可以使用MediaCodec编码成播放器可以播放的音频文件。

AudioRecord录音的流程为:



(1)构造一个AudioRecord对象,其中需要的最小录音缓存buffer大小可以通过getMinBufferSize方法得到。如果buffer容量过小,将导致对象构造的失败。

int recordBufSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, EncodingBitRate);

AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelConfiguration, EncodingBitRate, recordBufSize);复制代码

下面说说getMinBufferSize的参数

AudioRecord.getMinBufferSize(
frequency, // 采样率
channelConfiguration, // 声道
EncodingBitRate); // 编码制式复制代码

下面对AudioRecord的构造函数进行说明:

public AudioRecord (
int audioSource, // 音频源
int sampleRateInHz, // 采样率
int channelConfig,  // 声道
int audioFormat, // 编码制式
int bufferSizeInBytes) // 采集数据缓冲区大小复制代码

下面对各个参数进行说明:

音频源:指的是从哪里采集音频 下面是Android所支持的音频源,在MediaRecorder.AudioSource里面。

/**默认声音**/

public static final int DEFAULT = 0;

/**麦克风声音*/

public static final int MIC = 1;

/**通话上行声音*/

public static final int VOICE_UPLINK = 2;

/**通话下行声音*/

public static final int VOICE_DOWNLINK = 3;

/**通话上下行声音*/

public static final int VOICE_CALL = 4;

/**根据摄像头转向选择麦克风*/

public static final int CAMCORDER = 5;

/**对麦克风声音进行声音识别,然后进行录制*/

public static final int VOICE_RECOGNITION = 6;

/**对麦克风中类似ip通话的交流声音进行识别,默认会开启回声消除和自动增益*/

public static final int VOICE_COMMUNICATION = 7;

/**录制系统内置声音*/

public static final int REMOTE_SUBMIX = 8;
复制代码

采样率:音频的采样频率,每秒钟能够采样的次数,采样率越高,音质越高。给出的实例是44100、22050、11025但不限于这几个参数。例如要采集低质量的音频就可以使用4000、8000等低采样率。

声道设置:android支持双声道立体声和单声道。MONO单声道,STEREO立体声

在AudioFormat里面

public static final int CHANNEL_IN_MONO = CHANNEL_IN_FRONT;
public static final int CHANNEL_IN_STEREO = (CHANNEL_IN_LEFT | CHANNEL_IN_RIGHT);
复制代码

编码制式和采样大小:采集来的数据当然使用PCM编码 android支持的采样大小16bit 或者8bit。当然采样大小越大,那么信息量越多,音质也越高,现在主流的采样大小都是16bit,在低质量的语音传输的时候8bit足够了。

 在AudioFormat里面

public static final int ENCODING_PCM_16BIT = 2;
public static final int ENCODING_PCM_8BIT = 3;
复制代码



(2)开始录音

audioRecord.startRecording();
复制代码



(3)不断的读取音频流,写入到一个PCM文件中

byte data[] = new byte[recordBufSize]; 
FileOutputStream os = new FileOutputStream(filename);

while (isRecording) {
    read = audioRecord.read(data, 0, recordBufSize);
    if (AudioRecord.ERROR_INVALID_OPERATION != read) {
         os.write(data);
    }
}
复制代码

(4)停止录音

isRecording = false;
audioRecord.stop();
audioRecord.release();
audioRecord = null;复制代码