admin管理员组

文章数量:1583591

由于保存空间和数据传输速度的限制,我们可能没办法将很多声音完好无损地保存或是发送。声音是给人听的,但是人类的耳朵的听力有限,非常细微的信号差异其实感受不太出来,因此可以使用一些会改变原本声音频号的方式来将其重新编码(Encode)成和原始声音频号听起来差异不大的格式,减少保存声音频号所占用空间和加快发送声音频号时的速度,而这种压缩声音频号的方式就称为有损压缩(Lossy Compression)。有损压缩声音频号的方式有很多种,常见的格式为MP3、Ogg、AAC,另外还有比较后来才出现的HE-AAC、HE-AACv2、Opus格式。究竟这些格式哪些音质比较好,在不同条件下又应该要选择使用什么样的格式才适合,在本篇文章中将会实地进行转档测试,并将结果转成频谱来分类讨论。

有损音频压缩

有损压缩的原则

有损(Lossy)音频压缩,顾名思义就是将声音频号使用破坏性压缩,使用较少、有限的数据量来还原出接近原始的声音频号,以缩小保存声音频号所需的空间。

由于声音是给人听的,因此理论上只需要完美保留人类可以听得到、分辩得出来的信号,即便声音频号会改变,但实际听起来声音也还可以和原始的声音频号没有差别。声音是一种震动介质而产生出来的纵波,振幅愈大,音量愈大;频率愈高,音调愈高。人类的耳朵可捕捉到20~20,000赫兹(Hz)的声波。以人耳为基准,大于20,000Hz的波称为超声波(超音波);小于20Hz的波称为次声波。

虽然每个有损音频压缩的格式压缩声音频号的方式都不太一样,但大致上都会优先保留20~20,000Hz频率范围内的声音频号,再根据心理声学来调整声音频号,尽量减少压缩过的声音频号和原本信号听起来的差异。

压缩后的音质

相同的压缩格式在固定的采样频率(Sampling Rate)下,所使用的比特率(Bitrate)是影响声音频号音质的主要因素。比特率的单位常使用「每秒多少比特(bps, bits per seconds)」来表示,也就是每一秒的声音频号使用了多少个比特来保存。比特率愈高表示每秒可以保存的声音频号愈多,保存的声音频号愈多也就愈接近原始的声音频号,音质听起来自然会愈好。相反地,比特率愈少,表示每秒可以保存的声音频号愈少,必须要丢掉更多的原始声音频号才有办法保存,保存的声音频号就会和原始的声音频号愈差愈多,音质听起来自然会愈差。

虽然比特率愈高,可以使得压缩后的声音频号愈接近原始的声音频号,但比特率并不完全是愈高就愈好。使用高比特率来保存声音频号,相对地需要更多的保存空间。当比特率高到一个程度之后,实际听起来就已几乎和原始的声音频号没有差异了,此时再增加比特率,只是多浪费保存空间而已。

比特率不一定是固定的

压缩声音频号时所使用的比特率,大致上可分为「固定比特率(CBR, Constant Bitrate)」和「变动比特率(VBR, Variable Bitrate)」两种。

「固定比特率」顾名思义就是从头到尾都使用固定的比特率来保存声音频号,用这种方式所压缩出来的声音频号,虽然可以很容易控制其所占用的保存空间大小,但它的比特使用率将会是最差的。譬如很简单的声音,像是「哔──」,和复杂的声音,像是「哺吱喀─吱吱吱哺─喀吱」,都会使用固定的比特率来保存,有可能会造成简单的声音使用的比特率过高,或是复杂的声音使用的比特率过低,导致音质和占用的保存空间无法平衡。

而「变动比特率」基本上就没有这个问题存在,它可以根据声音频号的复杂度来自行决定该段声音所使用的比特率。这样的编码方式是比较有效率的,只是在编码的过程中会需要比较多的时间来计算。不同编码器(Encoder)计算变动比特率的方式皆有所不同,即使是在相同的变动比特率下,音质也可能会有很大的差异。因此建议使用公认较优良的编码器来进行编码,才可以达到较佳的成果。

声音压缩后所占用的保存空间

声音频号压缩后所需占用的保存空间,可以使用以下公式计算:

保存空间 = 平均比特率 * 声音长度

举个例子,长度为4分钟,比特率为128kbps的MP3文件,其所占用的保存空间计算方法如下:

保存空间 = 128kbps * 4 minutes = (128k bits / 1 second) * (4 minutes * (60 seconds / 1 minutes)) = (128k bits / 1 second) * 240 seconds = 30720k bits = 30720k bits / (8 bits / 1 byte) = 3840k bytes = 3840k / (1024k / 1M) bytes = 3.75M bytes = 3.75MB

经由以上算式得知,长度为4分钟,比特率为128kbps的MP3文件,其所占用的保存空间为3.75MB。

声音压缩前所占用的保存空间

看到这里您可能会很好奇声音压缩前所占用的保存空间要如何计算,在此就顺便说明一下。

