ACGN收藏 - 音频编码与格式

目录

在我的收藏里面,音乐是占大头的。我非常喜欢尝试各种风格的音乐,也非常喜欢日本音乐圈的多样性,因此收集了很多。在这过程中也了解到了一些音频格式的内容~我也自己做过一个benchmark,比较不同音频编码的性能区别,如果有兴趣的话可以自己尝试一下~。

我个人喜欢收藏无损音乐,目的不仅仅是因为高音质,而是无损意味着“无损”,音质与CD或者其他音源是完全一致的(当然,这个一致性音频编码本身并不能保证音源的完整性,但是如果有其他的辅助信息如EAC log,或者AccurateRip测试结果就完全可以保证了)。在这个情况下我把无损压成有损,就能保证这个有损是达到了预期的音质。如果是网上直接下载有损的话,一是很难确定这个有损有没有经过二次压缩,造成额外音质损失,二是有损也最好不要再转换格式了,同样是因为音质损失,这就造成了额外的不便。

本文就介绍一下我了解的与音频编码相关的知识,以及各种常用音频编码格式的比较。更全面的格式对比可以参考Wikipedia页面。另外需要指明的是,本文的介绍基于音乐收藏和本地播放的目的,与流媒体的需求不同,后者追求稳定的码率、低延迟甚至是低能耗。

音频信号调制

如果学过信号处理的读者可能已经了解本章内容了,可以跳过这节~

在物理世界中,声音本质上是一种物体震动产生的波,如果要将物理世界中的波存储为数字世界可以存储的格式,则需要进行信号采样(模数转换)和信号调制。波形信号调制主要有两种方法,一种是脉冲编码调制(pulse-code modulation,PCM),一种则是脉冲密度调制(pulse-density modulation,PDM)。简而言之PCM就是通过数字信号的幅度和频率来分别表示模拟信号的幅度和频率,而PDM则通过数字信号的频率和幅度来分别表示模拟信号的幅度和频率(反过来了)。它们对应的音频存储格式是WAV和DSD(Direct Stream Digital),WAV由于编码简单是最广为使用的音频格式,而DSD由于技术和专利的限制则非常罕见,并且音频编辑比WAV复杂很多,因此只有在索尼的SACD上和一些高清音乐网站可以见到。

PCM的音质在频率上受限于其采样率,根据Nyquist采样定理,两倍以上的采样率可以真实还原出原波形,所以考虑到人耳的听力最高到20kHz,通常PCM音频的采样率都在40kHz以上(如常见的44.1kHz和48kHz);在振幅上受限于其采样位深。因此采样率低会导致声音高频被裁掉,而采样位深低会导致振幅分辨率下降,音频的动态范围下降,这两者共同导致音频的失真。而PDM由于我没学过,就不评价其音质了。

在不同的采样方式之间是可能会产生额外失真的。高音质采样到低音质采样就不用说了,反过来也是可能的,如非整数倍地改变采样率(如44.1kHz到48kHz),PCM和PDM的转换。位深由于对应的是二进制的位数,非整数倍提高位深不会产生失真。

有损(Lossy)编码

首先是有损编码,有损编码的音乐比较好找,因为(天国的)虾米、网易云、Spotify等网站都可以下到,现在很多平台都提供比较高音质的试听了。但是在曾经的年代,高音质有损编码也是比较难找的,以及现在放在手机上听歌我还是会转换成有损音质。

不同的有损格式对于“损失”音频的哪一部分、哪一频段是不一样的,他们适合的场景也不一样,比如有的格式设计之初的目的就睡尽量保留人声质量。如果真要比较哪种格式、哪种编码器的音质最好的话,只有A/B测试才是最可靠的,然而A/B测试也会受到被测对象的主观影响,所以如果想选择一个音质最好的编码器的话,可以自行A/B测试来做判断。

有损音频的音质可以通过码率(birate)直接进行优劣判断。音频的码率指的是每秒文件能够提供的信息量,以CD音质为例,普通CD一般采样率是44.1kHz(理论能够还原频率高达22kHz的波形),采样深度16bit,双声道,那么原始码率就是44100*16*2=1141.2kbps,注意这里的kbpskilo bits per second。普通能下载到的有损音乐通常是MP3格式(虽然这年头很少有人再下载音乐了),在我高中那会,从QQ音乐等平台上上下载的MP3基本都是128kbps,只有虾米下载的是192kbps甚至320kbps,因此我还是非常喜欢虾米的。

