WebRTC - 禁用所有音频处理
Posted
技术标签:
【中文标题】WebRTC - 禁用所有音频处理【英文标题】:WebRTC - disable all audio processing 【发布时间】:2015-07-08 07:22:09 【问题描述】:我目前正在尝试通过 webrtc 获得尽可能干净的音频通道。通过 getUserMedia mediaconstraints 对象,我设置了以下选项:
constraints:
audio:
mandatory:
echoCancellation: false,
googEchoCancellation: false,
googAutoGainControl: false,
googAutoGainControl2: false,
googNoiseSuppression: false,
googHighpassFilter: false,
googTypingNoiseDetection: false,
//googAudioMirroring: false // For some reason setting googAudioMirroring causes a navigator.getUserMedia error: NavigatorUserMediaError
,
video: false
,
这大大提高了音频质量,但似乎仍然存在音频处理,这会导致某些测试样本以高频噪声的形式破坏音频。
有一个 Chrome 标志 --use-file-for-fake-audio-capture
如http://peter.sh/experiments/chromium-command-line-switches/#use-file-for-fake-audio-capture 所述,它允许通过文件输入进行测试。如标志描述中所述,必须禁用所有音频处理,否则音频将失真 - 因此似乎有其他选项可用于此目的。
我也尝试了--disable-audio-track-processing --audio-buffer-size=16 --enable-exclusive-audio
Chrome 标志,但似乎仍然有一些音频处理。
有什么方法可以禁用仍然存在的音频处理(最好通过 JS API)?
【问题讨论】:
这是发生在本地还是在对等连接中? Chrome 可能正在为 Opus 动态更改比特率(只有在您在连接中注意到这一点时才会出现这种情况)。 通过对等连接。我认为这是某种语音音频优化。总是在样本播放 x 时间后开始播放。 我读了它,所以我可以肯定地说比特率是根据可用带宽调整的。 您找到解决方案了吗?我使用 PCMU 作为编解码器,传递这些约束不会删除处理或回声消除 当心这个未解决的问题bugs.chromium.org/p/webrtc/issues/detail?id=5758 【参考方案1】:我敢打赌,opus 编解码器的可变比特率(默认)行为会导致一些压缩或调整。您可以手动修改 SDP 报价以使用 CBR(恒定比特率)而不是 VBR(可变比特率)。当你从浏览器获得 SDP 报价时,换行:
a=fmtp:111 minptime=10; useinbandfec=1
到:
a=fmtp:111 minptime=10; cbr=1
请注意,我同时添加 cbr=1
和删除 useinbandfec=1
。我不肯定删除 useinbandfec
是必要的,但似乎带内 FEC(转发纠错)会导致您也希望避免的压缩调整。
【讨论】:
【参考方案2】:这是禁用音频处理并获得干净信号的更新方法:
navigator.mediaDevices.getUserMedia(
audio:
autoGainControl: false,
channelCount: 2,
echoCancellation: false,
latency: 0,
noiseSuppression: false,
sampleRate: 48000,
sampleSize: 16,
volume: 1.0
);
如果您通过 WebRTC 流式传输音频,则默认为针对语音优化的无线电或电话质量音频。因此,请确保您的 SDP 具有 stereo
和 maxaveragebitrate
参数:
a=fmtp:111 minptime=10;useinbandfec=1; stereo=1; maxaveragebitrate=510000
【讨论】:
以上是关于WebRTC - 禁用所有音频处理的主要内容,如果未能解决你的问题,请参考以下文章
WebRTC Native M96中的基本音频处理操作(AudioStateAudioProcessingAudioMixer)