如何增加 webrtc 中的麦克风增益
How to increase mic gain in webrtc
我有 webrtc 应用程序 运行 android phone(对于护士)和平板电脑(对于患者)。基本上我已经实现了一个远程助理系统,护士可以通过该系统进行 webrtc 呼叫并听到(仅音频流)患者方面发生了什么。由于平板电脑安装在墙上,与病床的距离通常很小。我想增加 webrtc/android 一侧的麦克风增益,这样我什至可以听到低音量的声音。我试图在 google 上找到线索,但找不到任何有趣的东西。谁能告诉我如何提高 microphone 灵敏度?
------------------------示例代码-------------------- --
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"
id和label对播放流重要吗?
不知道实际的硬件mic是否可以控制,但是可以通过WebAudio处理来增加输入信号的增益。
试试这个(在 Chrome 中使用 https fiddle):
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) 也有 您可以尝试打开。
我有 webrtc 应用程序 运行 android phone(对于护士)和平板电脑(对于患者)。基本上我已经实现了一个远程助理系统,护士可以通过该系统进行 webrtc 呼叫并听到(仅音频流)患者方面发生了什么。由于平板电脑安装在墙上,与病床的距离通常很小。我想增加 webrtc/android 一侧的麦克风增益,这样我什至可以听到低音量的声音。我试图在 google 上找到线索,但找不到任何有趣的东西。谁能告诉我如何提高 microphone 灵敏度?
------------------------示例代码-------------------- --
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"
id和label对播放流重要吗?
不知道实际的硬件mic是否可以控制,但是可以通过WebAudio处理来增加输入信号的增益。
试试这个(在 Chrome 中使用 https fiddle):
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) 也有