码率是一个瞬时概念,对于音频编码(甚至视频编码)而言,码率是随时可能变化的。编码器通常提供两种码率控制方法:恒定比特率(Constant BiRate,CBR)和可变比特率(Variable BiRate,VBR)。选择CBR或者VBR需要试场景而定,CBR适合稳定的媒体串流,避免网络波动产生播放不畅,而VBR由于给了编码器更多空间根据媒体内容调节码率,通常而言可以达到更好的质量,适合本地存储回放。

一种客观的音质测试方式是直接计算编码后音频与原音频信号相差了多少。根据我的测试,有损音频的质量基本和码率成正比(见下图,如果用信号损失的对数值来看的话几乎是线性正比)。而如果使用根据人听力敏感度加权之后的频谱,那么可以看出在低码率时(如96kbps),AAC的音质较好,这正是AAC设计的目标,即在通话音质(一般就是96kbps)下能够有很好的表现。而在高码率时(如320kbps)WavPack和MP3 CBR的表现更好,因此很多人说MP3格式应该被淘汰,但320k的MP3的音质还是非常好的。

有损音质与码率关系图

简而言之,我的结论是在同等码率下各种有损格式的音质都差不多,更应该关注的是如何找到高码率的音源。下面介绍几个主流的有损音频编码格式。(我个人非常喜欢用WavPack的有损模式,但是这个很非主流)

MP3

MP3的名字来源于其最开始是作为MPEG-1标准中的第三种音频格式,它应该是(至少在中国)最广为流传的音频编码格式了。而在支持MP3的编码器中,lame是其中最常用的。MP3的编码特性是它会根据码率的设置进行低通滤波,320kbps CBR时滤波在20kHz左右比较接近CD音质的22kHz了,而192kbps CBR滤波则在16kHz左右,128kbps在12KHz左右。因此不同码率MP3的听感区别是非常明显的,通俗来讲音质越差的MP3越像是把喇叭蒙在鼓里的声音,各个频段的特点可以参考我之前的博客

lame编码器虽然2012年之后就几乎没有怎么更新了,但是它应该仍然是所有提供mp3的音乐平台使用的主要编码器。它支持CBR、VBR和独有的的ABR。CBR可以指定码率,VBR无法直接指定码率,而通过指定参数-V来间接实现码率调整,而ABR则是在可变码率的同时支持指定一个目标平均码率。

MP3虽然是个很古老的格式,并且有不少为人诟病的缺点,但是因为高码率MP3的音质确实不错,而且MP3的硬件支持非常到位,因此到现在仍然是非常流行的音频格式。

AAC

AAC全名为Advanced Audio Coding,AAC设计目标是成为MP3的后继者。虽然维基上说AAC在同等码率下能够得到比MP3更好的音质,但根据我的测试结果这个结论只在相对较低码率的时候成立。不过AAC设计的定位应该就是针对流媒体,以及现在的蓝牙音频,这些地方音频的码率都是受限的,所以也不能说错。AAC比MP3支持更多的采样率、通道数,在视频编码时其实用的非常多,但是其实它不是针对音乐收藏而设计的。

AAC音频文件的后缀名通常是m4amp4。这两者都是MPEG-4标准定义的流媒体容器后缀名,其中前者专门针对音频,而后者则是音频和视频都可以用。关于容器是什么,我会在之后的视频编码器博客中详细介绍。

AAC音频编码器除了万能的ffmpeg以外,还有以下这些专门针对AAC的编码器

  • NeroAAC:质量最好,但是是商用编码器,不开源。
  • QuickTime AAC:由苹果设计、应用在QuickTime和后来的iTunes中、口碑不错。有第三方开源的实现(qaac)
  • FAAC:Free AAC,开源,但是感觉用的人不多

总的而言,AAC的特性非常多,也是一个经过深思熟虑后设计的编码器,但由于是针对流媒体设计的,对音频收藏来说并没有什么吸引力。

无损(Lossless)编码

无损编码即经过编码压缩之后不会损失信息的编码方式。如果仅仅是为了压缩而言的话,通用的文件压缩理论上也是可以用作音频编码的,但是通用压缩的效率肯定不如专门设计的音频压缩高,并且需要先解压才能播放。无损编码没有音质之差,它们的主要指标则是编码解码耗时,压缩率、对音频格式的支持以及其他附加功能。对音频格式的支持包括多声道(如5.1)、高采样率和位深(如常见的Hi-Res格式96kHz/24bit)、对DSD的支持等。

下面介绍一些常用的无损格式(其中我选择的就是WavPack)。

