不僅限於ffmpeg,音頻采樣所得的PCM都含有三個要素:聲道(channel)、采樣率(sample rate)、樣本格式(sample format)。
聲道
當人聽到聲音時,能對聲源進行定位,那么通過在不同的位置設置聲源,就可以造就出更好的聽覺感受,如果配合影像進行音頻位置的調整,則會得到更好的視聽效果。常見的聲道有:
- 單聲道,mono
- 雙聲道,stereo,最常見的類型,包含左聲道以及右聲道
- 2.1聲道,在雙聲道基礎上加入一個低音聲道
- 5.1聲道,包含一個正面聲道、左前方聲道、右前方聲道、左環繞聲道、右環繞聲道、一個低音聲道,最早應用於早期的電影院
- 7.1聲道,在5.1聲道的基礎上,把左右的環繞聲道拆分為左右環繞聲道以及左右后置聲道,主要應用於BD以及現代的電影院
如下是一個雙聲道的音頻系統
采樣率
音頻采樣,是把聲音從模擬信號轉換為數字信號。采樣率,就是每秒對聲音進行采集的次數,同樣也是所得的數字信號的每秒樣本數。在對聲音進行采樣時,常用的采樣率有8k(電話)、44.1k(CD)、48k(視頻音軌)、96k/192k(Hi-Res)。
樣本格式
單個聲道的樣本的編碼類型
區別於前文所述的樣本,我們這里為其添加了前綴,特指單個聲道中的樣本。音頻在經過采樣得到樣本后,還需要對該樣本執行兩個步驟:
- 量化。音頻量化的量化位數常用的有8bit、16bit、32bit、64bit。
-
二進制編碼。也就是把量化所得的結果,即單個聲道的樣本,以二進制的碼字進行存放。其中有兩種存放方式:直接以整形來存放量化結果,即Two's complement code;以浮點類型來存放量化結果,即Floating point encoding code。兩者有如下關系:$\displaystyle{Q_{FLT} = \frac{Q_{INT}}{X_{Range}}}$其中$X_{Range}$代表該量化器的量化范圍,$Q_{INT}$量化器所得出的結果,$Q_{FLT}$則是該結果的浮點表示。量化器所得出的量化結果必定在量化范圍之內,因此從上面的式子可以看出,$Q_{FLT}$的絕對值必然小於等於1。
幀(frame)
音頻在量化得到二進制的碼字后,需要進行變換,而變換(MDCT)是以塊為單位(block)進行的,一個塊由多個(120或128)樣本組成。而一幀內會包含一個或者多個塊。
幀的常見大小有960、1024、2048、4096等。
幀當中的樣本的組合方式
- 交錯(interleaved)。以stereo為例,一個stereo音頻的樣本是由兩個單聲道的樣本交錯地進行存儲得到的。
- 平面(planar)。各個聲道的樣本分開進行存儲,。
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)、FLT(單精度浮點類型)、DBL(雙精度浮點類型)、S64(整型64bit),不以P為結尾的都是interleaved結構,以P為結尾的是planar結構。