将 ReplayGain 值转换为音量调整

Hea*_*ank 5 math android logarithm acoustics replaygain

我正在尝试将 Replay Gain(即响应音乐文件中的 replaygain 标签)实现到库存的 Android/AOSP 音乐播放器应用程序中。这只是一个个人项目,但我可以将它作为补丁提供,或者制作我自己的库或播放器。我首先只关注轨道增益。我的问题的性质可能归结于我数学不及格的事实;)

任务是做两件事:A) 在播放开始之前,将音量限制在设备最大 -14dB(或者更多,一些消息来源建议 -23dB)。B) 在开始播放每首曲目之前,读取其标签并按该 dB 数进行调整。

我看到在 Android 中调整播放音量也涉及对数缩放,但由于我是对数的新手,我不确定这是否会使事情变得更容易或两倍(10 倍?)困难。

任何人都可以给我一些关于如何将分贝值转换为 MediaPlayer.setVolume() 可用参数的线索吗?感谢您提供任何提示。

编辑:我有一些(可能是不稳定的)断言可能需要建立连接,但我非常需要被告知他们中的任何一个是否愚蠢。

  1. ReplayGain 假设目标电平为 -14 dBFS == 89dB SPL。因此,我假装这些尺度在上下左右都是等价的(我知道这是不准确的,但有多不准确?)
  2. 我将 MediaPlayer.setVolume(1.0f,1.0f)(最大音量)视为 0dBFS。
  3. 基于 (1),我将其等同于 89+14 = 103dBSPL。
  4. 我将 MediaPlayer.setVolume(0.0f,0.0f)(静音)视为 0dBSPL,所以我有一个 0-103 的抽象线性音量标度。

如果这些都成立,我会将 -1.3 的 Track Gain 值转换为 MediaPlayer.setVolume() 的适当参数,如下所示:

  1. 目标响度 = 89 - 1.3 = 87.7
  2. 浮动新卷 = 1.0f - (Math.log(103 - 87.7 / Math.log(103)) = 0.41143207395167

这是远程在正确的轨道上吗?

Cim*_*ali 2

    \n
  • dBFS 代表分贝全声,因此将其分配到最大级别是完全明智的。
  • \n
  • 分贝是表示两个值之比(的对数)的单位。当使用 dBFS 与 dBSPL 时,您所说的只是您使用哪个参考声压。\n
      \n
    • -14 dBFS 意味着您使用的声压比参考值小 10^(-14/20) 倍(即最大可能值)
    • \n
    • 89 dBSPL 意味着您使用的值比“空气中常用的参考声压 [...] p0 = 20 \xce\xbcPa (RMS) 或 0.0002 dynes/cm2 大 10^(89/20) 倍,[5 ] 通常被认为是人类听觉的阈值(大约是 3 m 外蚊子飞翔的声音)。” (来自维基百科)。
    • \n
  • \n
\n\n

因此,一旦你在两个量表之间找到了共同点,它们就会以相同的方式发展。您基本上通过说 -14dbFS = 89 dBSPL 定义了两个音阶的参考声压之间的比率。

\n\n

因为乘法尺度很麻烦,所以我们取这些乘法值的对数,并将它们除以 10,这给出了称为分贝的加法值(额外的 2 因子来自于我们比较声压的平方,而不是声压)他们自己)。

\n\n

最后,如果您认为您的 103 dB 范围以对数方式映射(您的 dB 也是如此),从 0.0f 到 1.0f(这就是 Android 中播放音量的情况),那么 -14dBFS 就是( 103 - 14)/103。

\n\n

仅当您想以此为线性标度时,才需要进行对数数学运算:线性标度上最大声音的 80% 在输出上将为 1-log(20)/log(100)规模。

\n