Как избежать автоматической регулировки усиления с помощью AudioRecord?

Как я могу делать аудиозаписи, используя android.media.AudioRecord без какой-либо зависящей от смартфона, зависящей от производителя обработки сигналов, такой как автоматическое управление усилением (AGC) и / или выравнивание, подавление шума, эхоподавление, … только чистый микрофонный сигнал?

Задний план

MediaRecorder.AudioSource предоставляет девять констант,

  • DEFAULT и MIC первоначально были там,
  • VOICE_UPLINK , VOICE_DOWNLINK и VOICE_CALL добавлены в уровень API 4,
  • VOICE_RECOGNITION и VOICE_RECOGNITION добавлены в API 7,
  • VOICE_COMMUNICATION добавлен в API 11,
  • REMOTE_SUBMIX добавлен в API 19, но недоступен для сторонних приложений.

Но ни один из них не выполняет чистую работу на всех смартфонах. Скорее, мне нужно самому выяснить, какое устройство использует, какие комбинации блоков обработки сигналов, для которых MediaRecorder.AudioSource постоянна.

Было бы неплохо иметь десятую константу, такую ​​как PURE_MIC добавленная в API 20.

Но пока это не доступно, что я могу сделать вместо этого?

Solutions Collecting From Web of "Как избежать автоматической регулировки усиления с помощью AudioRecord?"

Короткий ответ – «Ничего».

Аудиоисточники соответствуют различным логическим устройствам ввода аудио в зависимости от принадлежностей, которые вы подключили к телефону, и текущего прецедента, который, в свою очередь, соответствует физическим устройствам (основной встроенный микрофон, дополнительный микрофон, микрофон с проводной гарнитурой и т. Д.), С различными настройками.

Каждая такая комбинация физического устройства и настройки настраивается OEM для удовлетворения как внешних требований (например, CTS, требований оператора и т. Д.), Так и внутренних требований к акустике, установленных самим OEM-производителем. Этот процесс может привести к внедрению различных фильтров, таких как AGC, подавление шума, выравнивание и т. Д., В путь аудиовхода на аппаратном кодеке или мультимедийном уровне DSP.

Хотя источник PURE_MIC может быть полезен для некоторых приложений, это не то, что доступно сегодня.
На многих устройствах вы можете управлять такими вещами, как усиление микрофона и, возможно, даже цепочку фильтров, используя amixer для записи в элементы управления ALSA аппаратного кодека. Однако это, очевидно, будет очень подход, основанный на платформе, и я также подозреваю, что вы должны работать как root или аудиопользователь, которым разрешено это делать.

Некоторые устройства добавляют эффект AGC к тракту ввода звука по умолчанию. Поэтому вам нужно получить ссылку на соответствующий объект AudioEffect и заставить его отключить.

Во-первых, получите объект AutomaticGainControl, связанный с аудиозаписью AudioRecord, а затем просто отключите его:

 if (AutomaticGainControl.isAvailable()) { AutomaticGainControl agc = AutomaticGainControl.create( myAudioRecord.getAudioSessionId() ); agc.setEnabled(false); } 

Примечание. Большинство источников звука (включая DEFAULT) применяют обработку аудиосигнала. Для записи необработанного аудио выберите UNPROCESSED. Некоторые устройства не поддерживают необработанный ввод. Сначала вызовите AudioManager.getProperty («PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED»), чтобы убедиться, что он доступен. Если это не так, попробуйте вместо этого использовать VOICE_RECOGNITION, который не использует AGC или подавление шума. Вы можете использовать UNPROCESSED в качестве источника звука, даже если свойство не поддерживается, но нет гарантии, будет ли сигнал необработанным или нет в этом случае.

Документация по Android Ссылка https://developer.android.com/guide/topics/media/mediarecorder.html#example

  AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); if(audioManager.getProperty(AudioManager.PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED) !=null) mRecorder.setAudioSource(MediaRecorder.AudioSource.UNPROCESSED); else mRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_RECOGNITION);