Как читать данные с нескольких микрофонов с помощью Android Oboe/AAudio
Мне интересно получить доступ к обоим микрофонам на телефоне с помощью библиотеки Android Oboe. Большинство телефонов имеют конфигурацию с двумя микрофонами, и я хотел бы считывать данные с обоих одновременно. Я расширил образец "LiveAffect" из Oboe и попробовал следующее:
Наличие двух oboe::AudioStream, по одному для каждого микрофона на моем телефоне (Примечание 9 и Пиксель 1). Запуск только одного из потоков работает нормально, я могу прочитать данные и воспроизвести их / сохранить в файл. Но запуск обоих потоков не работает (я получаю следующую ошибку при попытке запустить второй поток через
stream->requestStart()
: E / AUDIO-APP: Ошибка запуска потока. ErrorInvalidState). Очевидно, что запуск двух входных потоков является ограничением Android, как обсуждалось в этом вопросе SO: Библиотека Android Oboe: возможна запись 2 потоков с 2 записывающих устройств?Имея один поток, но с 2 каналами. Два микрофона на моем Note 9 являются частью одной группы, но когда я открываю поток с любым из них с 2 каналами (
->setChannelCount(oboe::ChannelCount::Stereo);
), Я получаю дубликаты данных в обоих каналах только для одного микрофона. Я пытался поиграть сAudioStreamBuilder
настройки, например настройки->setInputPreset(oboe::InputPreset::Camcorder)
, Ни один изInputPresets
в настройках это исправлено, по-прежнему зеркально отражаются данные в обоих каналах.
Обе попытки не работали с использованием OpenSL.
1 ответ
Я вполне уверен, что это проблема с этим конкретным устройством. Пользователь сообщил об идентичной проблеме на форуме JUCE здесь. Я подал ошибку внутренне (id: 133143785) и попытаюсь направить ее в Samsung для дальнейшего расследования.
Единственный способ получить стереовход обоих микрофонов (AAUDIO или SLES) на Samsung S8 - это установить:
builder->setDeviceId(0) // mandatory ! if set to the microphone id you get only one mic!
builder->setDirection(oboe::Direction::Input) // obvious
builder->setChannelCount(2) // obvious
builder->setFormat(oboe::AudioFormat::I16) // with oboe converter float should work to
builder->setInputPreset(oboe::InputPreset::Generic) // or oboe::InputPreset::Camcorder
builder->setUsage(oboe::Usage::Media) // unsure if this is ness.
Я заметил странную вещь: androids AudioManager.getDevices (AudioManager.GET_DEVICES_ALL) на этом устройстве возвращает другой список после того, как вы использовали аудио в моно ( 2 x TYPE_BUILTIN_MIC) или стерео ( 1x TYPE_BUILTIN_MIC), все с AudioDeviceInfo.getChannelCounts,2]!