繁体   English   中英

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

[英]Web Audio API: Prevent microphone input from being played through speakers

我正在使用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 */ });

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

这将是盲目的尝试,但我非常有信心您所做的一切都隐藏在// Video stuff. 评论是您问题的根源。

何时并且如果确实将流加载到<video>元素中,则要将整个gUM流附加到其src ,视频和音频通道中。

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

所以,如果我的假设是正确的,你只要有视频元素得益于静音它的muted特性。

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

请注意, 我们应该只能使用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
      });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM