1. 程式人生 > >從零開始學習音視訊程式設計技術(二) 音訊格式講解

從零開始學習音視訊程式設計技術(二) 音訊格式講解

1. 音訊簡介

    前面我們說過視訊有一個每秒鐘採集多少張的概念,這就叫做視訊的幀率。

    和視訊的幀率一樣的道理,聲音也有一個頻率,叫做取樣率。

  人對頻率的識別範圍是 20HZ - 20000HZ, 如果每秒鐘能對聲音做 20000 個取樣, 回放時就足可以滿足人耳的需求. 所以 22050 的取樣頻率是常用的, 44100已是CD音質, 超過48000的取樣對人耳已經沒有意義。這和電影的每秒 24 幀圖片的道理差不多。

   關於音訊經常見到這樣的描述:44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等.

   44100HZ 16bit stereo: 表示每秒鐘有 44100 次取樣, 取樣資料用 16 位(2位元組)記錄, 雙聲道(立體聲);

   22050HZ 8bit  mono: 表示每秒鐘有 22050 次取樣, 取樣資料用 8 位(1位元組)記錄, 單聲道;

   當然也可以有 16bit 的單聲道或 8bit 的立體聲, 等等。

上面的44100HZ代表的就是取樣率:

所謂取樣率是指:聲音訊號在“模→數”轉換過程中單位時間內取樣的次數。取樣值是指每一次取樣週期內聲音模擬訊號的積分值。

對於單聲道聲音檔案,取樣資料為八位的短整數(short int 00H-FFH);

而對於雙聲道立體聲聲音檔案,每次取樣資料為一個16位的整數(int),高八位(左聲道)和低八位(右聲道)分別代表兩個聲道。

  每個取樣資料記錄的是振幅, 取樣精度取決於儲存空間的大小:

   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次取樣組成的,如果是雙聲道的檔案,取樣資料按時間先後順序交叉地存入。如圖所示:

PCM的每個樣本值包含在一個整數i中,i的長度為容納指定樣本長度所需的最小位元組數。

首先儲存低有效位元組,表示樣本幅度的位放在i的高有效位上,剩下的位置為0,這樣8位和16位的PCM波形樣本的資料格式如下所示。

    樣本大小      資料格式            最小值    最大值

    8位PCM       unsigned int         0       225

    16位PCM      int                -32767    32767

這裡在學習的時候也沒有一下子理解過來。