android 将ReplayGain值转换为音量调整

vybvopom  于 2023-06-28  发布在  Android
关注(0)|答案(3)|浏览(124)

我正在尝试在Android/AOSP音乐播放器应用程序中实现Replay Gain(即响应音乐文件中的replaygain标签)。这只是一个个人项目,但我可以提供它作为一个补丁,或者可能使一个库或播放器我自己。我只是在第一个示例中查看跟踪增益。我的问题的本质可能是因为我数学不及格;)
任务是做两件事:A)在播放开始之前,将音量限制在设备最大-14dB(或者更高,一些消息来源建议-23dB)。B)在开始播放每个音轨之前,读取其标签并按该dB数进行调整。
我看到在Android involves logarithm scaling as well中调整播放音量,但由于我是对数新手,我不确定这是否会使事情更容易或两次(10 x?)一样硬。
有没有人能给予我一点提示,告诉我如何将分贝值转换为MediaPlayer.setVolume()的可用参数?谢谢你的任何提示。
编辑:我有一些(可能不可靠)的Assert,可能会使连接需要,但我迫切需要被告知,如果他们中的任何一个是轻率的。

  1. ReplayGain工作的假设是目标电平为-14 dBFS == 89 dB SPL。因此,我假装这些尺度是等价的所有方式向上和向下(我知道这是不准确的,但 * 如何 * 不准确?)
    1.我将MediaPlayer.setVolume(1.0f,1.0f)(最大音量)视为0 dBFS。
    1.根据公式(1),我将其等于89+14 = 103 dBSPL。
    1.我将MediaPlayer.setVolume(0.0f,0.0f)(静音)作为0 dBSPL处理,因此我有一个抽象的线性音量范围0-103。
    如果这些都成立,我会将Track Gain值-1.3转换为MediaPlayer.setVolume()的适当参数,如下所示:
    1.目标响度= 89 - 1.3 = 87.7
  2. float newVol = 1.0f -(数学.log(103 - 87.7 /数学.log(103))= 0.41143207395167
    这是在正确的轨道上吗?
zhte4eai

zhte4eai1#

  • dBFS代表分贝全声音,因此将其分配给最大级别是完全合理的。
  • 分贝是表示两个值之比(对数)的单位。当使用dBFS与dBSPL是您使用的参考声压。
  • -14 dBFS意味着您使用的声压比参考值小10^(-14/20)倍(即最大可能)
  • 89 dBSPL意味着你使用的值比“空气中常用的参考声压[...] p0 = 20 μPa(RMS)或0.0002达因/cm 2 [5],这通常被认为是人类听觉的阈值(大约是蚊子飞3米远的声音)”大10^(89/20)倍。

所以一旦你在两个鳞片之间找到了一个共同点,它们就会进化成相同的。您基本上定义了两个刻度的参考声压之间的比率,即-14dbFS = 89 dBSPL。
因为乘法尺度是一个麻烦,我们取这些乘法值的对数,然后将它们除以10,这给了我们称为分贝的加法值(额外的2因子来自我们比较声压平方的事实,而不是声压本身)。
最后,如果你考虑到你有一个103 dB的范围,从0.0f到1.0f(这是Android中播放音量的情况),那么-14dBFS就是(103 - 14)/103。
你需要进入对数的数学只有当你想做一个线性尺度出来:线性刻度上最大声音的80%在输出刻度上为1-log(20)/log(100)。

xiozqbni

xiozqbni2#

我也在研究这个问题我想我找到了。
首先要认识到的是,通过调整播放器的音量来放大音频文件是不可能的。你就是不能。体积从0%到100%,就是这样。
你实际上做的是削弱一切。要做到这一点,你需要决定什么样的音量应该是0 dB。也就是说,在不应用衰减或放大的情况下,音频文件的音量应该是多少。
假设您希望0 dB为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)
2ledvvac

2ledvvac3#

如果你去Vanilla Music github,下载zip格式代码,解压并在android studio中打开,他们使用replaygain通过代码搜索,你会找到答案我已经实现了我自己的音乐播放器,我想,我认为可以工作,可能可以,所以你会在那里找到你的答案。

相关问题