首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ReplayGain值转换为卷调整

将ReplayGain值转换为卷调整
EN

Stack Overflow用户
提问于 2012-09-28 11:59:19
回答 2查看 1.8K关注 0票数 5

我正在尝试在Android/AOSP音乐播放器应用程序中实现重放增益(即响应音乐文件中的重放增益标记)。这只是一个个人项目,但我可以提供它作为一个补丁,或可能是我自己的自由或播放器。我一开始只看赛道的增益。我问题的本质很可能是因为我数学不及格;

任务是做两件事:( A)在回放开始之前,将音量夹到最大-14分贝(或更多,一些消息人士建议-23分贝)。( B)在开始播放每一首曲目之前,读取其标记并按该数量的dB进行调整。

我看到了在Android involves logarithm scaling as well中调整播放音量,但由于我刚到对数,我不确定这是否使事情变得更简单或两倍(10倍?)也一样难。

有谁能告诉我我在如何将分贝值转换为MediaPlayer.setVolume()可用的参数方面所缺乏的线索?谢谢你的建议。

编辑:我有一些(可能是摇摇欲坠的)断言,这些断言可能会导致连接的需要,但我迫切需要被告知,如果其中任何一个是轻率的。

  1. ReplayGain工作在目标电平为-14 dBFS == 89 dBFS的假设下。因此,我假装这些刻度是完全相等的上下(我知道这是不准确的,但有多不准确?)
  2. 我将MediaPlayer.setVolume(1.0f,1.0f) (最大体积)视为0 0dBFS。
  3. 基于(1),我将其等同于89+14 =103 Based。
  4. 我把MediaPlayer.setVolume(0.0f,0.0f) (静音)看作0dBSPL,所以我有一个抽象的线性体积标度为0-103。

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

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

这条路走得对吗?

EN

回答 2

Stack Overflow用户

发布于 2014-11-28 02:01:10

  • dBFS代表deciBel全音,因此将其分配到最大级别是完全合理的。
  • 分贝是表示两个值之比的单位。当你使用dBFS和dBSPL的时候,你所要说的就是你所使用的声学压力。
    • -14 dBFS意味着你使用的声压比参考值小10^(-14/20)倍(即最大可能)
    • 89 dBSPL意味着你使用的声压是“空气中常用的参考声压的10^(89/ 20 )倍. p0 =20μPa (RMS)或0.0002 dynes/cm2,5通常被认为是人类听力的阈值(大致相当于3米外蚊子飞行的声音)”。(摘自维基百科)

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

因为乘法尺度是一个麻烦,我们取这些乘法值的对数除以10,它给我们的加值称为分贝(额外的2因子来自我们比较声压的平方,而不是声压本身)。

现在,最后,如果考虑到您的范围为103个dB,其范围是从0.0f到1.0f之间的对数映射(和dB一样)(这就是在Android中播放音量的情况),那么-14 14dBFS是(103-14)/103。

你需要进入对数的数学,只有当你想用它建立一个线性的音阶:在线性音阶上,最大声音的80%是输出比例尺上的1-log(20)/log(100)。

票数 2
EN

Stack Overflow用户

发布于 2017-03-22 22:47:03

我正在处理同样的问题,我想我明白了。

首先要认识到的是,不可能通过调整播放器的音量来放大音频文件。你就是不能。音量从0%到100%,就这样。

你实际上所做的就是削弱一切。要做到这一点,你需要决定什么音量应该是0分贝。也就是说,对于没有衰减或放大的音频文件,应该是什么音量。

假设你想要0分贝达到60%。这将是你的“基地”。

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

代码语言:javascript
复制
vol% = 100 * 10 ^ (REPLAYGAIN_TRACK_GAIN / 20) - 60

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

代码语言:javascript
复制
db = 20 * Log(vol% + base) / (Log(2) + Log(5)) - 40

将体积和基值插入到前一个公式中,0%的体积(静音)对应于-4.44dB,100% (最大体积)对应于+4.02dB。

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

代码语言:javascript
复制
vol% = Min(100, Max(0, 100 * 10 ^ (REPLAYGAIN_TRACK_GAIN / 20) - 60)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12639596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档