Web Audio 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();
请注意,we should be able to call the MediaStream()
构造函数仅包含 VideoStreamTrack
,因此视频无法访问音频流。
但截至目前,似乎只有 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
});
我正在使用 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();
请注意,we should be able to call the MediaStream()
构造函数仅包含 VideoStreamTrack
,因此视频无法访问音频流。
但截至目前,似乎只有 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
});