Android:我想从麦克风读取缓冲区,以便我可以对其执行处理,以下是我的代码
int sampleRateInHz = 8000;// 44100, 22050 and 11025
int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
//int bufferSize =11025 +
int bufferSize = AudioRecord.getMinBufferSize(sampleRateInHz,channelConfig, audioFormat);
short[] buffer = new short[bufferSize];
AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRateInHz,channelConfig, audioFormat, bufferSize);
if(audioRecord.getState()== AudioRecord.STATE_INITIALIZED){
audioRecord.startRecording();
Log.e("recording", "before");
boolean flag = true;
while (flag) {
int bufferReadResult = audioRecord.read(buffer, 0, bufferSize);
System.out.println(buffer);
}
audioRecord.stop();
audioRecord.release();
}
Log.e("recording", "stopeed");
<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
每次尝试测试程序时,我都会收到以下错误
06-04 00:18:17.222: E/AudioRecord-Java(488): [ android.media.AudioRecord ] 初始化本机 AudioRecord 对象时出现错误代码 -20。
如果出现以下情况,也会引发此异常
- 音频录制已在进行中或
- 录制不可用或 应用程序没有
- 适当的权限,例如:应用程序没有记录权限等
我了解,CHANNEL_CONFIGURATION_MONO是贬值的,您应该在读取缓冲区时使用CHANNEL_IN_MONO。我在实例化 AudioRecord 对象时遇到了类似的问题,事实证明这对我来说是解决方案。
A 可能是这可以回答的?
参数:
音频源 – 录音源。有关录制源定义,请参阅 MediaRecorder.AudioSource。
sampleRateInHz – 以赫兹表示的采样率。44100Hz 是目前唯一保证适用于所有设备的速率,但其他速率(如 22050、16000 和 11025)可能适用于某些设备。
AudioFormat.SAMPLE_RATE_UNSPECIFIED表示使用路由相关值,该值通常是源的采样率。 getSampleRate() 可用于检索选择的实际采样率。
channelConfig – 描述音频通道的配置。看AudioFormat.CHANNEL_IN_MONO和AudioFormat.CHANNEL_IN_STEREO。AudioFormat.CHANNEL_IN_MONO保证在所有设备上工作。
audioFormat – 返回音频数据的格式。请参阅AudioFormat.ENCODING_PCM_8BIT、AudioFormat.ENCODING_PCM_16BIT和AudioFormat.ENCODING_PCM_FLOAT。
缓冲区大小(字节) – 录制期间写入音频数据的缓冲区的总大小(以字节为单位)。可以从此缓冲区以比此大小更小的块读取新的音频数据。请参阅 getMinBufferSize(int, int, int) 以确定成功创建 AudioRecord 实例所需的最小缓冲区大小。使用小于 getMinBufferSize() 的值将导致初始化失败。