FLAC

FLAC名为Free Lossless Audio Codec,虽然听起来非常老土和山寨,但应该是目前各平台最通用的格式,像是MP3在有损编码里的地位。FLAC开源、性能好、解码快、硬件支持好、压缩率也不错,无脑选flac一般没什么问题。FLAC是MPEG支持的格式,很多高质量的DVD和BD压缩出来的视频里都会用FLAC作为音频编码。因此通常情况下FLAC编码音频文件的后缀名是.flac,但有时你也能看到.m4a的后缀名。

APE/TAK

APE(Monkey’s Audio)和TAK(Tom’s lossless Audio Kompressor)都是能够提供非常高压缩率的编码器,但是他们俩都是闭源的。在电驴(VeryCD)时代用APE的人非常多,可能就是由于其较高的压缩率吧,但是APE的编码和解码相当慢。TAK的编码解码都很快,估计是利用了多线程或者AVX加速。另外还有一款编码器叫OptimFrog,能够提供最高的压缩率,但是编码和解码都奇慢无比,更像是个Proof of concept的作品,而且还不开源,实际使用就不要考虑了。

WavPack

这里隆重推荐我现在使用的WavPack。它开源、功能丰富、支持各种采样率位深和通道数,甚至支持DSD的编码,这个特性是别无二家了。

不过最吸引我的功能其实是支持混合编码(见后文)。WavPack由于其开源的特点,同样被各大音乐软件所支持,甚至ffmpeg和MKV视频容器都是支持WavPack的,不过MPEG-4仍然不支持比较遗憾。WavPack在硬件上支持可能没有FLAC广,但是WavPack的源码中同样包含了用汇编直接编写的几个核心函数,因此编解码的性能也是非常好的。

根据我的使用经验,WavPack有损音质好,无损体积小,编码也快,总之除了FLAC之外找WavPack就没错了!

混合(Hybrid)编码

除了有损无损之外还有一种编码方式是混合编码,它指的是编码器在生成有损压缩音频后还生成一个修正文件(Correction File)。当修正文件和本体音频同时存在时原始音频可以被无损还原。这个编码方式的好处是你可以同时拥有大体积的高音质文件和小体积的低音质文件,非常适合我这样的收藏党,文件本体放在云上,然后小体积的有损部分可以经常下载下来听。有损部分也可以用作demo,如果听了demo之后喜欢上这首音乐了再去下载修正文件提高音质。

支持混合编码的主要有三种音频格式:LossyWav,WavPack和OptimFrog,其中最后一种非常难用,而且好像和LossyWAV一样不支持无损播放,即需要先解码再播放才能达到无损音质。

LossyWAV

LossyWAV其实不算是一个完整的音频编码器,而是一个预处理软件。LossyWAV只能处理原始的PCM音频,然后生成的也是PCM音频,之后还需要使用其他的(无损)编码器来进行压缩。它的原理是分析原始音频,然后对其进行某种形式的变换使得音频更容易被压缩,从而降低生成的音频文件平均码率。由于这个变换是不可逆的,因此它也是有损压缩,但是LossyWAV支持生成修正文件,因此它可以看作一种混合编码方式。

经过以上描述,相信大家可以看出来编码过程非常麻烦,如果想要生成混合模式下的音频文件和修正文件,需要先从原始PCM音频生成有损PCM和修正PCM,然后再分别通过其他方式编码器将它们分别压缩,而无损解码的过程则是把他们反过来。因此LossyWAV在编解码速度和文件体积上都完全没有优势,并且这个原理也意味着LossyWav不支持无损播放。在能够选择WavPack的情况下还是不要用LossyWAV了。

WavPack

WavPack内置对混合模式的支持,而且WavPack支持无损播放。这意味着只要播放器能够找到修正文件,那么播放器就能直接以无损音质播放音乐而不需要额外解码。这个特性对我来说就是killer!另外从前文图表可以看出,WavPack在有损模式下也能够达到很好的音质水平,甚至在特定码率下比MP3和AAC都要好。唯一遗憾的地方是混合模式下WavPack音频总体的压缩率是比较低的,通常会比无损模式下的体积要高出5%左右。不过这个年头存储空间越来越不值钱了,所以这个问题也完全可以忽略。

总而言之我完全找不到理由不使用WavPack,再次向大家推荐这个编码器!


本文介绍了在ACG音乐收藏的过程中我了解到的音频编码知识,而在下一篇博客我还会介绍视频编码的内容~

参考资料:

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackedJimmy 设计,Jacob 修改