Веб-аудио: как я могу получить мобильный микрофон для прослушивания звука с расстояния?

Получение доступа к пользовательскому микрофону через navigator.getUserMedia довольно просто. Но что, если я пользуюсь мобильным браузером и хочу получать аудио с расстояния, например, в режиме "громкой связи"?

Как я могу это сделать? Кажется, есть собственные приложения, которые могут это сделать, но как насчет веб-аудио?

Целью этого является отправка сообщений между устройствами с использованием DTMF. Я уже достиг этого с моим ноутбуком, потому что его микрофон может записывать окружающий звук с большого расстояния, но любой мобильный телефон, к которому у меня есть доступ, кажется, только записывает звук рядом с "мундштуком", и поэтому я должен держать телефон очень близко к источник звука для даже небольшой вероятности получения сообщения. Это побеждает цель, если я не могу заставить мобильный микрофон забрать звук с расстояния.

ИЗМЕНИТЬ: По расстоянию я имею в виду больше нескольких футов, в отличие от простых сантиметров. Звук окружающего звука, в отличие от звука, локализованного рядом с микрофоном.

Ответ 1

Это невозможно сделать, поскольку оно напрямую связано с оборудованием устройства. Если аппаратное устройство (микрофон) не может подбирать звуки с метров, то ничего не может быть сделано.

Ответ 2

Я отвечаю на свой вопрос здесь. Спасибо всем, кто помог, хотя ни один из фактических ответов, размещенных здесь, не был удовлетворительным, ИМО.

В новых версиях Chrome navigator.mediaDevices имеет функцию под названием enumerateDevices, которая может использоваться для отображения доступных аппаратных устройств, включая микрофоны. Как оказалось, это действительно возвращает устройство "громкой связи" на моем телефоне Android. Итак, если у вас есть устройство, в котором вы подозреваете, что громкая связь не установлена ​​в качестве микрофона браузера по умолчанию, а вы (или ваш пользователь) находитесь в Chrome версии 47 или выше, вы можете использовать идентификаторы устройств, возвращаемые enumerateDevices, чтобы указать конкретный микрофон.

Итак, если ваш пользователь выбирает опцию в элементе select для конкретного микрофонного устройства, вы должны взять идентификатор для этого устройства и передать его на getUserMedia.

navigator.getUserMedia({ audio: {deviceId: {exact: <insert device uuid here>}} }, callback)

Обратите внимание, что с этой публикации API enumerateDevices доступен только в Chrome. В любом другом браузере или веб-представлении это, вероятно, не сработает.

Если громкость микрофона оказывается слишком низкой для вашего приложения, вы можете увеличить его, создав gainNode для вашего AudioContext.

volume     = context.createGain()
volume.gain.value = 3 // raises the volume to 300%
audioInput = context.createMediaStreamSource(e)
audioInput.connect(volume)

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

Ответ 3

Два года назад я применил webrtc (используя пример Google), который работает в мобильном веб-браузере, и звук захватывается с уровнями окружения. У меня действительно не был глубокий анализ кода в библиотеках Google, но, возможно, вы можете начать здесь.