1. 音頻簡介
經常見到這樣的描述: 44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等.
44100HZ 16bit stereo: 每秒鐘有 44100 次採樣, 採樣數據用 16 位(2字節)記錄, 雙聲道(立體聲);
22050HZ 8bit mono: 每秒鐘有 22050 次採樣, 採樣數據用 8 位(1字節)記錄, 單聲道;
當然也可以有 16bit 的單聲道或 8bit 的立體聲, 等等。
採樣率是指:聲音信號在“模→數”轉換過程中單位時間內採樣的次數。採樣值是指每一次採樣週期內聲音模擬信號的積分值。
對於單聲道聲音文件,採樣數據爲八位的短整數(short int 00H-FFH);
而對於雙聲道立體聲聲音文件,每次採樣數據爲一個16位的整數(int),高八位(左聲道)和低八位(右聲道)分別代表兩個聲道。
人對頻率的識別範圍是 20HZ - 20000HZ, 如果每秒鐘能對聲音做 20000 個採樣, 回放時就足可以滿足人耳的需求. 所以 22050 的採樣頻率是常用的, 44100已是CD音質, 超過48000的採樣對人耳已經沒有意義。這和電影的每秒 24 幀圖片的道理差不多。
每個採樣數據記錄的是振幅, 採樣精度取決於儲存空間的大小:
1 字節(也就是8bit) 只能記錄 256 個數, 也就是隻能將振幅劃分成 256 個等級;
2 字節(也就是16bit) 可以細到 65536 個數, 這已是 CD 標準了;
4 字節(也就是32bit) 能把振幅細分到 4294967296 個等級, 實在是沒必要了.
如果是雙聲道(stereo), 採樣就是雙份的, 文件也差不多要大一倍.
這樣我們就可以根據一個 wav 文件的大小、採樣頻率和採樣大小估算出一個 wav 文件的播放長度。
譬如 “Windows XP 啓動.wav” 的文件長度是 424,644 字節, 它是 “22050HZ / 16bit / 立體聲” 格式(這可以從其 “屬性->摘要” 裏看到),
那麼它的每秒的傳輸速率(位速, 也叫比特率、取樣率)是 22050*16*2 = 705600(bit/s), 換算成字節單位就是 705600/8 = 88200(字節/秒),
播放時間:424644(總字節數) / 88200(每秒字節數) ≈ 4.8145578(秒)。
但是這還不夠精確, 包裝標準的 PCM 格式的 WAVE 文件(*.wav)中至少帶有 42 個字節的頭信息, 在計算播放時間時應該將其去掉,
所以就有:(424644-42) / (22050*16*2/8) ≈ 4.8140816(秒). 這樣就比較精確了.
關於聲音文件還有一個概念: “位速”, 也有叫做比特率、取樣率, 譬如上面文件的位速是 705.6kbps 或 705600bps, 其中的 b 是 bit, ps 是每秒的意思;
壓縮的音頻文件常常用位速來表示, 譬如達到 CD 音質的 MP3 是: 128kbps / 44100HZ.
2. PCM數據格式
PCM(Pulse Code Modulation)也被稱爲 脈碼編碼調製。PCM中的聲音數據沒有被壓縮,如果是單聲道的文件,採樣數據按時間的先後順序依次存入。(它的基本組織單位是BYTE(8bit)或WORD(16bit))
一般情況下,一幀PCM是由2048次採樣組成的( 參 http://discussion.forum.nokia.com/forum/showthread.php?129458-請問PCM格式的音頻流,每次讀入或輸出的塊的大小是必須固定爲4096B麼&s=e79e9dd1707157281e3725a163844c49 )。
如果是雙聲道的文件,採樣數據按時間先後順序交叉地存入。如圖所示:
PCM的每個樣本值包含在一個整數i中,i的長度爲容納指定樣本長度所需的最小字節數。
首先存儲低有效字節,表示樣本幅度的位放在i的高有效位上,剩下的位置爲0,這樣8位和16位的PCM波形樣本的數據格式如下所示。
樣本大小 數據格式 最小值 最大值
8位PCM unsigned int 0 225
16位PCM int -32767 32767