AEC работает только в MediaRecorder
У меня есть приложение, в котором я хочу записать чью-то речь во время телефонного звонка. Когда я использую MediaRecorder
объект с VOICE_COMMUNICATION
на входе эхоподавление работает просто отлично. Тем не менее, когда я использую AudioRecord
, это не работает. Я пробовал выбирать VOICE_COMMUNICATION
в качестве входа для AudioRecord
как и обычно MIC
ввод и ручная установка AEC (AcousticEchoCanceler
) к записи.
ЭТО РАБОТАЕТ:
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION);
recorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
recorder.setAudioEncodingBitRate(16000);
recorder.setAudioSamplingRate(44100);
ЭТО НЕ РАБОТАЕТ:
OutputStream outputStream = new FileOutputStream(filePcm);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
DataOutputStream dataOutputStream = new DataOutputStream(bufferedOutputStream);
int minBufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE_HZ,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
short[] audioData = new short[minBufferSize];
AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
44100,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
minBufferSize);
AcousticEchoCanceler canceler = AcousticEchoCanceler.create(audioRecord.getAudioSessionId());
NoiseSuppressor suppressor = NoiseSuppressor.create(audioRecord.getAudioSessionId());
if (suppressor != null) {
suppressor.setEnabled(true);
}
if (canceler != null) {
canceler.setEnabled(true);
}
audioRecord.startRecording();
while (recording) {
int numberOfShort = audioRecord.read(audioData, 0, minBufferSize);
for (int i = 0; i < numberOfShort; i++) {
dataOutputStream.writeShort(audioData[i]);
}
}
audioRecord.stop();
Кто-нибудь может сказать мне, что я делаю не так?
ОБНОВИТЬ:
Когда я пытаюсь добавить AutomaticGainControl, он говорит:
W/AutomaticGainControl: not enough memory