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

0 ответов

Другие вопросы по тегам