1. 程式人生 > >ffmpeg中的音訊樣本

ffmpeg中的音訊樣本

不僅限於ffmpeg,音訊取樣所得的PCM都含有三個要素:聲道(channel)、取樣率(sample rate)、樣本格式(sample format)。

 

聲道

當人聽到聲音時,能對聲源進行定位,那麼通過在不同的位置設定聲源,就可以造就出更好的聽覺感受,如果配合影像進行音訊位置的調整,則會得到更好的視聽效果。常見的聲道有:

  1. 單聲道,mono
  2. 雙聲道,stereo,最常見的型別,包含左聲道以及右聲道
  3. 2.1聲道,在雙聲道基礎上加入一個低音聲道
  4. 5.1聲道,包含一個正面聲道、左前方聲道、右前方聲道、左環繞聲道、右環繞聲道、一個低音聲道,最早應用於早期的電影院
  5. 7.1聲道,在5.1聲道的基礎上,把左右的環繞聲道拆分為左右環繞聲道以及左右後置聲道,主要應用於BD以及現代的電影院

如下是一個雙聲道的音訊系統

image

 

 

取樣率

音訊取樣,是把聲音從模擬訊號轉換為數字訊號。取樣率,就是每秒對聲音進行採集的次數,同樣也是所得的數字訊號的每秒樣本數。在對聲音進行取樣時,常用的取樣率有8k(電話)、44.1k(CD)、48k(視訊音軌)、96k/192k(Hi-Res)。

image

 

 

樣本格式

單個聲道的樣本的編碼型別

區別於前文所述的樣本,我們這裡為其添加了字首,特指單個聲道中的樣本。音訊在經過取樣得到樣本後,還需要對該樣本執行

兩個步驟

  1. 量化。音訊量化的量化位數常用的有8bit、16bit、32bit、64bit。
  2. 二進位制編碼。也就是把量化所得的結果,即單個聲道的樣本,以二進位制的碼字進行存放。其中有兩種存放方式:直接以整形來存放量化結果,即Two's complement code;以浮點型別來存放量化結果,即Floating point encoding code。兩者有如下關係: $\displaystyle{Q_{FLP} = \frac{Q_{INT}}{Q_{Range}}}$ 其中$Q_{Range}$代表該量化器的量化範圍,$Q_{INT}$量化器所得出的結果,$Q_{FLP}$則是該結果的浮點表示。量化器所得出的量化結果必定在量化範圍之內,因此從上面的式子可以看出,$Q_{FLP}$的絕對值必然小於等於1。

 

幀(frame)

音訊在量化得到二進位制的碼字後,需要進行變換,而變換(MDCT)是以塊為單位(block)進行的,一個塊由多個(120或128)樣本組成。而一幀內會包含一個或者多個塊。

幀的常見大小有960、1024、2048、4096等。

image

 

幀當中的樣本的組合方式

  1. 交錯(interleave)。以stereo為例,一個stereo音訊的樣本是由兩個單聲道的樣本交錯地進行儲存得到的。
  2. 平面(planar)。各個聲道的樣本分開進行儲存,。

image

 

ffmpeg中的樣本格式

enum AVSampleFormat {
    AV_SAMPLE_FMT_NONE = -1,
    AV_SAMPLE_FMT_U8,          ///< unsigned 8 bits
    AV_SAMPLE_FMT_S16,         ///< signed 16 bits
    AV_SAMPLE_FMT_S32,         ///< signed 32 bits
    AV_SAMPLE_FMT_FLT,         ///< float
    AV_SAMPLE_FMT_DBL,         ///< double

    AV_SAMPLE_FMT_U8P,         ///< unsigned 8 bits, planar
    AV_SAMPLE_FMT_S16P,        ///< signed 16 bits, planar
    AV_SAMPLE_FMT_S32P,        ///< signed 32 bits, planar
    AV_SAMPLE_FMT_FLTP,        ///< float, planar
    AV_SAMPLE_FMT_DBLP,        ///< double, planar
    AV_SAMPLE_FMT_S64,         ///< signed 64 bits
    AV_SAMPLE_FMT_S64P,        ///< signed 64 bits, planar

    AV_SAMPLE_FMT_NB           ///< Number of sample formats. DO NOT USE if linking dynamically
};

 

可見其中有U8(無符號整型8bit)、S16(整型16bit)、S32(整型32bit)、FLP(單精度浮點型別)、DBL(雙精度浮點型別)、S64(整型64bit),不以P為結尾的都是interleave結構,以P為結尾的是planar結構。