我们观察到,在浏览器中使用基于 javascript 的音频时,在许多系统上,输出电平与输入信号电平不正确地成线性比例。例如,如果您“播放”两个幅度变化为 20dB 的正弦波,则不同设备/设置的结果差异可能与 20dB 明显不同,例如远达 10dB 或更小。
我们需要以相对于彼此的校准分贝水平输出简单的音频信号(例如 sin 波),例如以一个音量输出一个 sin 波,然后输出比第一个小 20dB 的另一个 sin 波,并且有他们实际上是那样出来的。
我们希望使用 HTML5/javascript 从浏览器执行此操作。
我们尝试以多种方式做到这一点,例如使用预先创建的校准 .mp3 文件,直接使用 Web Audio API 生成具有校准 dB 电平的振荡器。我们得到了(对我们来说)非常令人惊讶且基本上不正确的结果。
当我们使用经过校准的麦克风测量从设备发出的声音时,会观察到各种奇怪的事情,这表明音频不仅以线性方式“播放”,而且正在对其进行复杂的预处理在它真正得到输出之前。这似乎取决于目前我们无法控制的各种变量。它的工作方式与“普通”音频放大器的工作方式不同,即无论绝对电平设置为 20dB 大声输入会产生 20dB 大声输出。
我们发现使用相同的 javascript 代码会产生非常不同的结果,具体取决于各种变量,包括硬件(例如,在 Mac 和 iPhone 上浏览)、选择的音量设置(即使是相对值也没有不同当音量为 1/2 时,输入差异为 20dB,增加 20dB),如果使用耳机等。
在进一步测试中,主要问题似乎与外部扬声器的使用有关。使用耳机时,效果看起来好得多。
基本问题是,如果您创建两个具有已知音量差异(例如 20dB)的不同信号,并以多种方式中的任何一种将它们都输出,则测得的差异通常不会是 20dB,并且在某些情况下同样糟糕为 10dB。
有什么方法可以通过编程方式做到这一点吗?
有没有办法覆盖似乎正在调整音量的任何预处理或音频音量压缩(导致输出与输入不正确成比例)?
我们需要一种跨平台(桌面、iOS、Android、不同的浏览器、不同的耳机/扬声器)工作的方法,因此需要使用 HTML5。
如果无法使用 HTML5 执行此操作,我们如何使用 native iOS/Android 代码执行此操作?这似乎更像是硬件问题而不是软件问题,但也许有办法解决它。
谢谢
最佳答案
我们通过重要的进一步研究回答了这个问题。 经过详细测试,以下内容变得清晰: 1) 在所有测试的系统中,无论其他设置如何,使用耳机时,声音幅度输出几乎与输入呈 1:1 线性相关。在多个浏览器、多个设备、iOS、Android、OSX、多个有源和无源耳塞和耳罩式耳机上都是如此。 2) 在许多系统/设置/音量级别中,当使用外部扬声器时,声音幅度输出与输入不是 1:1 线性相关。相反,声音通常是线性的,斜率小于 1,通常要小得多(例如 1/2)。除了这个斜率之外,许多系统还会在较高的音量水平下饱和。这似乎是因为补偿机制正在与外部扬声器一起使用。
因此,正确答案是:只要使用耳机,使用 HTML5/javascript 音频生成的音频输出振幅与输入几乎为 1:1 线性。当在许多常用设备上使用外部扬声器时,它与输入的线性比接近 1:1。
关于javascript - 使用 HTML5/javascript 校正音频音量输出分贝,关闭预处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27595753/