FLAC(Free Lossless Audio Codec)是一種音訊無損壓縮(Lossless Compression)的編碼格式,有別於AAC或MP3等等的有損壓縮(Lossy Compression),採用FLAC編碼(Encode)之音訊的音質並不會有任何的損失,經過解碼(Decode)後能還原出原始的訊號。FLAC編碼/解碼(壓縮/解壓縮)的速度不算慢,可以將原始未壓縮的音訊縮小至先前一半左右的大小,並能在多種軟硬體環境下直接播放,支援最高32位元的取樣位元深度和任意的取樣頻率,是目前最流行的無損壓縮格式。相較於Monkey's Audio的APE無損壓縮格式,FLAC雖然在壓縮率上略為遜色,但它在播放時所耗用的CPU資源較小,同時也因其是開源格式的關係,許多產品都有支援。
在繼續瞭解FLAC之前,您必須要先知道FLAC「只是」FLAC的編/解碼器,它不能夠將FLAC格式的音樂檔案轉換成其他編碼的格式。而且,在一般情形下(無自帶額外解碼器),FLAC的編碼器只能夠讀取PCM(WAV)格式,如果要將其他格式的檔案轉成FLAC(例如APE轉成FLAC),必須配合其他工具一起使用才行!
安裝FLAC
基於Debian的Linux發行版執行以下指令來安裝:
基於紅帽的Linux發行版執行以下指令來安裝:
FLAC 使用方法
FLAC自帶文件
安裝好FLAC後,在終端機下輸入以下指令,可以查看FLAC的用法:
PCM(WAV)轉FLAC
將PCM(WAV)檔案轉成FLAC格式檔案的方式十分簡單,指令格式如下:
FLAC調整輸出的壓縮等級
FLAC雖然是無損壓縮,但它也可以在編碼時設定不同的壓縮等級(Compression Level),來控制壓縮程度。不管檔案被壓縮的多小,FLAC依然是屬於無損壓縮,這點非常重要哦!檔案大小的差異僅在於,被壓縮得愈小的FLAC檔案,在解碼(解壓縮)的時候愈需要更多的CPU資源來還原訊號。壓縮等級由數字來表示,範圍是0~8,數字愈大壓得愈小,預設值是5。如果要調整FLAC的壓縮等級,可以在編碼的參數加上--compression-level-#
或是-#
。如以下指令,可以編碼出最小的FLAC檔案:
FLAC的壓縮效果還算不錯,這裡拿一個長度為3分48秒,取樣位元深度為24位元,取樣頻率為96kHz的WAV檔案來舉例。
原始的WAV檔案大小為131.6MB。使用預設的壓縮等級(-5
)編碼出來的FLAC檔案,大小為69.9MB,幾乎快小了一半了。如果我們參考這篇文章,使用rar的最大壓縮設定來壓縮的話,壓縮出來的檔案為89.3MB,比FLAC還要大很多,而且還不能像FLAC一樣能直接被播放出來。因此如果您有保存音樂原始音質的嗜好的話,建議直接將原始訊號來源轉成FLAC格式,而不要直接使用一般的檔案壓縮格式。
使用FLAC最低的壓縮等級(-0
)編碼出來的FLAC檔案,大小為71.9MB,比預設的大了一些。使用FLAC最高的壓縮等級(-8)編碼出來的FLAC檔案,大小為69.5MB,只比預設的小了一點點。在絕大多數的情況下,使用預設的壓縮等級是最平衡的作法,檔案既不會太大,也不會耗用太多的CPU資源。
將這個WAV用APE的最大壓縮設定編碼出來的APE檔案,檔案大小為66.3MB,比使用FLAC最高壓縮等級編碼出來的FLAC檔案大小還要小了不少,相對地,在解碼時APE會比FLAC還需要更多的CPU資源。將這個WAV用ALAC(Apple Lossless Audio Codec)格式編碼出來的ALAC檔案,檔案大小為71.6MB,與FLAC檔案差不多。
FLAC轉PCM(WAV)
將FLAC格式檔案轉成PCM(WAV)檔案的方式十分簡單,多加個-d
(decode)參數即可,指令格式如下:
FLAC與其他解碼器合作
由於FLAC所支援的輸入格式有限,因此常會與其他解碼器一同工作,利用外部的解碼器將特殊格式的音樂檔進行解碼,再將解碼結果傳給LAME進行格式轉換的工作。在終端機預設的bash script下可以使用|
字元將兩個指令隔開在同一行中。字元|
左邊的指令輸出到標準輸出(stdout)中的資料,會成為字元|
右邊指令的標準輸入串流(stdin)。使用-
字元可以指定要使用標準輸入/輸出串流的參數位置。
APE(MAC)轉FLAC
APE(或是MAC)為Monkey's Audio的格式,在Linux上如果要進行解碼,得使用以下的非官方套件(基於Debian的Linux發行版):
使用以下指令可以將APE(或是MAC)格式的音樂檔案轉成FLAC音樂檔:
ALAC轉FLAC
必須要先有FFmpeg執行檔,可以參考這篇文章來取得。
使用以下指令可以將ALAC格式的音樂檔案轉成FLAC音樂檔:
經實測,FFmpeg無法直接透過標準輸入輸出與FLAC正常溝通,因此中間使用了alactemp.wav
作為轉檔過程中的暫存檔。另外,FFmpeg需使用-acodec
來指定輸出編碼格式,如果想使用24位元的取樣位元深度,就使用pcm_s24le
;如果想使用16位元的取樣位元深度,就使用pcm_s16le
。