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

标签 javascript ios html audio volume

我们观察到,在浏览器中使用基于 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/

相关文章:

ios - SVProgressHud 环形/前景色 IOS

ios - 设置或删除react-native init引入的UIViewControllerBasedStatusBarAppearance键

iphone - 在两个静态文本之间进行选择

html - ul 在 table 上移动

html - Safari 框架隐形滚动条

javascript - Angular 下拉列表不显示第一个值

javascript - 如何通过模拟选择器和/或 redux 存储来编写 Redux Saga 测试

html - html 页面上的按钮不会打开到单独的页面

javascript - 将内容添加到列表时保持滚动位置 (AngularJS)

javascript - 部署时 AngularJS 应用程序未获取数据