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