未压缩的声音频号,会有很明确的采样频率(Sampling Rate)与采样深度(Sampling Depth)的数值。在文章前面有提到过,声音是一种震动介质而产生出来的纵波,它会在连续时间内让介质不间断地改变状态,因此在任意的瞬间点,介质都可以对应到某种状态,可将介质状态的变化以波形来表示。为了要使用有限的数字空间来记录不同时间点下的波形对应的数值,只好对声音进行「采样(Sampling)」,每隔一段时间才将该时间点下的波形数值(声音强度)记录下来。这个间隔的时间倒数,即为采样频率;而记录每个数值所使用的空间,即为采样深度。

采样频率常用的单位为「赫兹(Hz)」,表示每秒记录几次状态。如44100Hz,即表示每秒记录44100个时间点的状态。愈大的采样频率,愈可以还原出愈原始的声音波形。但是由于过高的频率对人类来说只是听不到的超音波,因此采样频率通常会接近两倍于人耳所能感受的最大声音频率,如44.1kHz或是48kHz。至于为什么采样频率要两倍于真实的最大声音频率,又为什么不直接使用40kHz作为采样频率呢?

根据奈奎斯特定理(Nyquist Theorem),采样频率两倍大于被采样信号的最大频率,即可重构出原始的被采样信号。但实际上,重构出原始信号所用来抗混叠(Anti-Aliasing)、消除某频率以上信号的低通滤波器(Low Pass Filter)并非是理想的,它有个过渡带宽(Transition Band)会导致在这个带宽内的信号仍被衰减通过。因此,如果采样频率不足于被采样信号的最大频率加上其低通滤波器的过渡带宽的两倍,最大频率附近的声音频号依然会有混叠现象,将会导致信号失真(Distortion)。为了完整保留最大声音频率,必须预留过度带宽,典型的过度带宽大小为2050Hz,这也是为何CD是使用44100Hz作为采样频率的原因,算法如下:

(20000Hz + 2050Hz) * 2 = 44100Hz

CD的44100Hz只是声音采样频率的「最低需求」,有些人可以稍微听到比20kHz还要高一点的频率,甚至还可以用耳朵之外的器官来感受超过20Khz的高频声音,因此也有在使用比44100Hz更高的采样频率,像是48000Hz或是96000Hz。当然,愈高的声音频率人类愈感受不到就是了。

采样深度常用的单位是「比特(bit)」,如16比特可以表示出216种不同的数值,也就是65536种不同的声音强度。虽然还有24bit甚至是32bit的采样深度,但一般人的耳朵连16比特的65536种不同的声音强度都不能完全分辨出来,基本上不太需要用到那么高的采样深度。

了解采样频率和采样深度之后,就可以算得出声音压缩前所占用的保存空间了,公式如下:

保存空间 = 采样频率 * 采样深度 * 声音长度 * 声道数

举个例子,长度为4分钟,采样频率为44100Hz,采样深度为16比特,双声道的WAV(PCM)文件,其所占用的保存空间计算方法如下:

