使用HTML5 / javascript更正audio音量输出分贝,closures预处理

我们观察到,使用基于JavaScript的浏览器audio,输出电平在许多系统上与input信号电平不成正比的线性关系。 例如,如果“演奏”幅度变化20dB的两个正弦波,那么由不同设备/设置所产生的差异可能明显不同于20dB,例如远远低于10dB。 我们需要输出简单的audio信号(例如正弦波),以相对于彼此的校准分贝电平,例如在一个音量处放出一个正弦波,然后放出另一个比第一个低20dB的正弦波,他们实际上是这样出来的。 我们希望通过使用HTML5 / javascript的浏览器来实现。
我们已经尝试了几种方法来实现这一点,例如使用预先创build的校准.mp3文件,直接使用Web Audio API生成具有校准的dB级别的振荡器。 我们已经(对我们)非常惊讶,基本上不正确的结果。 当我们使用一个校准过的麦克风测量了设备发出的声音时,发现了各种奇怪的事情,表明audio不是以线性方式“播放”,而是在其上进行复杂的预处理在它实际获得输出之前。 这似乎取决于目前我们无法控制的各种variables。 它不能像“普通”audio放大器那样工作,也就是说,无论绝对电平如何设定,20dB的大声input都会产生20dB的大声输出。 我们发现,使用相同的JavaScript代码会产生非常不同的结果,具体取决于各种variables,包括硬件(例如,Mac和iPhone上的浏览),所选的音量设置(即使相对值为20dB,相差20dB当音量在1/2)时,如果使用耳机等。

在进一步的testing中,似乎主要的问题与使用外部扬声器有关。 使用耳机时,效果会更好。

基本的问题是,如果你创build两个不同的信号,如已知的音量差异,例如20dB,并将它们以几种方式中的任何一种,那么测得的差异通常不会是20dB,在某些情况下可能不如10dB。

有没有办法以编程方式做到这一点?

有没有办法来覆盖任何预处理或音量压缩似乎是调整音量(导致输出不正确的input成正比)?

我们需要一种方法来实现跨平台(桌面,iOS,Android,不同的浏览器,不同的耳机/扬声器),因此使用HTML5。

如果使用HTML5无法做到这一点,我们如何使用本机iOS / Android代码来做到这一点? 这似乎是一个比软件问题更硬件,但也许有办法来覆盖它。

谢谢

我们通过进一步的研究来回答这个问题。 经过详细testing,以下内容已经变得清晰:1)在所有testing过的系统中,无论其他设置如何,在使用耳机时,声音幅度输出几乎与1:1线性相关。 在多种浏览器,多种设备,iOS,Android,OSX,多个供电和未供电的耳塞和耳塞式耳机中,情况都是如此。 2)在许多系统/设置/音量级别中,当使用外部扬声器时,声音幅度输出与input不是1:1线性相关。 相反,声音通常是线性的,斜率小于1,通常要小得多(例如1/2)。 除了这个斜率之外,许多系统也在较高的音量水平上饱和。 这似乎是因为补偿机制正在与外部扬声器一起使用。

因此,正确答案是:只要使用耳机,使用HTML5 / javascriptaudio生成的audio输出幅度几乎为1:1线性与input。 当外部扬声器被用于许多常用设备时,它与input的线性关系不是1:1。