ffmpeg中的音訊樣本
阿新 • • 發佈:2018-11-02
不僅限於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_{FLP} = \frac{Q_{INT}}{Q_{Range}}}$ 其中$Q_{Range}$代表該量化器的量化範圍,$Q_{INT}$量化器所得出的結果,$Q_{FLP}$則是該結果的浮點表示。量化器所得出的量化結果必定在量化範圍之內,因此從上面的式子可以看出,$Q_{FLP}$的絕對值必然小於等於1。
幀(frame)
音訊在量化得到二進位制的碼字後,需要進行變換,而變換(MDCT)是以塊為單位(block)進行的,一個塊由多個(120或128)樣本組成。而一幀內會包含一個或者多個塊。
幀的常見大小有960、1024、2048、4096等。
幀當中的樣本的組合方式
- 交錯(interleave)。以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)、FLP(單精度浮點型別)、DBL(雙精度浮點型別)、S64(整型64bit),不以P為結尾的都是interleave結構,以P為結尾的是planar結構。