summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--content/article/got-flac.md57
1 files changed, 44 insertions, 13 deletions
diff --git a/content/article/got-flac.md b/content/article/got-flac.md
index 27158023..f9178293 100644
--- a/content/article/got-flac.md
+++ b/content/article/got-flac.md
@@ -7,7 +7,10 @@ categories = '软件杂谈'
date = 2026-03-22T19:23:16+08:00
draft = true
toc = true
-endnotes = ['是的,slug 是在恶搞已经被玩烂的广告词「Got Milk?」']
+endnotes = [
+ '本页面 slug 是在恶搞已经被玩烂的广告词「Got Milk?」',
+ '可能的下一期《找安娜拿点 EPUB》'
+]
+++
可能是神秘的 [Bouba/Kiki 效应](/essays/jack-in-fitness/#波巴和奇奇杰克向你问好),FLAC 这个单词若是以 `/flæk/` 的读音读出来,我会觉得这是一种脆脆的食物,或者是…… 某种精致小巧的计算机设备,极有可能是存储介质。
@@ -22,7 +25,7 @@ FLAC 作为自由的开源项目,不仅包含对 FLAC 音频格式的规格制
什么音频格式是不自由的?亚马逊开发的用于播放有声书的 `.aa` 和 `.aax` 格式,苹果开发的用于 iTunes Store 的 `.m4p`(MPEG-4 Protected),以及微软开发的 `.wma`(Windows Media Audio)都是不自由的封闭格式。[^2]这些格式不仅没有开源编码和解码器(也就是说,除非有人能够逆向工程编写出该格式的编码和解码器,否则就只有它的创造者能够制作和播放这种格式的音频文件),还添加了 DRM 能力。DRM 的全称是数字版权管理(Digital Rights Management),一般是指用户保护版权内容的相关授权和加密技术。
-其实 `.mp3` 一开始并不是开放和自由格式,开发它的公司曾经试图向使用者收费,后来才有替代的算法被研发,用于解码和编码 `.mp3` 文件。即便是这样,`.mp3` 在 2017 年 4 月 16 日之前是收到专利保护的,直到最近今年才进入公有领域,成为了自由格式。[^3]
+其实 `.mp3` 一开始并不是开放和自由格式,开发它的公司曾经试图向使用者收费,后来才有替代的算法被研发,用于解码和编码 `.mp3` 文件。即便是这样,`.mp3` 在 2017 年 4 月 16 日之前是受到专利保护的,直到最近几年才进入公有领域,成为了自由格式。[^3]
开放格式(Open Format)和自由格式的概念不同,开放格式是指这个文件格式的标准和规格说明被定义在人人都可以访问的文档里,大家都能看到这个格式是如何制定的,并且能以此为依据编写编码和解码器。这个概念和开放标准(Open Standards)类似,其实前几天的[一篇文章](https://www.geedea.pro/article/webmention/)提到的 Webmention 也是开放标准,它的文档被 W3C 组织公开[于此](https://www.w3.org/TR/webmention/),任何人都能根据这篇文档,自己实现 Webmention 发送器和接收器。如果标准不开放,就只能求助于逆向工程了。
@@ -58,11 +61,11 @@ FLAC 作为自由的开源项目,不仅包含对 FLAC 音频格式的规格制
实际上,在音乐流媒体占据现代人生活之前,盗版就已经泛滥了,比如盗版光碟。即便是有 DRM 技术,逆向工程在大多数时候也都算容易,至少对于音频而言,普通人花点时间就能找到已有的解码工具。Paul Graham 在《黑客与画家》里写道,对黑客而言,上锁的门是一种侮辱,他们会想尽办法把锁撬开。
-这对普通消费者而言也是侮辱:为什么我自己买的音乐无法以开放格式下载,在我想要的地方播放?这不仅仅发生在音乐领域,我之前在[第 51 期周刊](/weekly/51/#我逆向工程了-amazon-的-kindle-图书服务)里分享了一篇文章,作者逆向工程了 Kindle 的图书服务,因为亚马逊做的阅读器 App 实在是*太烂了*,而他发现他购买的图书竟然受到 DRM 保护,没办法导出为开放格式在别的阅读器里打开。
+这对普通消费者而言也是侮辱:为什么我自己买的音乐无法以开放格式下载,用我喜欢的播放器播放?这不仅仅发生在音乐领域,我之前在[第 51 期周刊](/weekly/51/#我逆向工程了-amazon-的-kindle-图书服务)里分享了一篇文章,作者逆向工程了 Kindle 的图书服务,因为亚马逊做的阅读器 App 实在是*太烂了*,而他发现他购买的图书竟然受到 DRM 保护,没办法导出为开放格式在别的阅读器里打开。
-在我看来,DRM 技术不仅无法阻止盗版者,还是对消费者的不尊重。这就是像是有人在家周围建立起一堵高墙,为了防止盗贼,可小偷还是能用梯子爬进去,而邻居们却开始对这家人避而远之。
+在我看来,DRM 技术不仅无法阻止盗版者,还是对消费者的不尊重。这就是像是有人在家周围建立起一堵高墙,为了防止盗贼,可小偷还是能用梯子爬进去,而邻居们却开始对这家人避而远之,总之是挺蠢的行为。
-总之是挺蠢的行为。
+不过,如今愿意为音乐付费的人似乎在变少,但我认为主要原因是流媒体对大众消费习惯的影响,并非是人们不愿意为音乐付费。流媒体的话题会在稍后谈到。
## 音频格式和音质玄学
@@ -98,7 +101,7 @@ FLAC 作为自由的开源项目,不仅包含对 FLAC 音频格式的规格制
这听起来还是很抽象,让我画个图。
-![音频进入编码器,被编码器编码为音频文件;音频文件进入解码器,被解码为音频。](http://r2.eltr.ac/geedeapro/article/got-flac/how-audio-is-made.png)
+![音频进入编码器,被编码器编码为音频文件;音频文件进入解码器,被解码为音频。](https://r2.eltr.ac/geedeapro/article/got-flac/how-audio-is-made.png)
{.dark:invert}
需要注意,这里的音频并非是物理世界的声波,而是经过**脉冲编码调制**(PCM)转化成的数字信号,是对模拟信号的编码。PCM 就是用比特(0 和 1)表示音频的方法,可以理解为声波在数字世界的一比一复刻(当然实际上不是 100% 精确的)。PCM 比特被输入到编码器中,得到了特定格式的音频文件,音频文件再作为解码器的输入被解码,解码的结果就是 PCM 比特。
@@ -107,6 +110,8 @@ FLAC 作为自由的开源项目,不仅包含对 FLAC 音频格式的规格制
对于有损压缩格式,比如 `.mp3`,编码后的音频文件无法通过解码器复原出一模一样的 PCM 比特,因此,音频的质量就被损坏了。
+至于没有压缩的 `.wav` 和 `.aiff`,它们储存的是完整的 PCM 编码。由于无损压缩的音频最终也能解码成一模一样的 PCM 数据,无损压缩和未压缩的格式在音质上完全没有区别——不是人耳听不出来,而是真的没有区别。使用未压缩的音频格式就像是买袋装薯片,大部分体积都是氮气而不是食物。
+
### ALAC vs. FLAC:编码与容器
FLAC 并不是唯一的无损压缩格式,苹果有开发名为 Apple Lossless 的音频格式,也被称作 ALAC。~~FLAC 听起来更像美味的食物,而 ALAC 更像是化妆品、药品或者医美手术的名字,这就是 ALAC 的第一个缺陷。~~
@@ -127,12 +132,12 @@ FLAC 并不是唯一的无损压缩格式,苹果有开发名为 Apple Lossless
先前已经提过,几乎所有的音频格式都在处理 PCM,也就是对声波信号的数字化编码,而数字化不总是精确的。精度能够量化,最常见的两个数据就是采样率(sample rate)和比特深度(bit depth)。
-现实中的声波是模拟信号,通常表示为光滑、不断变化的曲线。PCM 做的就是每隔一段时间取一次波形图的高度,并将这次测量结果表示为二进制数,连起来就得到了数字信号,如下图所示。
+现实中的声波是模拟信号,通常表示为光滑、不断变化的曲线。PCM 做的就是每隔一段时间取一次声波的振幅,并将这次测量结果表示为二进制数,连起来就得到了数字信号,如下图所示。
-![A、B 是两个波形图,A 图上有非常频繁出现的点,B 图上的点则相对稀疏,每个点都表示一次采样。](http://r2.eltr.ac/geedeapro/article/got-flac/sample-rate.jpg)
+![A、B 是两个波形图,A 图上有非常频繁出现的点,B 图上的点则相对稀疏,每个点都表示一次采样。](https://r2.eltr.ac/geedeapro/article/got-flac/sample-rate.jpg "A 的采样率要高于 B 的采样率。")
{.dark:invert}
-采样的频率就是采样率,单位是 kHz(千赫兹),也就是每秒采样几千次。ALAC 支持的最高采样率为 384 kHz,如果采样率更高就无法承受了;而 FLAC 支持的最高采样率为 1.048 MHz。[^6]尽管大部分音乐播放器不一定支持这么高的采样率,音频格式本身也没有这么高(我下载的音乐有不少采样率都只有 44.1kHz,听感依然很好),但…… 为什么不选一个更好的音频格式呢?又没有什么开销。
+采样的频率就是采样率,单位是 kHz(千赫兹),也就是每秒采样几千次。ALAC 支持的最高采样率为 384 kHz,如果采样率更高就无法承受了;而 FLAC 支持的最高采样率为 1.048 MHz。[^6]尽管大部分音乐播放器不一定支持这么高的采样率,音频本身的采样率也很少超过 100 kHz(我下载的音乐有不少采样率都只有 44.1kHz,听感依然很好),但…… 为什么不选一个更好的音频格式呢?又没有什么开销。
所谓比特深度,就是每次采样包含了多少比特的信息。深度其实就是字长(word length),是每次采样时,声波的振幅。比特深度不同的音频之间的区别,就像是 32 位操作系统和 64 位操作系统之间的区别,都能跑,但就是会有差别。
@@ -140,15 +145,37 @@ FLAC 并不是唯一的无损压缩格式,苹果有开发名为 Apple Lossless
FLAC 支持 4~32 位的比特深度,而 ALAC 支持 16、20、24 和 32 位。[^7]尽管两者的上限是一样的,但无疑 FLAC 的兼容性更广。
+尽管由苹果开发,但 ALAC 的编码器也在几年前开源了(一开始并不是开源的),也早就有人不借助文档逆向工程开发了 ALAC 的解码器。所以,实际上 ALAC 也可以像 FLAC 一样自由使用。不过整体而言,FLAC 是更好的选择。
+
关于 FLAC 和 ALAC 以外的无损压缩格式,可以参照 Hydrogenaudio Wiki 上的[这张表格](https://wiki.hydrogenaudio.org/index.php?title=Lossless_comparison#Comparison_Table)。
-### 流媒体 vs. 本地音乐
+## 万恶之源——商业流媒体
+
+把整个音频文件都下载到本地后再播放,明显的缺点是慢,等待的时间很长。流式传输就是一边传输数据,一边解析已经收到的数据,就可以做到在没有获得完整音频文件的情况下播放音频,视频和其他长数据也可以使用流式传输。
+
+流式传输是很常见的编程实践,本身是中立的技术,但商业化流媒体平台的发展引发了不少问题。
+
+不过在正式谈流媒体之前,还要回到更久之前。
+
+{{< float-image "https://r2.eltr.ac/geedeapro/article/got-flac/loudness-war-demo.png" "left" >}}
+
+从上世纪 40 年代开始,人们就发现音乐的声音变得越来越响,这是发生在母带制作(mastering)时的事情。记住「母带」这个词,之后还会反复出现。随着数字信号处理技术的发展,音乐制作人开始利用计算机把音乐调得越来越响。
-把整个音频文件都下载到本地后再播放,明显的缺点是慢,等待的时间很长。流式传输就是一边传输数据,一边解析已经收到的数据,就可以做到在没有获得完整音频文件的情况下播放音频。流式传输是很常见的编程实践,本身是中立的技术,但流媒体平台的发展使得
+如图是一首名为《Super Trouper》的音乐,从 1980 年发布起,又有三个新的版本发布,每个版本都比上一个版本更响。[^8]
-## 分析统计怎么办?
+这完全是出于商业考虑,更响的音乐会让人觉得更好听。像是吉他这样的乐器,由于本身发出的声音比较小,也会被单独调得更响。
-## 歌词怎么办?
+可是,在被调得更响之前,《Super Trouper》就已经是热单了,有了很好的成绩。让它变得更响不仅不能让音乐的艺术性和娱乐性有任何提升,还会损伤听众的听力健康,而且,把音乐变响不仅仅是让声音更大那么简单。
+
+提高响度实际上是在对音频进行压缩,让音乐的采样不断接近(甚至超过)音频格式和存储媒介支持的最大振幅,在极端情况下会造成明显的扰动和失真。[^9]
+
+好了,现在商业流媒体加入战局。由于不同时期的音乐响度不一致,不同的音乐制作人也会选择不同的调音策略,为了解决响度战争造成的听感问题(比如切换到下一首歌是音乐突然变响,或者突然变得难以听清),几乎所有的流媒体平台都开发了新的算法来均衡响度(loudness normalization)
+
+## 抛弃流媒体
+
+### 分析统计怎么办?
+
+### 歌词怎么办?
@@ -166,3 +193,7 @@ FLAC 支持 4~32 位的比特深度,而 ALAC 支持 16、20、24 和 32 位。
[^6]: 来源:[RFC 9639](https://datatracker.ietf.org/doc/rfc9639/#:~:text=sample%20rates%20from%201%0A%20%20%20to%201048575%20hertz)
[^7]: 来源:[RFC 9639](https://datatracker.ietf.org/doc/rfc9639/#:~:text=bit%20depths%20from%204%20to%2032%20bits) 和 [ALAC - Wikipedia](https://en.wikipedia.org/wiki/Apple_Lossless_Audio_Codec#:~:text=ALAC%20supports%20up%20to%208%20channels%20of%20audio%20at%2016%2C%2020%2C%2024%20and%2032%20bit%20depth%20with%20a%20maximum%20sample%20rate%20of%20384%C2%A0kHz.)
+
+[^8]: 来源:[Loudness War - Wikipedia](https://en.wikipedia.org/wiki/Loudness_war)
+
+[^9]: 参见:[Loudness War - Wikipedia](https://en.wikipedia.org/wiki/Loudness_war#Criticism:~:text=Engineers%20can%20apply%20an%20increasingly%20high%20ratio%20of%20compression%20to%20a%20recording%20until%20it%20peaks%20more%20frequently%20at%20the%20maximum%20amplitude%2C%20a%20technique%20colloquially%20known%20as%20brickwalling.%20In%20extreme%20cases%2C%20efforts%20to%20increase%20loudness%20can%20result%20in%20clipping%20and%20other%20audible%20distortion.)