繁体   English   中英

使用 HTML5 / javascript 校正音频音量输出分贝,关闭预处理

[英]Correct audio volume output decibels using HTML5 / javascript, turn off pre-processing

我们已经观察到,在浏览器中使用基于 javascript 的音频时,在许多系统上,输出电平与输入信号电平的线性比例不正确。 例如,如果您“播放”两个幅度变化为 20dB 的正弦波,则不同设备/设置所产生的差异可能与 20dB 有显着差异,例如相差 10dB 或更小。 我们需要以相对于彼此的校准分贝级别输出简单的音频信号(例如正弦波),例如以一个音量输出一个正弦波,然后输出比第一个安静 20dB 的另一个正弦波,并且有他们实际上是那样出来的。 我们想从使用 HTML5/javascript 的浏览器中执行此操作。
我们已经尝试通过多种方式实现这一点,例如使用预先创建的、校准过的 .mp3 文件,直接使用 Web Audio API 来生成具有校准 dB 级别的振荡器。 我们得到了(对我们来说)非常令人惊讶且基本上不正确的结果。 当我们使用校准过的麦克风测量从设备发出的声音时,观察到了各种奇怪的现象,这表明音频不仅以线性方式“播放”,而且正在对其进行复杂的预处理在它真正得到输出之前。 这似乎取决于目前我们无法控制的各种变量。 它不像“正常”音频放大器的工作方式那样工作,即无论绝对电平设置为什么,20dB 的大输入会产生 20dB 大的输出。 我们发现使用相同的 javascript 代码会产生非常不同的结果,这取决于各种变量,包括硬件(例如,在 Mac 上浏览与 iPhone 上的浏览​​)、选择的音量设置(即使对于 20dB 的输入差异,相对值也不会相差 20dB当音量为 1/2 时),如果使用耳机等。

在进一步的测试中,似乎主要问题与使用外部扬声器有关。 使用耳机时,效果看起来好得多。

基本问题是,如果您创建两个具有已知音量差异(例如 20dB)的不同信号,并将它们以多种方式中的任何一种输出,则测得的差异通常不会是 20dB,在某些情况下甚至会达到 10dB。

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

有没有办法覆盖任何预处理或音频音量压缩似乎正在调整音量(导致输出与输入不正确成比例)?

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

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

谢谢

我们已经通过重要的进一步研究回答了这个问题。 经过详细测试,以下内容变得清晰: 1) 在所有测试的系统上,无论其他设置如何,在使用耳机时,声音幅度输出几乎完美地与输入呈 1:1 线性关系。 这适用于多个浏览器、多个设备、iOS、Android、OSX、多个有源和无源耳塞和耳罩式耳机。 2) 在许多系统/设置/音量级别中,当使用外部扬声器时,声音幅度输出与输入不是 1:1 线性相关的。 相反,声音通常是线性的,斜率小于 1,通常显着更小(例如 1/2)。 除了这个斜率之外,许多系统也会在更高的音量水平下饱和。 这似乎是因为外部扬声器正在使用补偿机制。

因此,正确答案是:只要使用耳机,HTML5/javascript 音频生成的音频输出幅度与输入的线性关系就接近 1:1。 当在许多常用设备上使用外部扬声器时,它不是接近 1:1 的线性与输入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM