基本上來說,聲音壓縮的公式分成兩種,一種是無損壓縮(Lossless Compression),一種是有損壓縮(Lossy Compression)。
有損壓縮公式包括常見的MP3,還有Ogg Vorbis,WMA,AAC,Real Audio,Speex, MusePack.....等。
無損壓縮公式包括FLAC,Apple Lossless,WavPack,Monkey's Audio,OptimFROG, Shorten.....等。
WAVE也是無損的檔案格式,但是他「沒有」壓縮。
有損壓縮公式中,每一個格式所用的方法有出入,會造成同樣的bitrate下,有一些音質會比較好,有一些音質比較差。
這些壓縮公式裡面,內部都相當複雜,並不是說他有沒有該有的頻率,就可以決定是否聽的出差別,因為一個聲音裡面,每個頻率的聲音還有振幅跟像位差的差別。
當某一個有損壓縮公式在 x kbps的位元率,對大多數的聲音樣本都聽不出差別,那我們說個壓縮公式在 x kbps 是透明的(transparent at x kbps)。
對於有損壓縮公式,你所壓縮的聲音樣本,使用的設備,還有聆聽的測試者,都會影響透明的位元率。
對於有損壓縮方面的研究,我建議去一個國外的論壇看,這個論壇叫做Hydrogen Audio。 對於測試一個有損壓縮公式最好的方法,就是ABX盲測。 你可以使用Foobar2000 的ABX插件來做盲測。
對於無損壓縮,壓縮跟解壓縮後,內容都是一樣的,所以說,唯一的差別就是壓縮的比例,以及壓縮還有解壓縮時所需要用的運算能力,還有軟體的支援。
一般來說,FLAC是最常見的,因為他壓縮比例好,也有許多軟體支援,另外他解壓縮時不需要很強大的處理器。網路上面有許多無損壓縮公式的比較。 例如說Hydrogen Audio的wiki: http://ppt.cc/fDld
順便一題,CD的音樂格式是IEC 60908(a.k.a Red Book Audio Standard),他是由Sony以及Phillips所定立的。他用44100 Hz的雙聲道Pulse Code Modulation採樣率來收錄聲音,而且他「沒有」壓縮。
所以,CD的格式跟CD轉成WAV,FLAC.....等等都是相同的。 無論你用CD播音樂,還是用WAV/FLAC.....etc,音效卡的驅動程式所收到的資訊是「一模一樣」的。 唯一有可能差的,就是在轉換的過程,光碟機沒有讀到正確的資訊(灰塵或什麼的,真的不常發生),導致轉換的問題,不過這種一般都是壞掉的光碟機才會有的問題,一般, 只要你讀的到,那就沒問題了。
這個問題很有趣,譬如你的檔案是沒錯誤的 但你的DAC在轉換之間的變數卻太多太多.....在從CD上取出WAV後,無論如何轉換各種無損壓縮,從數位資料上的理論是相同的,但是取出來後之WAV與原先於CD上之音軌是否完全一樣,這才是關鍵。
所以問題在於取音軌所用的程式,然後轉換之各種無損格式之播放,是否能確實保證直接於光碟機播放CD時所讀取之音軌,類比波形完全相同?
(單純討論抓音軌部份之jitter,而非音效卡上之類比輸出後,因各項變因造成的波形改變)
如果一樣,那EAC是比WMP or iTunes等音訊軟體的抓軌能力強在哪裡?
確實,在早期的光碟機上面,這是一個問題,但是在現代的硬體上面(五年以內就算現代吧,我家還有200MB的SCSI硬碟.....)這不是一個問題。為什麼我這樣說呢,因為CD的結構上面,CD上面最基本的資料群是Frame,一個Frame裡面,有三十三個位元組,其中有二十四個是紀錄音樂,另外有八個紀錄除錯碼(Error Correction Code),這個八個碼,可以在一個Frame裡面的資料出問題的時候,運用進階的數學運算,從這八個除錯碼中,取得原本正確的資料。 最後一個位元組,叫做Subchannel data,是用來儲存歌名或是作者之類的,這一個位元組不在我們的討論範圍內。
*重點:只要資料毀損的不嚴重,系統能自動修復錯誤。就好像沒有錯過一樣。
在過去,由於運算能力有限,一般的光碟機,為了能夠以現時讀取音樂資料,他不做Error Correction的處理,而且以前的電腦沒有那麼進步,例如說連接光碟機用的IDE BUS只有四十條線 (現在每根之間加了一跟GND Shield => 80 pins),會因為電磁干擾而導致音樂資料毀損 (IDE也有CRC,不過還是會發生)。
這些軟體(Exact Audio Copy,EAC) (按此到EAC中文使用圖解教學),他所做的,就是當資料被讀出來的時候,他會用Error Correction Code來確認資料是否正確,而且,有的時候,他會多讀幾遍來確認。我用電腦到現在,沒有遇過一片光碟讀兩次內容不一樣的,有興趣的朋友,如果使用Linux,可以嘗試以下指令,多做幾遍看結果出來一不一樣:
dd if=/dev/cdrom | md5sum
如果Error Correction Code真的沒有辦法算出原本的資料,EAC或是任何有EAC的軟體會告訴你說有錯誤。 如果他沒說有錯誤,那你可以確定說,讀出來的確確實實是無誤的。
沒有留言:
張貼留言