如何解决webRTC-抑制较低的声音
更新
我找到了一个使用webAudio
here的高通滤波器的示例。在我的代码中像这样实现。
function modifyGain(audioTrack,gainValue){
var ctx = new AudioContext();
var src = ctx.createMediaStreamTrackSource(audioTrack);
var dst = ctx.createMediaStreamDestination();
// create a filter node
var filterNode = ctx.createBiquadFilter();
filterNode.type = 'highpass';
filterNode.frequency.value = 0;
// cutoff frequency: for highpass,audio is attenuated below this frequency
var gainNode = ctx.createGain();
gainNode.gain.value = 1;
src.connect(filterNode);
//filterNode.connect(dst);
filterNode.connect(gainNode);
gainNode.connect(dst);
//alert(ctx.dst)
return dst.stream.getTracks()[0];
}
try {
webcamStream = await navigator.mediaDevices.getUserMedia(mediaConstraints);
document.getElementById("local_video").srcObject = webcamStream;
} catch(err) {
handleGetUserMediaError(err);
return;
}
// Add the tracks from the stream to the RTCPeerConnection
try {
webcamStream.getTracks().forEach(
function (track){
if(track.kind === 'audio'){
track = modifyGain(track,0.5) //process only audio tracks
}
myPeerConnection.addTrack(track,webcamStream);
});
showLocalVideoContainer();
} catch(err) {
handleGetUserMediaError(err);
}
在我可以测试highpass
过滤器是否将低声音静音之前,我面临一个问题。使用modifyGain
会在几秒钟后完全使音频静音。我尝试了0、1500等。几秒钟后它消失了。
原始POST
我正在使用以下约束来尝试抑制噪声。
var mediaConstraints = {
audio: {advanced: [
{
echoCancellation: {exact: true}
},{
autoGainControl: {exact: true}
},{
noiseSuppression: {exact: true}
},{
highpassFilter: {exact: true}
}
]
},video: {
facingMode: "user",width: { min: 160,ideal: 320,max: 640 },height: { min: 120,ideal: 240,max: 480 },}
};
但是我也想使一些高频静音。即使我在某些表面上缓慢移动手机,麦克风也会捕获噪音并将其发送给其他同伴。当我把它放在支票旁边(例如电话)时,它甚至可以捕捉到我的呼吸声音并将其发送到另一侧。我希望对频率进行一些控制,以便可以选择一个阈值,低于该阈值麦克风将无法拾取声音。
我已经尝试过搜索,但是我不确定什么对我的案子有效,我应该怎么做。我认为以下是我的选择,但我可能错了。
- 更改SDP(编解码器参数?)。
- 使用webAudio并处理麦克风输入,然后再将其传递给其他对等端。
- 使用webAudio并处理从其他对等方接收到的音频,并将其定向到输出设备(扬声器)。
任何帮助将不胜感激。 谢谢
解决方法
您可以通过以下方式处理麦克风的音频:通过web audio并使用BiquadFilter:
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
const ctx = new AudioContext();
const src = ctx.createMediaStreamSource(stream);
const dst = ctx.createMediaStreamDestination();
const biquad = ctx.createBiquadFilter();
[src,biquad,dst].reduce((a,b) => a && a.connect(b));
audio.srcObject = dst.stream;
biquad.type = "highpass";
biquad.gain = 25;
biquad.frequency.value = 1000;
rangeButton.oninput = () => biquad.frequency.value = rangeButton.value;
这是工作中的fiddle。
几秒钟后静音。
可能是垃圾回收问题。如果遇到这种情况,请尝试将stream
分配给全局JS变量。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。