Ответ 1
По https://developer.android.com/reference/android/media/audiofx/PresetReverb.html
PresetReverb является вспомогательным эффектом выходного смешения и должен быть создан в сеансе аудио 0. Для того, чтобы MediaPlayer или AudioTrack были включены в этот эффект, они должны быть явно привязаны к нему, и должен быть указан уровень отправки. Используйте идентификатор эффекта, возвращаемый методом getId(), чтобы назначить этот конкретный эффект при подключении его к MediaPlayer или AudioTrack.
Поскольку это предназначено для использования с аудиотреком, это не может быть привязано к AudioRecord. Я думаю, у вас есть аналогичный вывод.
Я предлагаю вам использовать этот SDK https://github.com/superpoweredSDK/Low-Latency-Android-Audio-iOS-Audio-Engine. Он поддерживает андроид и следующие эффекты:
Эффекты: эхо, фленджер, ворота, реверберация, ролл, whoosh, 3-полосный эквалайзер, биквад-IIR-фильтры (low-pass, high-pass, bandpass, high-shelf, low-shelf, параметрический, вырез)
Вы также можете рассмотреть https://github.com/ClearVolume/ClearAudio. Вы можете использовать этот файл для применения эффекта реверберации https://github.com/ClearVolume/ClearAudio/blob/master/src/java/clearaudio/synthesizer/filters/ReverbFilter.java
Все самое лучшее!
Добавление дополнительных сведений о том, как это можно сделать с помощью superpoweredSDK. У сверхмощного SDK есть фильтр под названием SuperpoweredReverb. Как это работает:
Посмотрите на это через некоторый код:
reverb = new SuperpoweredReverb(samplerate);
reverb->enable(true);
reverb->setMix(floatValue); // Limited to >= 0.0f and <= 1.0f.
reverb->setRoomSize(floatValue); // Limited to >= 0.0f and <= 1.0f.
SuperpoweredShortIntToFloat(intBuffer, floatBuffer, numberOfSamples);
bool res = reverb->process(floatBuffer, floatBuffer, numberOfSamples);
SuperpoweredFloatToShortInt(floatBuffer, intBuffer, numberOfSamples);
Позвольте мне попытаться объяснить, что здесь происходит:
Создать фильтр
reverb = new SuperpoweredReverb(samplerate);
reverb->enable(true);
Необязательно: добавьте дополнительные параметры в этот фильтр, например
reverb->setMix(floatValue); // Limited to >= 0.0f and <= 1.0f.
reverb->setRoomSize(floatValue); // Limited to >= 0.0f and <= 1.0f.
Получить исходные образцы; Если образец находится в Integer, используйте SuperpoweredShortIntToFloat
для преобразования. Здесь intBuffer
имеет входные звуковые сэмплы, а numberOfSamples
- количество выборок. floatBuffer
будет содержать буфер с плавающей запятой
SuperpoweredShortIntToFloat(intBuffer, floatBuffer, numberOfSamples);
Процедура вызова для применения эффекта реверберации. Этот метод применит эффект реверберации и снова скопирует результат на floatBuffer.
bool res = reverb->process(floatBuffer, floatBuffer, numberOfSamples);
Чтобы преобразовать его обратно в Int, используйте следующий метод
SuperpoweredFloatToShortInt(floatBuffer, intBuffer, numberOfSamples);
Затем вы можете сохранить этот звуковой образец реверберации в любом месте, где угодно, либо в файле, либо воспроизвести его
Некоторые дополнительные результаты от superpoweredSDK, он также имеет функцию записи. См. http://superpowered.com/docs/class_superpowered_recorder.html
Пример:
recorder = new SuperpoweredRecorder(temporaryPath, samplerate);
recorder->start(destinationPath);
// With input samples
SuperpoweredShortIntToFloat(intBuffer, floatBuffer, numberOfSamples);
bool res = recorder->process(floatBuffer, NULL, numberOfSamples);
SuperpoweredFloatToShortInt(floatBuffer, intBuffer, numberOfSamples);