保存空间 = 44100Hz * 16 bits * 4 minutes * 2 = (44100 / 1 second) * 16 bits * (4 minutes * (60 seconds / 1 minutes) * 2 = 705600 bits / second * 240 seconds = 169344000 bits = 169344000 / (8 bits / 1 byte) * 2 = 42336000 bytes = 42336000 / (1048576 / 1M) bytes ≒ 40.37MB

经由以上算式得知,长度为4分钟,采样频率为44100Hz,采样深度为16比特,双声道的WAV(PCM)文件,其所占用的保存空间约为40.37MB。

常见的压缩格式

有损音频压缩的格式有许多种,不同的有损音频压缩格式会使用不同的算法来对声音频号进行破坏压缩,因此各有不同的音质表现。

MP3

网络上最常流传的音乐格式为MP3(MPEG-1 Audio Layer 3),它可以大幅降低音频数据量,减少文件大小,方便传输。对于大多数的用户来说,经由MP3压缩后的音质和原本的音质差异并不大,但MP3文件大小却比源文件少占用了约4~10倍的空间,故能受到许多用户的青睐。

有关MP3格式的编码方式,可以参考以下文章:

Ogg

Ogg是开源、自由、免费的音频编码格式,没有麻烦的专利授权问题,也因此应用程序和游戏的音效很多都是使用Ogg格式来编码。

有关Ogg格式的编码方式,可以参考以下文章:

AAC

AAC(高端音频编码, Advanced Audio Coding)是基于MPEG-2的音频编码技术,用来取代MP3格式。相较于MP3格式,AAC支持更多的声道,更高的采样率和比特率,以及更精确的声音频号。本篇文章所提到的AAC如果没有特别说明,即表示AAC-LC。

有关AAC格式的编码方式,可以参考以下文章:

HE-AAC(AAC+)与HE-AACv2

HE-AAC(High-Efficiency AAC)是AAC加上SBR(Spectral Band Replication),用于低比特率的编码格式,HE-AACv2是AAC加上SBR和PS(Parametric Stereo),用于更低比特率的编码格式,两者都属于MPEG4的技术。

有关HE-AAC与HE-AACv2的编码方式,可以参考以下文章:

Opus

Opus是比MP3、OGG、AAC、HE-AAC(AAC+)还要新的音频编码格式,它集成了Skype开发的语音编码格式─SILK,与超低延迟的CELT(Constrained Energy Lapped Transform)编码格式,因此Opus非常适合用于即时地(Real-Time)的网络语音传输。

有关Opus的编码方式,可以参考以下文章:

既然有「有损压缩」,那有无损压缩吗?

有的。FLAC(Free Lossless Audio Codec)、ALAC(Apple Lossless)、APE(Monkey's Audio)和WMA Lossless(Windows Media Audio 9 Lossless)是近年非常受欢迎的格式,因为它们不会以破坏性数据压缩的方式来保存声音频号,而导致信号无法完整还原成原始的样子,使得播放出来的音乐会失真。而FLAC、ALAC、APE和WMA Lossless就不同了,它们采用无损压缩法(Lossless Compression),常称其为「无损压缩」,不会破坏原有的声音频号,能将声音频号压缩为原本的一半,但经过解码(Decode)也依然可以百分之百还原出原始的声音频号。

有关FLAC的编码方式,可以参考以下文章:

「音乐」是如何产生的?

一个规律、有周期性的声音称为乐音,反之则称为噪音。如果想知道音乐是如何产生,以及如何有音调、音量、音色上的变化,可以参考这里的文章:

MP3、Ogg、AAC、HE-AAC、HE-AACv2、Opus大比拼

接下来才是本篇文章的重头戏,笔者将会使用一个采样深度24比特,采样频率96kHz,长度为3分36秒,文件大小为124.9MB的WAV音乐档来实际对MP3、Ogg、AAC、HE-AAC、HE-AACv2和Opus格式进行转档测试。

测试用的音乐档

这个测试用的WAV音乐文件来自于这个网站,可以通过以下链接下载:

编码器

为了编码出不同格式的文件,笔者使用了多种不同的编码器。列表如下:FFmpeg 4.2.2:用来重新采样原始24比特96kHz的WAV文件,以及将重新采样的MP3转回WAV文件,以利频谱分析。

LAME 3.100:用来将16比特48kHz的WAV文件转成MP3文件。

Vorbis Tools 1.4.0:用来将24比特96kHz和16比特48kHz的WAV文件转成Ogg文件。

FAAC 1.29.7.7:用来将24比特96kHz和16比特48kHz的WAV文件转成采用AAC编码格式的M4A文件。

fdkaac 0.6.3 (libfdk-aac 0.1.5):用来将24比特96kHz和16比特48kHz的WAV文件转成采用AAC、HE-AAC、HE-AACv2编码格式的M4A文件。

Opus Tools 0.1.10 (libopus 1.1.2):用来将16比特48kHz的WAV文件转成Opus文件。

频谱分析工具

为了比较音乐文件之间的音质差异,笔者使用了一些软件来描绘出它们的频谱图,使我们可以直接从频谱图来比较音质差异。以下列出笔者所使用的工具:

Adobe Audition 2020:Adobe Audition会将所有单位时间下的声音频号,分别计算出不同频率下的信号强度,并以颜色来表示信号强度。

ImageDifferencer 1.0.2:ImageDifferencer可以比较Adobe Audition所截取的频谱图之间的差异。可以参考这篇文章来使用。

原始WAV文件的频谱

原始采样深度24比特,采样频率96kHz的WAV文件频谱如下:

不同的采样深度和采样频率下的WAV文件

在开始进行有损压缩之前,我们先使用FFmpeg转出不同采样深度和采样频率的WAV文件来比较看看。

16bit, 96kHz

将原始的声音频号保留原先的采样频率,但是将其采样深度从24比特降到16比特。其频谱如下:

使用ImageDifferencer,比较16bit, 96kHz的频谱图跟原始声音频号频谱图的差异,得到以下的结果:

从上图的乌漆墨黑可以发现,将采样深度从24比特降到16比特对频谱几乎完全没有影响,更不用说有听出其中的音质差异的可能了。我们之所以要采用24比特来录制音乐不是为了要让音质更好,而是要让声音更容易被后制。

16bit, 48kHz

基于以上理由,我们其实可以安心地声音频号的采样深度从24比特降到16比特,而不破坏音质。将原始的声音频号的采样深度从24比特降到16比特后,再将采样频率从96kHz降到48kHz。其频谱如下:

48kHz的声音频号经有损压缩后的比较

48kHz是MP3、Ogg、AAC、HE-AAC、HE-AACv2和Opus都支持的采样频率,也是目前较常见的采样频率。底下将实际转档测试在不同比特率下时,这些格式的频谱及音质表现。

536kbps

将FAAC的品质参数设置为最高的-q 5000。转换出来的M4A文件之平均变动比特率为536kbps,频谱如下:

同样使用ImageDifferencer,比较跟原始的声音频号频谱的差异,得到以下的结果:

从上图可以看出,FAAC把21kHz以上的信号几乎都丢掉了,并且21KHz以下的信号有明显的更动,看起来应该是时间上的改变,导致转档后的频谱无法跟原始频谱完

本文标签: 音频才是大比拼王者格式