Web Audio API:防止麦克风输入通过扬声器播放

时间:2016-01-08 22:19:04

标签: javascript html5 web-audio recorder.js

我正在使用Recorder.JS在HTML应用中录制音频。总的来说,这种方法很好,除了麦克风输入通过扬声器回声(如果我不使用耳机就会产生回声)。

我发现的各种帖子都说这是因为输入连接到AudioContext目的地 - 但对我的情况来说并非如此。

此外,如果我运行Recorder.JS示例,我没有得到任何这样的回声(相同的机器,相同的浏览器),即使代码是相同的,据我所知:

// At the top of the script:
var recorder = null;

// in DOMContentLoaded:
navigator.getUserMedia({ video: true, audio: true }, function(stream) {
    // Video stuff.
    var audioContext = new AudioContext();
    var microphone = audioContext.createMediaStreamSource(stream);
    recorder = new Recorder(microphone, { numChannels: 1, sampleRate: 16000 });
}, onError);

// In start button handler:
recorder.record();

// And in the stop button handler:
recorder.stop();
recorder.exportWAV(function(audio) { /* omited */ });

真的很奇怪,我认为完全相同的代码有这种不同的行为 - 欣赏任何指针。

1 个答案:

答案 0 :(得分:2)

这将是一个盲目的尝试,但我非常有信心,你在// Video stuff.评论中隐藏的内容是你问题的根源。

当您将流加载到<video>元素时,您将整个gUM流附加到其src视频和音频频道。

因此,当您play()视频流时,也会播放音频流。

因此,如果我的假设是正确的,您只需要静音视频元素,这要归功于其muted属性。

video.src = URL.createObjectURL(stream);
video.muted = true;
video.play();

请注意we should be able仅使用VideoStreamTrack调用MediaStream()构造函数,以便视频无法访问音频流。

但截至今天,只有Firefox似乎支持它。

navigator.mediaDevices.getUserMedia({ video: true, audio: true })
    .then(function(stream) {
        var videoStream = stream.getVideoTracks()[0];
        var mediaStream = new MediaStream([videoStream]) ;
        v.src = URL.createObjectURL(mediaStream);
        v.play();
        // audio stuff
      });