Запись необработанного микрофонного входа на Android
Я работаю с классом AudioRecord в Android. В моем приложении я хочу измерить звук, захваченный микрофоном гарнитуры без предварительной фильтрации или выравнивания. Я знаю, что для достижения этого результата мне нужно правильно установить источник звука сеанса AudioRecord, но, пробуя мой код на разных устройствах, я получил разные результаты. Например, в Galaxy Note 3 мне удалось записать необработанные данные с микрофона с помощью MediaRecorder.AudioSource.VOICE_RECOGNITION, а с помощью MediaRecorder.AudioSource.MIC я получил отфильтрованные волны. С другой стороны с Galaxy s4 мне пришлось работать наоборот. Где моя ошибка? Есть ли уникальный способ получить доступ к необработанным данным микрофона? Это строка кода, которую я использую для инициализации экземпляра audiorecord:
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, recordBufferSize);
PS: во всех своих попытках я отключил все предварительные настройки звука, доступные на странице настроек. Я пытался также с MediaRecorder.AudioSource.DEFAULT, но это ничего не меняет.
3 ответа
Теперь вы можете использовать MediaRecorder.AudioSource.UNPROCESSED
, Это всегда должно давать необработанный сигнал с микрофона. Помните, что, как отмечает WoodyDev, это поддерживается не всеми устройствами.
См. Android документы для получения дополнительной информации.
OpenSL ES
Чтобы максимально приблизить необработанный звук, я думаю, что спецификация OpenSL ES API в Android NDK - лучший вариант. Google предоставляет пример проекта записи и воспроизведения в реальном времени (с задержкой, чтобы избежать обратной связи).
Именно так была построена базовая реализация AudioRecorder, и это позволяет значительно улучшить оптимизацию обработки аудио. Хотя он использует C++, возможно, стоит знать, особенно если вы планируете реализовать какие-либо другие приложения для обработки аудио в будущем.
MediaRecorder
Как упоминалось ранее, есть возможность установить MediaRecorder.AudioSource
в UNPROCESSED
, Однако, как указано в документации, это поддерживается не на всех устройствах.
True Raw Input
Захватить реальный ввод, который фактически получает аппаратное обеспечение через приложение для Android, очень маловероятно достижимая задача (по крайней мере, кроссплатформенная). И даже если вы заставите его работать на одном устройстве, я был бы удивлен, если бы он работал на нескольких устройствах. На этом уровне вам захочется взглянуть на разработку ОС Android, но затем вы начнете ограничивать себя оборудованием, которое хотите использовать.
Как уже упоминалось в комментариях к вашему вопросу:
Ваша "ошибка" в том, что каждый OEM может реализовать это по-своему. Даже в одной и той же компании могут быть разные команды, работающие над разными моделями, которые делают разные вещи. IIRC, когда я работал в Sony, у нас не было настройки микрофона, в которой не использовались какие-либо эффекты предварительной обработки.
Что, я уверен, верно для большинства производителей.
Используйте AudioFormat.CHANNEL_IN_STEREO, чтобы физически отключить АРУ или шумоподавление (занять микрофон шумоподавления)