Ответ 1
Это невозможно сделать, поскольку оно напрямую связано с оборудованием устройства. Если аппаратное устройство (микрофон) не может подбирать звуки с метров, то ничего не может быть сделано.
Получение доступа к пользовательскому микрофону через navigator.getUserMedia
довольно просто. Но что, если я пользуюсь мобильным браузером и хочу получать аудио с расстояния, например, в режиме "громкой связи"?
Как я могу это сделать? Кажется, есть собственные приложения, которые могут это сделать, но как насчет веб-аудио?
Целью этого является отправка сообщений между устройствами с использованием DTMF. Я уже достиг этого с моим ноутбуком, потому что его микрофон может записывать окружающий звук с большого расстояния, но любой мобильный телефон, к которому у меня есть доступ, кажется, только записывает звук рядом с "мундштуком", и поэтому я должен держать телефон очень близко к источник звука для даже небольшой вероятности получения сообщения. Это побеждает цель, если я не могу заставить мобильный микрофон забрать звук с расстояния.
ИЗМЕНИТЬ: По расстоянию я имею в виду больше нескольких футов, в отличие от простых сантиметров. Звук окружающего звука, в отличие от звука, локализованного рядом с микрофоном.
Это невозможно сделать, поскольку оно напрямую связано с оборудованием устройства. Если аппаратное устройство (микрофон) не может подбирать звуки с метров, то ничего не может быть сделано.
Я отвечаю на свой вопрос здесь. Спасибо всем, кто помог, хотя ни один из фактических ответов, размещенных здесь, не был удовлетворительным, ИМО.
В новых версиях 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)
Или, если вы имеете дело с необработанными образцами, вы можете буквально умножить каждый образец на число, прежде чем передавать их любой функции, которую вы используете для их обработки.
Два года назад я применил webrtc (используя пример Google), который работает в мобильном веб-браузере, и звук захватывается с уровнями окружения. У меня действительно не был глубокий анализ кода в библиотеках Google, но, возможно, вы можете начать здесь.