音量标准化

Alb*_*ert 3 audio pcm audio-player

我正在编写一个音乐播放器,我想标准化不同歌曲的音量。

我可以想到一些不同的方法来做到这一点,例如:

  1. 遍历所有 PCM 样本(假设浮点数从 -1 到 1)并选择 m = max(abs(sample))。然后将因子 1/m 应用于所有 PCM 样本。这将使峰值为 1。

  2. 遍历 PCM 流,对于每个位置,取其周围一定宽度的汉宁窗口,计算绝对样本的平均值,然后从这些数据中选取最大值并标准化所有内容。

  3. 与 2 相同,但可以通过其他方式获得某种平均值。

2 和 3 的缺点是我可能需要一些剪辑,从而失去一些质量。不过,通过不标准化为 1 而是标准化为 0.95 左右,我也许可以在某种程度上避免这种情况。但我认为 2 和 3 的优点是这对用户来说可能是更自然的归一化。维基百科也有一些关于此的信息,并提到RMSReplayGainEBU R128来测量歌曲的响度。

其他流行的音乐播放器(如 iTunes 等)是如何做到这一点的?

Alb*_*ert 6

iTunes 使用声音检查技术。“Sound Check 是 Apple Inc. 的一项专有技术,其功能类似于 ReplayGain。它可在 iTunes 和 iPod 上使用。” (来自维基百科)所以,这对我来说不是解决方案。

ReplayGain 似乎是最常见的技术。该算法解释here。示例实现是mp3gain (GPL) 或ffmpeg-replaygain(GPL,源自 mp3gain)。我现在在我的 MusicPlayer 项目(BSD 许可证)中有自己的实现

另请参阅这些带有实现的项目: