如果您经常浏览与音响发烧友相关的网站,您可能会偶然发现一些作者声称,以 FLAC 或 WAV 格式播放同一首音乐时,声音存在差异。这篇 The Well-Tempered Computer 上的文章很好地探讨了这个概念,既从不相信这种事情可能发生的人的角度,也从认为存在差异的人的角度进行了探讨。
无需重复整篇文章,这种观点似乎包含两个部分
- FLAC 在保留原始信号方面不如 WAV。
- FLAC 比 WAV 需要播放设备付出更多的处理努力,因此会在数模转换中引入“瑕疵”。
过去,我大多忽略了这场辩论,但最近我发现自己与一位我非常尊敬的人讨论,他认为 FLAC 在音乐内容方面不如 WAV。具体来说,他认为从 WAV 转换为 FLAC 的过程中会丢失一些东西,并且从转换得到的“第二代” WAV,即 WAV (第一代) → FLAC → WAV (第二代),会不如原始文件。此外,他认为这种质量损失意味着当 WAV 文件可用时,您永远不应该购买 FLAC 文件,因为将 FLAC 转换回 WAV 将是原始文件的劣质副本。
我相信,阅读本文的某些人会对此观点感到困惑,因为 FLAC 的重点是无损压缩。我的意思是,天哪,我们会担心将我们的文档放入 ZIP 格式可能会导致我们丢失句子中的一些字符吗?但我真的很尊重这个人,他在音乐录音和工程方面拥有丰富的经验。那么,我该如何说服别人,FLAC 是存储珍贵音乐比特的安全格式呢?
使用命令行来证明我的观点
The Well-Tempered Computer 文章建议将两个文件加载到音频编辑器中,然后将两个音轨相减。我考虑了一会儿;我可以加载 Audacity,摆弄一下以对齐起始点,将两者相减,瞧,零比特流将表明文件是等效的。但是,我预见到这种方法需要做相当多的工作,而且我看不出如何最好地将零比特流作为证据呈现。因此,手头有 Linux,我启动了一个终端会话,并按如下步骤进行。
首先,我使用命令行 flac 实用程序将第一代 24 位、44.1kHz WAV 文件转换为 FLAC,然后创建了一个测试目录,我可以在其中保存 FLAC 和随后的第二代 WAV 文件。
flac --keep-foreign-metadata 'Immunity-008-Jon Hopkins-Immunity.wav'
mkdir test
mv 'Immunity-008-Jon Hopkins-Immunity.flac' test
然后,我再次使用命令行 flac 实用程序将 FLAC 文件转换为 WAV。
cd test
flac --keep-foreign-metadata -d 'Immunity-008-Jon Hopkins-Immunity.flac'
最后,我想使用 diff 命令来显示两代文件之间的最小差异,但是 diff 对于二进制文件来说信息量不大。因此,我使用 hexdump 将两个二进制文件转换为 ASCII 文件,以便更好地适用于 diff
hexdump -v -e '/1 "%02x\n"' ../'Immunity-008-Jon Hopkins-Immunity.wav' > 008_before.hex
hexdump -v -e '/1 "%02x\n"' 'Immunity-008-Jon Hopkins-Immunity.wav' > 008_after.hex
diff 008_before.hex 008_after.hex
果然,diff 的输出显示唯一的差异是在元数据标头中
5,6c5,6
< 00
< 63
---
> fe
> 62
57c57
< 12
---
> 10
76,77d75
< 00
< 00
解释以上内容,字节 5 和 6,最初是 00 63,更改为 fe 62;字节 57 从 12 更改为 10;并且删除了 76 和 77 处的两个空字节。
就我个人而言,我可以接受这种程度的元数据更改。并且为了确认这不是幸运地选择了源文件,我还尝试了其他几个分辨率高达 24 位 / 96kHz 的文件,并且没有看到对音乐内容有任何更改。
使用 ffmpeg 转换的风险
因此,如果 flac 实用程序在 WAV → FLAC → WAV 转换过程中在保留信号内容方面做得不错,那么其他实用程序呢?
我使用 ffmpeg 将 24 位、44.1kHz FLAC 文件转换回 WAV,没有使用任何命令行选项,并且惊讶地发现 ffmpeg 将我的信号降采样到 16 位!这是输出
Input #0, flac, from 'Immunity-008-Jon Hopkins-Immunity.flac':
Duration: 00:09:56.76, start: 0.000000, bitrate: 1397 kb/s
Stream #0:0: Audio: flac, 44100 Hz, stereo, s32 (24 bit)
Stream mapping:
Stream #0:0 -> #0:0 (flac (native) -> pcm_s16le (native))
Press [q] to stop, [?] for help
Output #0, wav, to 'ffmpegged.wav':
Metadata:
ISFT : Lavf57.83.100
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s
Metadata:
encoder : Lavc57.107.100 pcm_s16le
[NULL @ 0x55f3b6f51a20] sample/frame number mismatch in adjacent frames
size= 102801kB time=00:09:56.75 bitrate=1411.2kbits/s speed=1.35e+03x
此外,我对“sample/frame number mismatch(采样/帧号不匹配)”错误消息感到不舒服。嗯。我想我更喜欢在我想让它降采样时才降采样的实用程序,而不是默认降采样。
那么 sox 呢?
我决定我应该尝试 sox 看看结果会怎样。在这种情况下,没有输出(我必须赞赏 *nix 命令的传统,只有在出现问题时才发出消息)。
基于对转换后的文件使用 hexdump 和 diff,看来 sox 比 flac 更难处理元数据,至少在默认情况下是这样。前 70 多个字节中存在许多差异(太多而无法在此处列出),但似乎音乐有效负载没有更改。
这是我第一次使用 sox;我翻阅了它的手册页,看看是否有某种方法可以告诉它对元数据温和一些,我必须说,sox 能做到的所有酷事让我感到震惊。哇,开发者们做得好!
我目前的结论...
如果您购买了 FLAC 格式的音乐并想将其转换为 WAV,请使用 flac 命令行工具。如果您购买了 WAV 格式的音乐并想将其转换为 FLAC,情况也是如此。准备好编辑您的 FLAC 标签。无论哪种情况,都不要担心转换过程会更改数字音乐流本身——它不会。
如果您决心使用 ffmpeg,请确保指定您的输出格式,这样您的文件就不会被降采样。或者使用 sox,但考虑花时间仔细阅读文档并了解更多关于这个出色工具的信息。
至于为什么我的联系人认为 WAV → FLAC → WAV 转换过程会产生更改,也许是因为他熟悉模拟原件副本或将 DSD 转换为 PCM 时发生的真实劣化。
那么上面的第二个问题呢?WAV 文件听起来比 FLAC 更好吗?好吧,我不会踏入那个雷区,除非将感兴趣的各方引回到 The Well-Tempered Computer 上的文章。
以及更多音乐
最近,我们有幸参加了 Gli Angeli Genève 的音乐会,他们在那里演奏了多首 巴赫康塔塔,选自《神剧》以及一些泰勒曼和布克斯特胡德的作品。我们被这场演出的高品质所感动,我很快就开始寻找《神剧》的下载资源。在对 Linux 友好的下载商店 7digital 上,我购买了 Vox Luminis 的高分辨率 FLAC 格式的表演,我们一直在欣赏它。您可以在 YouTube 上听到其中的一些音乐。
最近的另一个发现,来自那个美妙的开源媒介,黑胶唱片,是 Orchestra Baobab 的向 Ndiouga Dieng 致敬。 多么美妙的专辑啊!更棒的是:它附带了一张下载券,可以下载出色的高分辨率 FLAC 文件。这支乐队已经存在 30 多年了,哇!他们仍然充满活力。 在 YouTube 上查看官方视频。
最后但并非最不重要的是,我终于为 The Allman Brothers' At Fillmore East 的高分辨率下载付费,同样来自 7digital。我一直对 The Allman Brothers 情有独钟,但我倾向于忽略现场专辑,因为根据我的经验,它们的质量参差不齐。然而,这张现场专辑非常精彩。音质很好,乐队处于早期最佳状态。如果您喜欢他们但一直避免这张专辑,认为它会是录音效果很差的垃圾,您可能需要重新考虑一下!
8 条评论