【问题标题】:Web Audio API - Automatic Gain Control?Web Audio API - 自动增益控制?
【发布时间】:2021-10-27 19:29:59
【问题描述】:

有没有办法使用 web-audio api 创建自动增益控制?就我而言,我正在构建一个基于 Web 的视频聊天应用程序,它接收多个音频流(人们说话)并播放它们。有没有办法调整他们的相对音量水平,使每个人的响度大致相同?我不希望一个人听起来很安静,而另一个人听起来很响。

GainNodes 似乎非常手动;他们希望您弄清楚 .gain.value 应该是什么。我想我可以通过 analyzerNode 运行每个音轨,计算音量,然后基于此手动调整每个人的个人增益节点,但我想知道是否有更简单的方法来进行自动增益控制?谢谢。

【问题讨论】:

  • 如您所说,使用 AnalyserNodes 实现峰值计将是一个简单的解决方案。

标签: javascript audio-streaming web-audio-api volume


【解决方案1】:

如果您正在制作基于网络的聊天应用程序,当您首先捕获麦克风音频时,实际上很容易处理自动增益控制:

const stream = await navigator.mediaDevices.getUserMedia({
  audio: {
    autoGainControl: true
  },
  video: true
});

(注意autoGainControl其实是默认开启的,不需要手动开启)

但是,如果您仍想减少播放时的动态范围,您需要的是DynamicsCompressorNode。这将缩小响亮和安静部分之间的差异。在该节点之后,您可以添加一个固定的 GainNode 来弥补压缩器中的损失。

您使用的specific compression settings 是一种品味问题,对此存在大量争论。您可以从 2 毫秒的启动时间、10 毫秒的释放时间、3:1 比率、-20 dB 阈值和可能 6 dB 的补偿增益开始,然后从那里进行调整。

【讨论】:

  • 我认为指出autoGainControl 设置的存在非常有用,这可能足以解决@paul-fidika 在实践中的担忧,但我认为他提出的问题略有不同。根据定义,autoGainControl 将在单个输入源(麦克风)的级别上运行。我认为 Paul 试图解决的问题是不同的输入流可能具有不同的音量级别。我怀疑基本 WebAudio API 中没有任何内容,但手动测量输入电平并相应地调整增益并不难。
  • 是的。我还没有尝试过使用 DynamicsCompressorNode,但我可以试一试。我想我要做的是将每个参与者的音频输入连接到 AnalyserNode 和 GainNode,计算它们的相对音量,然后使用它来调整 GainNode 上的 .gain 属性。这样一来,一个人的声音就不会比另一个人大很多。
  • 动态压缩器,将在您不费力的情况下完成完全相同的事情。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 2014-04-01
  • 1970-01-01
  • 2019-10-04
  • 2016-09-16
  • 2014-06-19
相关资源
最近更新 更多