【发布时间】:2015-11-06 13:41:10
【问题描述】:
我正在开发一个 DTMF 解码器。我需要的是录制语音通话,然后提取频率范围。一切正常,但是在某些 android 版本中,当我设置音频源时出现以下错误
“AudioAttributes 的无效捕获预设 3”
为了得到正确的参数,我开发了一个算法:
private static final int[] FREQUENCY = {8000, 11025, 16000, 22050, 44100}; // 44100 is guaranteed to work in all devices
private static final int[] CHANNEL_CONFIGURATION = {AudioFormat.CHANNEL_IN_MONO,
AudioFormat.CHANNEL_IN_STEREO};
private static final int[] AUDIO_ENCODING = {AudioFormat.ENCODING_DEFAULT,
AudioFormat.ENCODING_PCM_8BIT,
AudioFormat.ENCODING_PCM_16BIT};
for (int i = 0; i < FREQUENCY.length && !found; i ++) {
for (int j = 0; j < CHANNEL_CONFIGURATION.length && !found; j ++) {
for (int k = 0; k < AUDIO_ENCODING.length && !found; k ++) {
try {
bufferSize = AudioRecord.getMinBufferSize(FREQUENCY[i], CHANNEL_CONFIGURATION[j], AUDIO_ENCODING[k]);
if (bufferSize != AudioRecord.ERROR_BAD_VALUE && bufferSize != AudioRecord.ERROR) {
audioRecord = new AudioRecord(MediaRecorder.AudioSource.VOICE_DOWNLINK, FREQUENCY[i], CHANNEL_CONFIGURATION[j], AUDIO_ENCODING[k], bufferSize);
found = true;
}
} catch (Exception e) {
Log.e(TAG, e.toString());
}
}
}
}
没有为 api 19 或 22 找到正确的参数来设置 AudioRecord。在每种情况下都会引发异常。 我对此很感兴趣。我没有考虑使用 MediaRecoder 类,因为我无法直接从重新编码器读取缓冲区,这对于 dtmf 解码过程至关重要。我也看过一些 dtmf 开源解码器,但是都有这个问题
【问题讨论】:
标签: android format call record