由於儲存空間和資料傳輸速度的限制,我們可能沒辦法將很多聲音完好無損地保存或是傳送。聲音是給人聽的,但是人類的耳朵的聽力有限,非常細微的訊號差異其實感受不太出來,因此可以使用一些會改變原本聲音訊號的方式來將其重新編碼(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檔案,其所佔用的儲存空間計算方法如下:
經由以上算式得知,長度為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作為取樣頻率的原因,算法如下:
CD的44100Hz只是聲音取樣頻率的「最低需求」,有些人可以稍微聽到比20kHz還要高一點的頻率,甚至還可以用耳朵之外的器官來感受超過20Khz的高頻聲音,因此也有在使用比44100Hz更高的取樣頻率,像是48000Hz或是96000Hz。當然,愈高的聲音頻率人類愈感受不到就是了。
取樣深度常用的單位是「位元(bit)」,如16位元可以表示出216種不同的數值,也就是65536種不同的聲音強度。雖然還有24bit甚至是32bit的取樣深度,但一般人的耳朵連16位元的65536種不同的聲音強度都不能完全分辨出來,基本上不太需要用到那麼高的取樣深度。
了解取樣頻率和取樣深度之後,就可以算得出聲音壓縮前所佔用的儲存空間了,公式如下:
舉個例子,長度為4分鐘,取樣頻率為44100Hz,取樣深度為16位元,雙聲道的WAV(PCM)檔案,其所佔用的儲存空間計算方法如下:
經由以上算式得知,長度為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格式的編碼方式,可以參考以下文章:
FAAC不太穩定,不再使用
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格式進行轉檔測試。
測試用的音樂檔
編碼器
為了編碼出不同格式的檔案,筆者使用了多種不同的編碼器。列表如下:
- 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以下的訊號有明顯的更動,看起來應該是時間上的改變,導致轉檔後的頻譜無法跟原始頻譜完全對齊。不過從前幾秒的頻譜差異來看,21KHz以下的訊號幾乎完全被保留下來了,所以才會呈現一片黑。
502kbps
將Opus Tools的opusenc
,設置最大的變動位元率參數--bitrate 512
可以轉出其所能支援的最高音質。轉換出來的Opus檔案之平均變動位元率為502kbps,頻譜如下:
將FAAC的品質參數設置為-q 3800
,轉換出來的M4A檔案之平均變動位元率為502kbps,頻譜如下:
比較以上同樣為502kbps的AAC和Opus的聲音訊號跟原始的聲音訊號頻譜的差異,得到以下的結果:
Opus
從上圖可以看出,雖然Opus把20.1kHz以上的聲音訊號完全過濾掉,但它近乎完美地把低於20.1kHz以下的聲音訊號保留住了!
AAC
FAAC在502kbps的頻譜表現則和536kbps時差異不大,完全聽不出差異。
在502kbps下,Opus和AAC的音質幾乎一樣。
443kbps
將Vorbis Tools的oggenc
,設置最大的變動位元率參數-b 500
可以轉出其所能支援的最高音質。轉換出來的Ogg檔案之平均變動位元率為443kbps,頻譜如下:
將Opus Tools的opusenc
的變動位元率參數設置為--bitrate 442
,轉換出來的Opus檔案之平均變動位元率為443kbps,頻譜如下:
將FAAC的品質參數設置為-q 2320
,轉換出來的M4A檔案之平均變動位元率為443kbps,頻譜如下:
比較以上同樣為443kbps的Ogg、AAC和Opus的聲音訊號跟原始的聲音訊號頻譜的差異,得到以下的結果:
Ogg
從上圖可以看到,Ogg格式在一定程度上保留了19kHz以上,甚至到22kHz的聲音訊號,且它在19kHz以下的聲音訊號幾乎完美地保留了原始聲音訊號。
AAC
FAAC在443kbps的頻譜表現則和536kbps時差異不大,完全聽不出差異。
Opus
Opus在443kbps的頻譜表現則和502kbps時差異不大,完全聽不出差異。
在443kbps下,音質的排序是,Ogg>AAC=Opus。
320kbps
使用LAME音質最高的內建配置--preset insane
可以轉出其所能支援的最高音質。轉換出來的MP3檔案之固定位元率為320kbps,頻譜如下:
將Vorbis Tools的oggenc
的變動位元率參數設置為-b 333
,轉換出來的Ogg檔案之平均變動位元率為320kbps,頻譜如下:
將Opus Tools的opusenc
的變動位元率參數設置為--bitrate 312
,轉換出來的Opus檔案之平均變動位元率為320kbps,頻譜如下:
將FAAC的品質參數設置為-q 770
,轉換出來的M4A檔案之平均變動位元率為320kbps,頻譜如下:
比較以上同樣為320kbps的MP3、Ogg、Opus和AAC的聲音訊號跟原始的聲音訊號頻譜的差異,得到以下的結果:
MP3
從上圖可以看出,雖然LAME把20.5kHz以上的聲音訊號幾乎完全過濾掉,但它其實從16kHz開始頻譜就已經有明顯的變化。
Ogg
從上圖可以看到,Ogg格式在一定程度上保留了18kHz以上,甚至到21kHz的聲音訊號,不過它在18kHz以下的聲音訊號已經開始與原始聲音訊號有稍微不同了。
Opus
從上圖可以看出,雖然Opus把20.1kHz以上的聲音訊號完全過濾掉,但它幾乎把低於20.1kHz以下的聲音訊號都保留住了!
AAC
由於FAAC會改變聲音訊號的時間,我們只能從前幾秒的頻譜來做參考。從上圖可以看到在11kHz以上時,聲音訊號便已和原始聲音訊號有點不同了。
所以在320kbps下,音質的排序是,Opus>Ogg=AAC>MP3。
252kbps
使用LAME音質次高的內建配置--preset extreme
可以轉出其所能支援的最高變動位元率音質。轉換出來的MP3檔案之平均變動位元率為252kbps,頻譜如下:
將Vorbis Tools的oggenc
的變動位元率參數設置為-b 272
,轉換出來的Ogg檔案之平均變動位元率為252kbps,頻譜如下:
將Opus Tools的opusenc
的變動位元率參數設置為--bitrate 243
,轉換出來的Opus檔案之平均變動位元率為252kbps,頻譜如下:
將FAAC的品質參數設置為-q 395
,轉換出來的M4A檔案之平均變動位元率為252kbps,頻譜如下:
比較以上同樣為252kbps的MP3、Ogg、Opus和AAC的聲音訊號跟原始的聲音訊號頻譜的差異,得到以下的結果:
MP3
從上圖可以看出,MP3在252kbps變動位元率下16kHz以上的訊號要比320kbps固定位元率變化要來得大很多。
Ogg
從上圖可以看到,Ogg格式在一定程度上保留了18kHz以上到20kHz的聲音訊號,不過它在18kHz以下的聲音訊號已經開始與原始聲音訊號明顯不同了。
Opus
從上圖可以看出,Opus把20.1kHz以上的聲音訊號完全過濾掉,且20.1kHz以下的聲音訊號只與原始聲音訊號稍微不同而已!
AAC
由於FAAC會改變聲音訊號的時間,我們只能從前幾秒的頻譜來做參考。從上圖可以看到在8kHz以上時,聲音訊號便已和原始聲音訊號有點不同了,尤其是在13kHz以上時變化更為明顯。
所以在252kbps下,音質的排序是,Opus>Ogg=AAC>MP3。看起來Ogg著重在中低頻的保留,而AAC則著重在低頻的保留。
242kbps
將fdkaac的變動位元率等級參數設置為最高的-m 5
,並將規格參數設置為-p 2
(AAC-LC),可以輸出fdkaac所能支援在變動位元率下AAC-LC的最高音質。轉換出來的M4A檔案之平均變動位元率為242kbps,頻譜如下:
將FAAC的品質參數設置為-q 355
,轉換出來的M4A檔案之平均變動位元率為242kbps,頻譜如下:
將Vorbis Tools的oggenc
的變動位元率參數設置為-b 262
,轉換出來的Ogg檔案之平均變動位元率為242kbps,頻譜如下:
將Opus Tools的opusenc
的變動位元率參數設置為--bitrate 233
,轉換出來的Opus檔案之平均變動位元率為252kbps,頻譜如下:
比較以上同樣為242kbps的AAC、Ogg和Opus的聲音訊號跟原始的聲音訊號頻譜的差異,得到以下的結果:
AAC
fdkaac轉出的聲音訊號跟原始的聲音訊號頻譜的差異如下圖:
fdkaac轉出的聲音訊號的似乎完全與原始聲音訊號無法對齊,無法參考差異圖。
FAAC轉出的聲音訊號跟原始的聲音訊號頻譜的差異如下圖:
242kbps位元率下的FAAC之中高頻衰減要比252kbps位元率下的FAAC要來得明顯。
直接從頻譜圖來觀察的話,可以發現fdkaac轉出的聲音保留了高頻訊號,且在11kHz以上的訊號有明顯的衰減現象。實際聽起來,FAAC轉出來的聲音更為渾厚好聽,應該是保留較多中低頻訊號的關係。
Ogg
242kbps位元率下的Ogg之全頻段差異比252kbps位元率下的Ogg要來得明顯一些。
Opus
242kbps位元率下的Opus之全頻段差異比252kbps位元率下的Opus要來得明顯一些。
所以在242kbps下,音質的排序是,Opus>Ogg=AAC。
186kbps
使用LAME的內建配置--preset standard
,轉換出來的MP3檔案之平均變動位元率為186kbps,頻譜如下:
將Vorbis Tools的oggenc
的變動位元率參數設置為-b 195
,轉換出來的Ogg檔案之平均變動位元率為186kbps,頻譜如下:
將Opus Tools的opusenc
的變動位元率參數設置為--bitrate 176
,轉換出來的Opus檔案之平均變動位元率為186kbps,頻譜如下:
將FAAC的品質參數設置為-q 194
,轉換出來的M4A檔案之平均變動位元率為186kbps,頻譜如下:
比較以上同樣為186kbps的MP3、Ogg、Opus和AAC的聲音訊號跟原始的聲音訊號頻譜的差異,得到以下的結果:
MP3
從上圖可以看出,LAME把16kHz以上的聲音訊號幾乎完全過濾掉了,但16kHz以下的訊號保留得還算不錯。高音的地方聽起來會有壓縮感。
Ogg
從上圖可以看到,Ogg格式在一定程度上保留了17.5kHz以上到18.5kHz的聲音訊號,而且它在17.5kHz以下的聲音訊號已經與原始聲音訊號有明顯不同了。此時的Ogg在16kHz以下的表現不如MP3。不過實際聽起來還是Ogg的臨場感更好,比較好聽。
Opus
186kbps位元率下的Opus之全頻段差異比242kbps位元率下的Opus要來得明顯一些。此時的Opus在16kHz以下的表現不如MP3。不過實際聽起來還是Opus的臨場感更好,比較好聽。
AAC
186kbps位元率下的AAC之全頻段差異比242kbps位元率下的AAC要來得明顯一些,尤其是中高頻的部份,且此時AAC的中高頻訊號已經受損嚴重,整體聽起來的感覺不如Ogg了。
所以在186kbps下,音質的排序是,Opus>Ogg>AAC>MP3。
150kbps ~ 151kbps
使用LAME的內建配置--preset medium
,轉換出來的MP3檔案之平均變動位元率為151kbps,頻譜如下:
將Vorbis Tools的oggenc
的變動位元率參數設置為-b 159
,轉換出來的Ogg檔案之平均變動位元率為151kbps,頻譜如下:
將Opus Tools的opusenc
的變動位元率參數設置為--bitrate 141
,轉換出來的Opus檔案之平均變動位元率為150kbps,頻譜如下:
將FAAC的品質參數設置為-q 134
,轉換出來的M4A檔案之平均變動位元率為151kbps,頻譜如下:
比較以上同樣為150kbps或151kbps的MP3、Ogg、Opus和AAC的聲音訊號跟原始的聲音訊號頻譜的差異,得到以下的結果:
MP3
從上圖可以看出,LAME把16kHz以上的聲音訊號幾乎完全過濾掉了,且13.7kHz ~ 16kHz的訊號也有很大的衰減,但13.7kHz以下的訊號保留得還算不錯。高音的地方聽起來會很有壓縮感。
Ogg
從上圖可以看到,Ogg格式在一定程度上保留了17kHz以上到18kHz的聲音訊號,而且它在17kHz以下的聲音訊號已經與原始聲音訊號有明顯不同了,尤其是11.5kHz以上的訊號更是如此。此時的Ogg在13.7kHz以下的表現不如MP3。不過實際聽起來還是Ogg的臨場感更好,比較好聽。
Opus
150kbps位元率下的Opus之全頻段差異比186kbps位元率下的Opus要來得明顯一些。此時的Opus在13.7kHz以下的表現稍遜於MP3。實際聽Opus的臨場感明顯更好,比較好聽。
AAC
151kbps位元率下的AAC之全頻段差異比186kbps位元率下的AAC要來得明顯一些,尤其是中高頻的部份。
所以在150kbps ~ 151kbps下,音質的排序是,Opus>Ogg>AAC>MP3。
122kbps ~ 125kbps
將fdkaac的變動位元率等級參數設置為最高的-m 5
,並將規格參數設置為-p 5
(HE-AAC),可以輸出fdkaac所能支援在變動位元率下HE-AAC的最高音質。轉換出來的M4A檔案之平均變動位元率為122kbps,頻譜如下:
將LAME的品質參數設定為-V 5
,轉換出來的MP3檔案之平均變動位元率為125kbps,頻譜如下:
將Vorbis Tools的oggenc
的變動位元率參數設置為-b 122
,轉換出來的Ogg檔案之平均變動位元率為122kbps,頻譜如下:
將Opus Tools的opusenc
的變動位元率參數設置為--bitrate 113
,轉換出來的Opus檔案之平均變動位元率為122kbps,頻譜如下:
將FAAC的品質參數設置為-q 98
,轉換出來的M4A檔案之平均變動位元率為122kbps,頻譜如下:
比較以上同樣為122kbps ~ 125kbps的HE-AAC、MP3、Ogg、Opus和AAC的聲音訊號跟原始的聲音訊號頻譜的差異,得到以下的結果:
HE-AAC
fdkaac轉出的聲音訊號的似乎完全與原始聲音訊號無法對齊,無法參考差異圖。
直接從頻譜圖來觀察的話,可以發現fdkaac轉出的HE-AAC會保留高頻訊號到22kHz,且全頻段都沒有太明顯的衰減現象。
MP3
從上圖可以看出,LAME把16kHz以上的聲音訊號幾乎完全過濾掉了,且13.7kHz ~ 16kHz的訊號也有極大的衰減,另外在11.5kHz ~ 13.7kHz的訊號也有很大的衰減,但11.5kHz以下的訊號保留得還算不錯。中、高音的地方聽起來會很有壓縮感。
Ogg
從上圖可以看到,Ogg格式在一定程度上保留了16kHz以上到18kHz的聲音訊號,而且它在16kHz以下的聲音訊號已經與原始聲音訊號有明顯不同了,尤其是7kHz以上的訊號更是如此,但7kHz以下的訊號保留得還算不錯。
Opus
122kbps位元率下的Opus之全頻段差異比150kbps位元率下的Opus要來得明顯一些,尤其是16kHz以上的部份。此時的Opus在7kHz以下的表現稍遜於MP3和Ogg。
AAC
122kbps位元率下的AAC之全頻段差異比151kbps位元率下的AAC要來得明顯一些,尤其是中高頻的部份已經衰減到嚴重影響音質了,聽起來壓縮感十足。
實際試聽,在122kbps ~ 125kbps下,音質的排序是,Opus=HE-AAC>Ogg>MP3>AAC。
93kbps ~ 96kbps
將fdkaac的變動位元率等級參數設置為-m 4
,並將規格參數設置為-p 5
(HE-AAC),轉換出來的M4A檔案之平均變動位元率為94kbps,頻譜如下:
將LAME的品質參數設定為-V 7
,轉換出來的MP3檔案之平均變動位元率為96kbps,頻譜如下:
將Vorbis Tools的oggenc
的變動位元率參數設置為-b 104
,轉換出來的Ogg檔案之平均變動位元率為94kbps,頻譜如下:
將Opus Tools的opusenc
的變動位元率參數設置為--bitrate 87
,轉換出來的Opus檔案之平均變動位元率為93kbps,頻譜如下:
將FAAC的品質參數設置為-q 67
,轉換出來的M4A檔案之平均變動位元率為94kbps,頻譜如下:
比較以上同樣為93kbps ~ 96kbps的HE-AAC、MP3、Ogg、Opus和AAC的聲音訊號跟原始的聲音訊號頻譜的差異,得到以下的結果:
HE-AAC
fdkaac轉出的聲音訊號的似乎完全與原始聲音訊號無法對齊,無法參考差異圖。
直接從頻譜圖來觀察的話,可以發現fdkaac轉出的HE-AAC會保留高頻訊號到22kHz,且在16kHz和8.5kHz左右的頻段有明顯衰減現象。
MP3
從上圖可以看出,LAME把15.2kHz以上的聲音訊號幾乎完全過濾掉了,且12.5kHz ~ 15.2kHz的訊號也有極大的衰減,另外在10kHz ~ 12.5kHz的訊號也有很大的衰減,10kHz以下的訊號與原始聲音訊號也有明顯的不同。
Ogg
從上圖可以看到,Ogg格式把16.8kHz以上的聲音訊號幾乎完全過濾掉了,而且在16.8kHz以下的聲音訊號與原始聲音訊號明顯不同。
Opus
93kbps位元率下的Opus之全頻段差異比122kbps位元率下的Opus要來得明顯一些。
AAC
94kbps位元率下的AAC之全頻段差異比122kbps位元率下的AAC要來得明顯一些,尤其是中高頻的部份早就已經衰減到嚴重影響音質了,聽起來壓縮感十足。
實際試聽,在93kbps ~ 96kbps下,音質的排序是,Opus>HE-AAC>Ogg>MP3>AAC。
64kbps ~ 74kbps
將fdkaac的變動位元率等級參數設置為最高的-m 5
,並將規格參數設置為-p 29
(HE-AACv2),可以輸出fdkaac所能支援在變動位元率下HE-AACv2的最高音質。轉換出來的M4A檔案之平均變動位元率為64kbps,頻譜如下:
將fdkaac的變動位元率等級參數設置為-m 2
,並將規格參數設置為-p 5
(HE-AAC),轉換出來的M4A檔案之平均變動位元率為74kbps,頻譜如下:
將LAME的品質參數設定為-V 9
,轉換出來的MP3檔案之平均變動位元率為69kbps,頻譜如下:
將Vorbis Tools的oggenc
的變動位元率參數設置為-b 73
,轉換出來的Ogg檔案之平均變動位元率為64kbps,頻譜如下:
將Opus Tools的opusenc
的變動位元率參數設置為--bitrate 60
,轉換出來的Opus檔案之平均變動位元率為64kbps,頻譜如下:
將FAAC的品質參數設置為-q 33
,轉換出來的M4A檔案之平均變動位元率為64kbps,頻譜如下:
比較以上同樣為64kbps ~ 74kbps的HE-AACv2、HE-AAC、MP3、Ogg、Opus和AAC的聲音訊號跟原始的聲音訊號頻譜的差異,得到以下的結果:
HE-AACv2
fdkaac轉出的聲音訊號的似乎完全與原始聲音訊號無法對齊,無法參考差異圖。
直接從頻譜圖來觀察的話,可以發現fdkaac轉出的HE-AACv2會保留高頻訊號到20.3kHz,13.7kHz以上開始有些頻段有被衰減的現象(呈條紋狀)。
HE-AAC
fdkaac轉出的聲音訊號的似乎完全與原始聲音訊號無法對齊,無法參考差異圖。
直接從頻譜圖來觀察的話,可以發現fdkaac轉出的HE-AAC會保留高頻訊號到22kHz,且全頻段依舊都沒有太明顯的衰減現象。
MP3
從上圖可以看出,LAME把10kHz以上的聲音訊號幾乎完全過濾掉了,但10kHz以下的訊號保留得還算不錯。已經沒有中高頻的部份,讓整首音樂聽起來都很有壓縮感。
Ogg
從上圖可以看到,Ogg格式把15.7kHz以上的聲音訊號幾乎完全過濾掉了,而且在15.7kHz以下的聲音訊與原始聲音訊號明顯不同。中、高音的地方聽起來會有壓縮感。
Opus
64kbps位元率下的Opus之全頻段差異比93kbps位元率下的Opus要來得明顯一些。
AAC
64kbps位元率下的AAC之全頻段差異比94kbps位元率下的AAC要來得明顯一些。
實際試聽,在64kbps ~ 74kbps下,音質的排序是,Opus>HE-AACv2>HE-AAC>Ogg>MP3>AAC。
48kHz的聲音訊號經有損壓縮後的比較結果
在這個測試中,位元率443kbps左右就差不多是最頂的音質了,因此可以認為音質最好的有損格式為Ogg。但是,當位元率在320kbps以下時,Opus格式的表現都不會比其它格式要來的差,它充分地將人耳聽得到的聲音訊號平均地保留住,不會跟MP3、AAC和Ogg一樣,為了保留低頻而丟了高頻;也不會跟HE-AAC和HE-AACv2一樣,為了保留高頻而丟了中、低頻。然而,Opus只支援48kHz的取樣頻率,如果聲音訊號本身的取樣頻率就低於48kHz,重新取樣後,Opus會多花一些儲存空間來儲存聲音訊號。同樣地,如果聲音訊號本身的取樣頻率高於48kHz,重新取樣後,Opus就會把高頻的部份整個過濾掉。
許多人認為AAC的音質比Ogg來的好,但筆者的測試結果是Ogg比AAC還要來得好。也許可能有人會質疑筆者使用的FAAC和fdkaac編碼器品質不好,其實不然,筆者也試過Nero AAC Codec,它們在AAC-LC的表現都不如FAAC。至於iTunes和QAAC轉AAC-LC的效果就不知道有沒有比FAAC好了,筆者手邊沒有macOS和Windows系統能做測試。
HE-AAC和HE-AACv2只適合在低位元率下使用,可以用來取代低位元率下音質甚至會比MP3還要來的差的AAC(AAC-LC)。
如果要用位元率,在48kHz取樣頻率的條件下來選擇適當的有損壓縮格式的話,可以這樣選:
小於或等於320kbps:Opus
懶得選擇的話,通通都用Opus也可以。
96kHz的聲音訊號經有損壓縮後的比較
只有Ogg、AAC、HE-AAC和HE-AACv2能支援96kHz的取樣頻率。底下將實際轉檔測試在不同位元率下時,這些格式的頻譜及音質表現。
762kbps
將FAAC的品質參數設置為最高的-q 5000
。轉換出來的M4A檔案之平均變動位元率為762kbps,頻譜如下:
同樣使用ImageDifferencer,比較跟原始的聲音訊號頻譜的差異,得到以下的結果:
FAAC似乎會改變聲音訊號的時間,導致轉檔後的頻譜無法跟原始頻譜完全對齊。不過從前幾秒的頻譜差異來看,所有的訊號幾乎完全被保留下來了,所以才會呈現一片黑。
467kbps
將Vorbis Tools的oggenc
,設置最大的變動位元率參數-q 10
可以轉出其所能支援的最高音質。轉換出來的Ogg檔案之平均變動位元率為467kbps,頻譜如下:
將FAAC的品質參數設置為-q 1077
,轉換出來的M4A檔案之平均變動位元率為467kbps,頻譜如下:
比較以上同樣為467kbps的AAC和Ogg的聲音訊號跟原始的聲音訊號頻譜的差異,得到以下的結果:
Ogg
從上圖可以看到,Ogg格式在一定程度上保留了19kHz以上,甚至到22kHz的聲音訊號,且它在19kHz以下的聲音訊號完美地保留了原始聲音訊號。
AAC
從前幾秒的頻譜差異來看,所有的訊號幾乎完全被保留下來了。
在467kbps下,由於人耳聽得到的部份,也就是20kHz以下的聲音訊號Ogg保留得比較好,因此Ogg的音質聽起來會比AAC來得好。
346kbps
將fdkaac的變動位元率等級參數設置為最高的-m 5
,並將規格參數設置為-p 2
(AAC-LC),可以輸出fdkaac所能支援在變動位元率下AAC-LC的最高音質。轉換出來的M4A檔案之平均變動位元率為346kbps,頻譜如下:
將FAAC的品質參數設置為-q 445
,轉換出來的M4A檔案之平均變動位元率為346kbps,頻譜如下:
將Vorbis Tools的oggenc
的變動位元率參數設置為-q 9.12
,轉換出來的Ogg檔案之平均變動位元率為346kbps,頻譜如下:
比較以上同樣為346kbps的AAC和Ogg的聲音訊號跟原始的聲音訊號頻譜的差異,得到以下的結果:
AAC
fdkaac轉出的聲音訊號跟原始的聲音訊號頻譜的差異如下圖:
fdkaac轉出的聲音訊號的似乎完全與原始聲音訊號無法對齊,無法參考差異圖。
FAAC轉出的聲音訊號跟原始的聲音訊號頻譜的差異如下圖:
346kbps位元率下的FAAC之中高頻衰減要比467kbps位元率下的FAAC要來得明顯。
直接從頻譜圖來觀察的話,可以發現fdkaac轉出的聲音訊號不會保留23.5kHZ以上的高頻訊號,這點很好,畢竟留著高頻訊號人耳也聽不到。實際與FAAC轉出的聲音訊號做試聽比較的話,其實聽不出二者的差異。不過由於FAAC留了太多人耳聽不到的高頻訊號,或許fdkaac的音質是比較好的。
Ogg
從上圖可以看到,Ogg格式在一定程度上保留了18kHz以上,甚至到21kHz的聲音訊號,且它在18kHz以下的聲音訊號完美地保留了原始聲音訊號。
從頻譜上來看,在346kbps下,AAC的音質表現和Ogg應是差不多的。
194kbps ~ 196kbps
將fdkaac的變動位元率等級參數設置為最高的-m 5
,並將規格參數設置為-p 5
(HE-AAC),可以輸出fdkaac所能支援在變動位元率下HE-AAC的最高音質。轉換出來的M4A檔案之平均變動位元率為196kbps,頻譜如下:
將FAAC的品質參數設置為-q 115
,轉換出來的M4A檔案之平均變動位元率為196kbps,頻譜如下:
將Vorbis Tools的oggenc
的變動位元率參數設置為-q 5.99
,轉換出來的Ogg檔案之平均變動位元率為194kbps,頻譜如下:
比較以上同樣為194kbps ~ 196kbps的HE-AAC、AAC和Ogg的聲音訊號跟原始的聲音訊號頻譜的差異,得到以下的結果:
HE-AAC
fdkaac轉出的聲音訊號的似乎完全與原始聲音訊號無法對齊,無法參考差異圖。
直接從頻譜圖來觀察的話,可以發現fdkaac轉出的HE-AAC會保留高頻訊號到25kHz,且全頻段都沒有太明顯的衰減現象。
AAC
196kbps位元率下的AAC之全頻段差異比346kbps位元率下的AAC要來得明顯一些,尤其是中高頻的部份,且此時AAC的中高頻訊號已經受損嚴重,整體聽起來的感覺不如Ogg了。
Ogg
從上圖可以看到,Ogg格式把18kHz以上的聲音訊號幾乎完全過濾掉了,而且在18kHz以下的聲音訊號已經與原始聲音訊號明顯不同了。
實際試聽,在194kbps ~ 196kbps下,音質的排序是,HE-AAC>Ogg>AAC(FAAC)。
129kbps
將fdkaac的變動位元率等級參數設置為-m 4
,並將規格參數設置為-p 5
(HE-AAC),轉換出來的M4A檔案之平均變動位元率為129kbps,頻譜如下:
將fdkaac的變動位元率等級參數設置為-m 3
,並將規格參數設置為-p 2
(AAC-LC),轉換出來的M4A檔案之平均變動位元率為129kbps,頻譜如下:
將FAAC的品質參數設置為-q 53
,轉換出來的M4A檔案之平均變動位元率為129kbps,頻譜如下:
將Vorbis Tools的oggenc
的變動位元率參數設置為-q 3.45
,轉換出來的Ogg檔案之平均變動位元率為129kbps,頻譜如下:
比較以上同樣為129kbps的HE-AAC、AAC和Ogg的聲音訊號跟原始的聲音訊號頻譜的差異,得到以下的結果:
HE-AAC
fdkaac轉出的聲音訊號的似乎完全與原始聲音訊號無法對齊,無法參考差異圖。
直接從頻譜圖來觀察的話,可以發現fdkaac轉出的HE-AAC會保留高頻訊號到25kHz,且在20kHz和14kHz左右的頻段有些許衰減現象。
AAC
fdkaac轉出的聲音訊號跟原始的聲音訊號頻譜的差異如下圖:
fdkaac轉出的聲音訊號的似乎完全與原始聲音訊號無法對齊,無法參考差異圖。
FAAC轉出的聲音訊號跟原始的聲音訊號頻譜的差異如下圖:
FAAC轉出的聲音訊號在129kbps位元率下之全頻段差異比在196kbps位元率下要來得明顯一些。此時已讓整首音樂聽起來都很有壓縮感。
直接從頻譜圖來觀察的話,可以發現fdkaac轉出的聲音訊號不會保留14.2kHZ以上的高頻訊號。實際與FAAC轉出的聲音訊號做試聽比較的話,fdkaac轉出的AAC比FAAC轉出來的AAC音質要好得多,但還是不如Ogg。
Ogg
從上圖可以看到,Ogg格式把18kHz以上的聲音訊號完全過濾掉了,而且在18kHz以下的聲音訊號與原始聲音訊號有著更明顯的不同。
實際試聽,在129kbps下,音質的排序是,HE-AAC>Ogg>AAC。
112kbps ~ 115kbps
將fdkaac的變動位元率等級參數設置為最高的-m 5
,並將規格參數設置為-p 29
(HE-AACv2),可以輸出fdkaac所能支援在變動位元率下HE-AACv2的最高音質。轉換出來的M4A檔案之平均變動位元率為115kbps,頻譜如下:
將fdkaac的變動位元率等級參數設置為-m 1
,並將規格參數設置為-p 2
(AAC-LC),轉換出來的M4A檔案之平均變動位元率為115kbps,頻譜如下:
將FAAC的品質參數設置為-q 43
,轉換出來的M4A檔案之平均變動位元率為115kbps,頻譜如下:
將Vorbis Tools的oggenc
的變動位元率參數設置為-q 2.99
,轉換出來的Ogg檔案之平均變動位元率為112kbps,頻譜如下:
比較以上同樣為112kbps ~ 115kbps的HE-AACv2、AAC和Ogg的聲音訊號跟原始的聲音訊號頻譜的差異,得到以下的結果:
HE-AACv2
fdkaac轉出的聲音訊號的似乎完全與原始聲音訊號無法對齊,無法參考差異圖。
直接從頻譜圖來觀察的話,可以發現fdkaac轉出的HE-AACv2會保留高頻訊號到24kHz。
AAC
fdkaac轉出的聲音訊號跟原始的聲音訊號頻譜的差異如下圖:
fdkaac轉出的聲音訊號的似乎完全與原始聲音訊號無法對齊,無法參考差異圖。
FAAC轉出的聲音訊號跟原始的聲音訊號頻譜的差異如下圖:
FAAC轉出的聲音訊號在115kbps位元率下之全頻段差異比在129kbps位元率下要來得明顯一些。
直接從頻譜圖來觀察的話,可以發現fdkaac轉出的聲音訊號不會保留13kHZ以上的高頻訊號。實際與FAAC轉出的聲音訊號做試聽比較的話,fdkaac轉出的AAC比FAAC轉出來的AAC音質要好得多,但還是不如Ogg。
Ogg
從上圖可以看到,Ogg格式把17.5kHz以上的聲音訊號完全過濾掉了,而且在17.5kHz以下的聲音訊號與原始聲音訊號明顯不同。
實際試聽,在112kbps ~ 115kbps下,音質的排序是,HE-AACv2>Ogg>AAC。
95kbps ~ 96kbps
將fdkaac的變動位元率等級參數設置為-m 4
,並將規格參數設置為-p 29
(HE-AACv2),轉換出來的M4A檔案之平均變動位元率為94kbps,頻譜如下:
將fdkaac的變動位元率等級參數設置為-m 3
,並將規格參數設置為-p 5
(HE-AAC),轉換出來的M4A檔案之平均變動位元率為95kbps,頻譜如下:
將FAAC的品質參數設置為-q 94
,轉換出來的M4A檔案之平均變動位元率為67kbps,頻譜如下:
將Vorbis Tools的oggenc
的變動位元率參數設置為-q 1.8
,轉換出來的Ogg檔案之平均變動位元率為94kbps,頻譜如下:
比較以上同樣為94kbps ~ 95kbps的HE-AACv2、HE-AAC、AAC和Ogg的聲音訊號跟原始的聲音訊號頻譜的差異,得到以下的結果:
HE-AACv2
fdkaac轉出的聲音訊號的似乎完全與原始聲音訊號無法對齊,無法參考差異圖。
直接從頻譜圖來觀察的話,可以發現fdkaac轉出的HE-AACv2會保留高頻訊號到24kHz,且在12kHz ~ 17kHz的頻段有明顯衰減的現象。
HE-AAC
fdkaac轉出的聲音訊號的似乎完全與原始聲音訊號無法對齊,無法參考差異圖。
直接從頻譜圖來觀察的話,可以發現fdkaac轉出的HE-AAC會保留高頻訊號到26kHz,且在21kHz和14kHz左右的頻段有些許衰減現象。
AAC
94kbps位元率下的AAC之全頻段差異比115kbps位元率下的AAC要來得明顯一些。
Ogg
從上圖可以看到,Ogg格式把16.5kHz以上的聲音訊號完全過濾掉了,而且在16.5kHz以下的聲音訊號與原始聲音訊號明顯不同。
實際試聽,在94kbps ~ 95kbps下,音質的排序是,HE-AAC>HE-AACv2>Ogg>AAC。
96kHz的聲音訊號經有損壓縮後的比較結果
高位元率時,最接近原始聲音訊號的格式為AAC,但是AAC保留太多無用的超音波,對音質完全沒有幫助,反而導致人耳聽得到的中低頻部份和原始聲音訊號有所差異。而Ogg的頻譜雖然看起來和原始聲音訊號的頻譜差異很大,但它卻完美保留住人耳聽的到的頻率範圍,因此在這個測試中,可以認為音質最好的有損格式為Ogg。這樣的情形一直在下降至200kbps以上都還是一樣,音質方面Ogg都是比AAC還要來的好。
但是到了低位元率時,Ogg和AAC就會開始完全過濾掉人耳聽得到聲音頻率,此時著重於保留高頻訊號的HE-AAC的音質就要好很多。HE-AACv2如HE-AAC同樣也有保留高頻訊號,但是可能是HE-AACv2高頻的部份保留太多吧,它在人耳更敏感的中頻段的聲音訊號反而有明顯衰減的現象,導致HE-AAC聽起來的音質較佳。
如果要用位元率,在96kHz取樣頻率的條件下來選擇適當的有損壓縮格式的話,可以這樣選:
小於200kbps:HE-AAC
雖然這篇文章沒有測試到,但如果位元率非常低(< 56kbps),用HE-AACv2應是較好的選擇。
結果總結
只要位元率足夠高,Ogg可以說是在這個不同取樣頻率的測驗中音質最好的有損音訊壓縮格式,它的取樣頻率也還可以支援到192kHz,比AAC的96kHz上限還多了兩倍。
很多人可能會覺得應該要是AAC奪冠才對,網路上的資料不是都說AAC才是最好的有損音訊壓縮格式嗎?其實筆者覺得還是要根據位元率來選擇適當的AAC的Profile,像是在300kbps左右的時候,AAC-LC和Ogg的音質其實是差不多的,而在200kbps以下時,HE-AAC和HE-AACv2就會比Ogg要來得好。Ogg是比較無腦的格式,給它多少位元率就有多少表現,簡單易用,而且還是免費、開源的。
另外,新穎的Opus格式在48kHz的取樣頻率中表現非常優異,完全沒有儲存超音波的問題,位元的使用率極高。故能在中低位元率的時候,音質遠勝其它有損壓縮格式。