简单4步解决一切烦恼。
1. 配置
mAudioRecord = new AudioRecord(audioSource, sampleRate, channelConfig, audioFormat, Math.max(minBufferSize, DEFAULT_BUFFER_SIZE));
参数说明:
声音来源
MediaRecorder.AudioSource.CAMCORDER
设定录音来源于同方向的相机麦克风相同,若相机无内置相机或无法识别,则使用预设的麦克风
MediaRecorder.AudioSource.DEFAULT 默认音频源
MediaRecorder.AudioSource.MIC
设定录音来源为主麦克风。
MediaRecorder.AudioSource.VOICE_CALL
设定录音来源为语音拨出的语音与对方说话的声音
MediaRecorder.AudioSource.VOICE_COMMUNICATION
摄像头旁边的麦克风
MediaRecorder.AudioSource.VOICE_DOWNLINK
下行声音
MediaRecorder.AudioSource.VOICE_RECOGNITION
语音识别
MediaRecorder.AudioSource.VOICE_UPLINK
上行声音
采样率
根据接口说明44100是唯一在所有设备上都保证支持的。其他的采样率不保证。
通道配置
只有单通道保证在所有设备上支持。
AudioFormat.CHANNEL_IN_MONO 单通道
AudioFormat.CHANNEL_IN_STEREO 双通道
采样格式
一个PCM采样点所占用的数据格式及大小。一般常用的是16位的。
/** Audio data format: PCM 16 bit per sample. Guaranteed to be supported by devices. */
public static final int ENCODING_PCM_16BIT = 2;
/** Audio data format: PCM 8 bit per sample. Not guaranteed to be supported by devices. */
public static final int ENCODING_PCM_8BIT = 3;
/** Audio data format: single-precision floating-point per sample */
public static final int ENCODING_PCM_FLOAT = 4;
PCM数据缓冲区大小
不能小于下面最小大小,最小大小可以从下面函数获取
static public int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat)
2. 读取数据
将数据读取到mBuffer中。返回值为实际读取的长度
int readLen = mAudioRecord.read(mBuffer, 0, DEFAULT_BUFFER_SIZE);
3. 销毁
mAudioRecord.stop();
mAudioRecord.release();
4. 示例代码
/** 使用默认的音频配置,回调函数用来消费音频数据,这里的音频数据是PCM,需要经过编码生成aac */
public static void startGetAudioData(IConsumeDataCallback consumer) {
Logcat.d(TAG, "startGetAudioData called!");
// 配置AudioRecord
int audioSource = MediaRecorder.AudioSource.VOICE_COMMUNICATION;
// 所有支持android系统都支持
int sampleRate = 44100;
// 单声道输入
int channelConfig = AudioFormat.CHANNEL_IN_MONO;
// pcm_16时所有android系统都支持的
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
// 计算AudioRecord内部buffer最小
int minBufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);
// buffer不能小于最低要求,也不能小于我们每次我们读取的大小。
mAudioRecord = new AudioRecord(audioSource, sampleRate, channelConfig, audioFormat, Math.max(minBufferSize, DEFAULT_BUFFER_SIZE));
// 开始录音
mAudioRecord.startRecording();
isStart = true;
mBuffer = new byte[DEFAULT_BUFFER_SIZE];
while (isStart) {
int readLen = mAudioRecord.read(mBuffer, 0, DEFAULT_BUFFER_SIZE);
if (readLen <= 0) {
break;
}
consumer.handle(mBuffer, readLen);
}
mAudioRecord.stop();
mAudioRecord.release();
mAudioRecord = null;
Logcat.d(TAG, "startGetAudioData exit!");
}
其中?consumer.handle(mBuffer, readLen); 是我写的自定义消费函数,使用接口实现。
|