2016-08-10 1 views
1

У меня есть приложение webrtc, которое работает на Android-телефоне (для медсестер) и планшете (для пациентов). В основном у меня есть система удаленного помощника, благодаря которой медсестры могут звонить и слышать (только аудиопоток), что происходит на стороне пациента. Поскольку планшеты установлены на стене, а кровать пациента обычно немного на расстоянии. Я хочу увеличить усиление микрофона либо в сторону webrtc/android, чтобы я мог слышать даже низкий уровень звука. Я пытаюсь найти ключ к Google, но не могу найти что-либо интересное. Может ли кто-нибудь дать мне подсказку, как увеличить чувствительность микрофона?Как увеличить усиление микрофона в webrtc

------------------------ Пример кода -------------------- -

function getLocalStream(successCallback) { 
    if (localStream && successCallback) { 
     successCallback(localStream); 
     return; 
    } 
    navigator.getUserMedia(streamOptions, function (str) { 
     var stream= modifyGain(str); 

     uiHandler("peer.call.localstream", {payload: stream}); 
     localStream = stream; 
     if (successCallback) { 
      successCallback(stream); 
     } 
    }, function (err) { 
     uiHandler("status.error", {payload: "Failed to access local camera", error: err}); 
    }); 
} 

function modifyGain (stream){ 
    var audioTrack = stream.getAudioTracks()[0]; 
    var ctx = new AudioContext(); 
    var src = ctx.createMediaStreamSource(stream); 
    var dst = ctx.createMediaStreamDestination(); 
    var gainNode = ctx.createGain(); 
    gainNode.gain.value = 50; 
    [src, gainNode, dst].reduce(function(a, b) { return a && a.connect(b) }); 
    stream.removeTrack(audioTrack); 
    var newAudioTrack = dst.stream.getAudioTracks()[0]; 

    stream.addTrack(newAudioTrack); 
    return stream; 
}; 

в отлаживать я нашел разницу в предыдущей и новой звуковой дорожке: Это оригинальный звуковой трек, который я получаю от localstream:

enabled: true 
id: "8e4363c2-f1c8-44ec-9bed-f3414f3b943a" 
kind: "audio" 
label: "Default" 
muted: false 
onended: null 
onmute: null 
onunmute: null 
readyState: "live" 

Это новый аудио трек, который получает DST .stream.getAudioTracks() [0];

enabled: true 
id: "cc0c4293-a606-407e-9adb-4caddaa32583" 
kind: "audio" 
label: "MediaStreamAudioDestinationNode" 
muted: false 
onended: null 
onmute: null 
onunmute: null 
readyState: "live" 

Есть ли идентификатор и этикетка для воспроизведения потока?

+0

Невозможно управлять фактическим аппаратным микрофоном, но вы можете увеличить коэффициент усиления входного сигнала путем [обработки его в webaudio] (http://stackoverflow.com/a/35000726/918910). Некоторые браузеры также имеют [autoGainControl] (http://stackoverflow.com/a/37332145/918910), которые вы можете попробовать включить. Единственный трюк мог бы вернуть треки в потоки в Chrome, который не поддерживает отслеживание манипуляций AFAIK. – jib

+0

Можно ли использовать что-то другое вместо использования MediaStream? в основном я пытаюсь использовать это на мобильном телефоне через плагин corodova, а версия chrome в настоящее время показывает 44, которые не поддерживают MediaStream. Так что получение Uncaught ReferenceError: MediaStream не определяется онлайн var src = ctx.createMediaStreamSource (новый MediaStream ([audioTrack])); –

+0

Вы только аудио, поэтому я думаю, что вы можете пропустить шаг разделения и сдачи назад. Попробуйте 'ctx.createMediaStreamSource (поток)', а затем 'ctx.createMediaStreamDestination()' возвращает медиапоток, который вы можете использовать напрямую, я бы подумал. – jib

ответ

0

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

Попробуйте это (использование https fiddle в Chrome):

navigator.mediaDevices.getUserMedia({audio: true}) 
 
    .then(stream => audio.srcObject = modifyGain(stream, 2.5)) 
 
    .catch(e => console.log(e)); 
 

 
var modifyGain = (stream, gainValue) => { 
 
    var ctx = new AudioContext(); 
 
    var src = ctx.createMediaStreamSource(stream); 
 
    var dst = ctx.createMediaStreamDestination(); 
 
    var gainNode = ctx.createGain(); 
 
    gainNode.gain.value = gainValue; 
 
    [src, gainNode, dst].reduce((a, b) => a && a.connect(b)); 
 
    return dst.stream; 
 
};
<audio id="audio" controls autoplay></audio>

Некоторые браузеры (Firefox) также имеют mozAutoGainControl вы можете попробовать включения.

+0

Я обновил свой вопрос Можете ли вы рассказать мне, почему я не получаю звук, если я вызываю метод modifyGain? –

+0

[Wfm] (https://jsfiddle.net/jib1/z9gybrz3/). Попытайтесь изолировать проблему, проверяя, работает ли она локально сначала. – jib

+0

Я тестировал это в своем локальном браузере, и он отлично работает, но, к сожалению, эта функция не является частью старого браузера (chrome version 43), так что он не работает над плагином cordova на устройствах Android. Мне нужно подождать, когда они обновят версию chrome в кордовом API. –