5

我正在尝试在股票 Android/AOSP 音乐播放器应用程序中实现重播增益(即响应音乐文件中的重播增益标签)。这只是一个个人项目,但我可以将其作为补丁提供,或者制作我自己的库或播放器。我只在第一个实例中查看 Track Gain。我的问题的性质可能归结于我数学不及格的事实;)

任务是做两件事: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) (mute) 视为 0dBSPL,因此我有一个 0-103 的抽象线性音量刻度。

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

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

这是在正确的轨道上吗?

4

2 回答 2

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

所以一旦你在两个尺度之间找到了一个共同点,它们就会进化成相同的。您基本上定义了两个音阶的参考声压之间的比率,即 -14dbFS = 89 dBSPL。

因为乘法尺度很麻烦,我们取这些乘法值的对数,然后除以 10,得到称为分贝的加法值(额外的 2 因子来自我们比较声压的平方,而不是声压的事实他们自己)。

现在最后,如果您认为您有一个 103 dB 的范围,从 0.0f 到 1.0f 以对数方式映射(就像您的 dB 一样)(这是 Android 中播放音量的接缝),那么 -14dBFS 是( 103 - 14)/103。

仅当您想从中得出线性比例时,您才需要进入对数的数学:线性比例上最大声音的 80% 将是输出比例上的 1-log(20)/log(100)。

于 2014-11-28T02:01:10.250 回答
2

我正在研究同样的问题,我想我明白了。

首先要意识到的是,无法通过调整播放器的音量来放大音频文件。你根本做不到。音量从 0% 变为 100%,仅此而已。

你实际上做的是衰减一切。为此,您需要决定音量应为 0dB。也就是说,没有应用衰减或放大的音频文件的音量应该是多少。

假设您希望 0dB 为 60%。这将是你的“基地”。

知道了vol% = 100 * 10 ^ (db / 20) - base,我们就可以计算出我们的公式来获得给定 dB 值的音量:

vol% = 100 * 10 ^ (REPLAYGAIN_TRACK_GAIN / 20) - 60

您可能还想知道您的 dB 范围是多少。我们可以通过从上面的公式中分离db变量来做到这一点:

db = 20 * Log(vol% + base) / (Log(2) + Log(5)) - 40

将音量和基础值代入前一个公式,我们将得到 0% 音量(静音)对应于 -4.44dB,100%(最大音量)对应于 +4.02dB。

这很有帮助,因为您需要知道公式能够处理的 dB 值。出于同样的原因,您将需要调整vol%公式,使其“剪裁”超出您支持范围的 dB 值:

vol% = Min(100, Max(0, 100 * 10 ^ (REPLAYGAIN_TRACK_GAIN / 20) - 60)
于 2017-03-22T22:47:03.990 回答