Alb*_*ert 3 audio pcm audio-player
我正在编写一个音乐播放器,我想标准化不同歌曲的音量。
我可以想到一些不同的方法来做到这一点,例如:
遍历所有 PCM 样本(假设浮点数从 -1 到 1)并选择 m = max(abs(sample))。然后将因子 1/m 应用于所有 PCM 样本。这将使峰值为 1。
遍历 PCM 流,对于每个位置,取其周围一定宽度的汉宁窗口,计算绝对样本的平均值,然后从这些数据中选取最大值并标准化所有内容。
与 2 相同,但可以通过其他方式获得某种平均值。
2 和 3 的缺点是我可能需要一些剪辑,从而失去一些质量。不过,通过不标准化为 1 而是标准化为 0.95 左右,我也许可以在某种程度上避免这种情况。但我认为 2 和 3 的优点是这对用户来说可能是更自然的归一化。维基百科也有一些关于此的信息,并提到RMS、ReplayGain或EBU R128来测量歌曲的响度。
其他流行的音乐播放器(如 iTunes 等)是如何做到这一点的?
iTunes 使用声音检查技术。“Sound Check 是 Apple Inc. 的一项专有技术,其功能类似于 ReplayGain。它可在 iTunes 和 iPod 上使用。” (来自维基百科)所以,这对我来说不是解决方案。
ReplayGain 似乎是最常见的技术。该算法解释here。示例实现是mp3gain (GPL) 或ffmpeg-replaygain(GPL,源自 mp3gain)。我现在在我的 MusicPlayer 项目(BSD 许可证)中有自己的实现。
另请参阅这些带有实现的项目: