navigator.getUserMedia()录音 - 如何设置麦克风的音量输入电平?

时间:2014-02-05 10:16:34

标签: javascript html5 audio volume

可以在某些现代浏览器中使用navigator.getUserMedia(....)调用来在Javascript中录制音频。

有没有办法调整/设置麦克风的输入音量?

此设置并非总是最佳。有时麦克风设置为仅以非常低的输入音量进行录制。当然,用户可以手动调整系统中的输入音量级别,但我的大多数用户可能缺乏这样做的知识。因此,我最好能够在通过“navigator.getUserMedia(....)”方式记录数据的JavaScript应用程序内动态调整麦克风音量?

是否有解决方案来影响麦克风的输入音量?

1 个答案:

答案 0 :(得分:8)

Web Audio API可让您更改流的麦克风输入。

以下是一个示例,其中显示了如何将MediaStream转换为另一个MediaStream,但能够动态更改音量。如果您只想播放音频,则可以将gainNode.connect(dest)更改为gainNode.connect(ctx.destination)并删除使用dest变量的其他两行。

if (!navigator.getUserMedia) {
    navigator.getUserMedia = navigator.webkitGetUserMedia ||
        navigator.mozGetUserMedia;
}
navigator.getUserMedia({
    audio: true
}, function(stream) {
    var ctx = new AudioContext();
    var source = ctx.createMediaStreamSource(stream);
    var dest = ctx.createMediaStreamDestination();
    var gainNode = ctx.createGain();

    source.connect(gainNode);
    gainNode.connect(dest);
    document.getElementById('volume').onchange = function() {
        gainNode.gain.value = this.value; // Any number between 0 and 1.
    };
    gainNode.gain.value = document.getElementById('volume').value;
    
    // Example: play the audio
    // Or if you use WebRTC, use peerConnection.addStream(dest.stream);
    new Audio(URL.createObjectURL(dest.stream)).play();

    // Store the source and destination in a global variable
    // to avoid losing the audio to garbage collection.
    window.leakMyAudioNodes = [source, dest];
}, function(e) {
    alert(e); // TODO: Handle error.
});

// For the demo only:
document.getElementById('volume').onchange = function() {
    alert('Please provide access to the microhone before using this.');
};
Volume: <input type=range id=volume min=0 max=1 value=1 step=0.01>

注意:通过Stack片段的实时演示在Chrome中不起作用,因为getUserMedia似乎对沙盒框架不起作用。如果您使用Chrome,请尝试使用以下代码段进行摘要:https://robwu.nl/s/mediasource-change-volume.html