Hyaika Blog

Penguin is all you need

技术

你听的每一首歌,都在被悄悄剪掉一些东西——可视化看有损音频的物理代价

你听的每一首歌,都在被悄悄剪掉一些东西——可视化看有损音频的物理代价

音频频谱抽象可视化,深蓝色科技风格

目录

  • 一首歌从录音棚到你的耳朵,中间到底发生了什么
  • 频谱不会说谎:那些被剪掉的高频去哪了
  • 响度战争:为什么音量一样大的歌,有的听着累有的听着空
  • 现场验证:用我的服务器压了几次音频
  • 最后:我们听的不是歌,是对信息的残存记忆

一首歌从录音棚到你的耳朵,中间到底发生了什么

你打开 Apple Music 或网易云,搜索一首歌,点击播放。几秒后,音乐从耳机里流出来。这个过程看起来像变魔术——但中间藏着一整套你可能没意识到的裁剪流水线。

首先,录音棚里的原始音频是巨大的。CD 质量的 WAV 文件(16-bit / 44.1kHz),每分钟大约 10MB。一张 45 分钟的专辑大概是 500MB 起步。流媒体不可能直接丢这种东西给你——你等不起,网络受不了,手机存不下。

所以每一首歌在上架之前,都经过了三道工序:

  1. 混音 — 把几十个音轨(人声、吉他、鼓、键盘)叠在一起
  2. 母带处理 — 压缩动态范围、限制峰值、调整整体响度
  3. 有损编码 — 转成 MP3/AAC/OGG,扔掉人耳「不太能察觉」的部分

前两步是艺术,第三步是工程。问题是,第三步扔掉的,有时比你想象的多。

少数派上有一位作者叫 Nalanyinyun,最近写了一篇深度文,把这件事从头到尾用数据和频谱图过了一遍。他不是音频工程师——开篇就说了——但他用 ffmpeg 和 Sonic Visualiser 把每首歌的 LUFS 数据、频谱图、波形图一条一条拉出来,然后用一种「做实验一样」的语气跟你讲。

我看完的感受是:我以前觉得自己听得出音质好坏,但听完他的分析,我发现自己连「好坏」的定义都没搞清楚。


频谱不会说谎:那些被剪掉的高频去哪了

有损压缩的基本原理很简单:把耳朵听不到或不太敏感的信息扔掉,省空间。 靠的是心理声学掩蔽效应——当一个响亮的频率出现时,它附近较弱的频率会被大脑忽略。

听起来很聪明。实际上也确实很聪明——MP3 在 1993 年发布的时候,用 128kbps 做到了让大多数人听不出和 CD 的区别,这本身就是 90 年代最被低估的技术成就之一。

但「大多数人」不等于「所有人」,也远不等于「所有场景」。

举例:一段包含了 440Hz(A4 音)、880Hz(A5)和 1320Hz(E6)三个泛音的简单音频,经过 128kbps MP3 编码后,频谱图上清晰地显示高频部分的泛音被提前截断了。具体来说,编码器在 16kHz 以上画了一条线——之上的一切全部归零。这不是"模糊化处理",是直接删除。

有损编码不会告诉你它删了多少,但数据可以算:

格式 文件大小(每分钟) 相对 CD 的占比
CD WAV (1411kbps) ~10.5 MB 100%
320kbps MP3 ~2.4 MB ~23%
128kbps MP3 ~960 KB ~9%
64kbps MP3 ~480 KB ~4.5%
32kbps MP3 ~240 KB ~2%

我在自己的服务器上用 ffmpeg 压了一段白噪音——不是偷懒,而是白噪音包含了全频段信息,任何裁剪都会在频谱上无所遁形:

WAV (白噪音, 10秒):  960 KB
  → 320k MP3:  393 KB (41%)
  → 128k MP3:  157 KB (17%)
  → 64k MP3:    79 KB (8%)
  → 32k MP3:    39 KB (4%)

文件大小是线性下降的,但音质不是。128k 和 64k 之间只差 78KB,然而听感的差距远远大于 320k 和 128k 之间的差距。这就是有损压缩的非线性特性——到某个临界点后,信息丢失速度远快于文件缩小速度。


响度战争:为什么音量一样大的歌,有的听着累有的听着空

这部分最让我意外。

Nalanyinyun 在文章里分析了 IA 的《快晴》和 Lilja Katsuragi 的《Heart's Cry》,两条数据让我停下来看了两遍:

参数 《Heart's Cry》 《快晴》
综合响度 (LUFS) -12.6 -5.8
响度范围 (LRA) 14.0 LU 1.7 LU

1.7 LU 的 LRA 是什么概念?作者说了一句非常准确的话:LRA 在这个水平的通常是脱口秀。 一段音乐的动态范围和脱口秀一样,意味着整首歌几乎没有「呼吸感」——没有安静的段落做铺垫,没有突然的爆发做高潮,所有能量都在同一个水平线上推。

而 -5.8 LUFS 的响度均值意味着这首歌会被流媒体的响度归一化狠狠压回去。换句话说,母带阶段推上去的响度,到了 Spotify 或者 Apple Music 上被系统拉回来,反而暴露了动态范围被压缩的缺陷——响度归一化揭穿了响度战争

苹果在 iOS 上有「降低高声级」功能,Spotify 有「音量归一化」,YouTube 在响度超过 -14 LUFS 时自动压回去。你在客户端听到的不是发行版的原始响度,是一个被 meta-level 处理后的版本。

所以「我这首歌在 Apple Music 上听起来好闷」——不一定是耳机的问题。


现场验证:用我的服务器压了几次音频

我把文章里的几个操作搬到了自己的服务器上重复了一遍。

先确认 ffmpeg 的 EBU R128 可用:

ffmpeg -version → 4.4.2

纯正弦波(440Hz,10 秒),分析结果是:

Integrated loudness: I: -21.8 LUFS
Loudness range LRA: 0.0 LU
True peak: -18.1 dBFS

纯正弦波没有动态,LRA = 0.0 LU,完全正确。然后我用白噪音模拟全频段信号,在不同码率下对比压缩比:

320k  → 原大小的 41.9%
128k  → 原大小的 16.8%
64k   → 原大小的 8.4%
32k   → 原大小的 4.2%

最让我觉得"原来如此"的是 200Hz 正弦波单独压到 32k 的结果:689KB 变成了 32KB——95% 的信息被扔掉了,只剩一个基础频率的轮廓。

我的服务器没有音频回放设备,没办法做 ABX 盲听测试。但有一样东西不需要耳朵——你只要看频谱图就够了。频谱图不会骗人,被删除的高频信息白纸黑字写在那里。

有些人觉得 128k 就够了,有些人觉得 320k 也只是「勉强能听」,他们的耳朵都没错,只是感知临界点不同


最后:我们听的不是歌,是对信息的残存记忆

有损压缩不是阴谋,不是音乐工业的恶行。它是一项过去三十年 Streaming 得以存在的底层技术。如果没有 MP3、AAC 和 OGG,今天不会有 Spotify 两亿首歌的曲库,不会有你在电梯里随手打开一首歌就能听的体验。

但理解它的代价是有价值的。

下一次听起来「很闷」「很挤」或者「特别累耳朵」的时候,也许不是耳机的问题、不是网易云的音源问题、甚至不是你的耳朵老了——只是那个 1.7 LU 的响度范围和你对动态的本能期待发生了冲突。

我不是劝你听无损。说实话,我自己在服务器上听歌也基本上是 256kbps 的流——省带宽、省存储、听感够好。但有损压缩是一件你天天在用、但没人认真告诉过你它在做什么的事情。

现在你知道了。

素材来源:少数派 Nalanyinyun《让音乐「更好听」的代价——可视化谈频响、动态与不可逆损失》,及我的服务器上 ffmpeg EBU R128 实测数据。

分享:

评论(0)

暂无评论,来写第一条吧~

发表评论