音訊相關知識:聲道、取樣率、取樣位數、樣本格式、位元率
技術標籤:硬體音視訊技術集合
目錄
聲道
當人聽到聲音時,能對聲源進行定位,那麼通過在不同的位置設定聲源,就可以造就出更好的聽覺感受,如果配合影像進行音訊位置的調整,則會得到更好的視聽效果。常見的聲道有:
- 單聲道,mono
- 雙聲道,stereo,最常見的型別,包含左聲道以及右聲道
- 2.1聲道,在雙聲道基礎上加入一個低音聲道
- 5.1聲道,包含一個正面聲道、左前方聲道、右前方聲道、左環繞聲道、右環繞聲道、一個低音聲道,最早應用於早期的電影院
- 7.1聲道,在5.1聲道的基礎上,把左右的環繞聲道拆分為左右環繞聲道以及左右後置聲道,主要應用於BD以及現代的電影院
如下是一個雙聲道的音訊系統
取樣率
音訊取樣,是把聲音從模擬訊號轉換為數字訊號。取樣率,就是每秒對聲音進行採集的次數,同樣也是所得的數字訊號的每秒樣本數。在對聲音進行取樣時,常用的取樣率有:
8,000 Hz - 電話所用取樣率, 對於人的說話已經足夠
11,025 Hz - AM調幅廣播所用取樣率
22,050 Hz和24,000 Hz - FM調頻廣播所用取樣率
32,000 Hz - miniDV 數碼視訊 camcorder、DAT (LP mode)所用取樣率
44,100 Hz - 音訊 CD, 也常用於 MPEG-1 音訊(VCD, SVCD, MP3)所用取樣率
47,250 Hz - 商用 PCM 錄音機所用取樣率
50,000 Hz - 商用數字錄音機所用取樣率
96,000 或者 192,000 Hz - DVD-Audio、一些 LPCM DVD 音軌、BD-ROM(藍光碟)音軌、和 HD-DVD (高清晰度 DVD)音軌所用所用取樣率
2.8224 MHz - Direct Stream Digital 的 1 位 sigma-delta modulation 過程所用取樣率。
取樣越高,聲音的還原就越真實越自然,人對頻率的識別範圍是 20HZ - 20000HZ, 如果每秒鐘能對聲音做 20000 個取樣, 回放時就足可以滿足人耳的需求. 所以 22050 的取樣頻率是常用的, 44100已是CD音質, 超過48000的取樣對人耳已經沒有意義。這和電影的每秒 24 幀圖片的道理差不多。
取樣位數
音訊在經過取樣得到樣本後,還需要對該樣本執行兩個步驟:
1.量化。音訊量化的量化位數常用的有:
8bit(也就是1位元組) 只能記錄 256 個數, 也就是隻能將振幅劃分成 256 個等級;
16bit (也就是2位元組) 可以細到 65536 個數, 這已是 CD 標準了;
32bit(也就是4位元組) 能把振幅細分到 4294967296 個等級, 實在是沒必要了.
量化位數又叫做取樣位數、位深度、解析度,它是指聲音的連續強度被數字表示後可以分為多少級。N-bit的意思聲音的強度被均分為2^N級。16-bit的話,就是65535級。這是一個很大的數了,人可能也分辨不出六萬五千五百三十五分之一的音強差別。也可以說是音效卡的解析度,它的數值越大,解析度也就越高,所發出聲音的能力越強。這裡的取樣倍數主要針對的是訊號的強度特性,取樣率針對的是訊號的時間(頻率)特性這是兩個不一樣的概念。
2.二進位制編碼。也就是把量化所得的結果,即單個聲道的樣本,以二進位制的碼字進行存放。其中有兩種存放方式:
直接以整形來存放量化結果,即Two's complement code;
以浮點型別來存放量化結果,即Floating point encoding code。
大多數格式的PCM樣本資料使用整形來存放,而在對一些對精度要求高的應用方面,則使用浮點型來表示PCM 樣本資料。
幀
音訊在量化得到二進位制的碼字後,需要進行變換,而變換(MDCT)是以塊為單位(block)進行的,一個塊由多個(120或128)樣本組成。而一幀內會包含一個或者多個塊。幀的常見大小有960、1024、2048、4096等。一幀記錄了一個聲音單元,它的長度是樣本長度和聲道數的乘積。FFmpeg中AVFrame結構體中的nb_samples代表的就是一幀中單個聲道的音訊樣本數量。
樣本的組合方式
這個主要是針對雙聲道或多聲道音訊來說的,對於一個雙聲道音訊來說,它的組合方式可能有以下兩種:
- 交錯(interleaved)。以stereo為例,一個stereo音訊的樣本是由兩個單聲道的樣本交錯地進行儲存得到的。
- 平面(planar)。各個聲道的樣本分開進行儲存。
FFmpeg音訊解碼後的資料是存放在AVFrame結構中的。
Packed格式,frame.data[0]或frame.extended_data[0]包含所有的音訊資料中。
Planar格式,frame.data[i]或者frame.extended_data[i]表示第i個聲道的資料(假設聲道0是第一個), AVFrame.data陣列大小固定為8,如果聲道數超過8,需要從frame.extended_data獲取聲道資料。
樣本格式
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
};
說明:
1.U8(無符號整型8bit)、S16(整型16bit)、S32(整型32bit)、FLT(單精度浮點型別)、DBL(雙精度浮點型別)、S64(整型64bit),不以P為結尾的都是interleaved結構,以P為結尾的是planar結構。
2.Planar模式是FFmpeg內部儲存模式,我們實際使用的音訊檔案都是Packed模式的。
3.FFmpeg解碼不同格式的音訊輸出的音訊取樣格式不是一樣。測試發現,其中AAC解碼輸出的資料為浮點型的 AV_SAMPLE_FMT_FLTP格式,MP3解碼輸出的資料為 AV_SAMPLE_FMT_S16P格式(使用的mp3檔案為16位深)。具體取樣格式可以檢視解碼後的AVFrame中的format成員或解碼器的AVCodecContext中的sample_fmt成員。
位元率
每秒的傳輸速率(位速, 也叫位元率)。如705.6kbps 或 705600bps, 其中的 b 是 bit, ps 是每秒(per second)的意思,表示每秒705600bit的容量。壓縮的音訊檔案常常用倍速來表示,譬如達到CD音質的MP3是128kbps/44100HZ。注意這裡的單位是bit而不是Byte,一個Byte等於8個bit(位),bit是最小的單位,一般用於網路速度的描述和各種通訊速度,Byte則用於計算硬碟,記憶體的大小。
Mbps 即:Milionbit per second(百萬位每秒);
Kbps 即: Kilobit per second(千位每秒);
bps 即:bit per second (位每秒), 相應的換算關係為:
1Milionbit=1000Kilobit=1000000bit;1Mbps = 1000 000bps; 再次強調這裡是速度單位,指每秒傳輸的二進位制位數,資料傳輸速率的衡量單位K是十進位制含義,但資料儲存的K是二進位制含義。例如:
通常描述的1M頻寬就是1Mbps = 1000 000 bps = 1000 000 / 8 / 1000 = 125; 所以1M頻寬的下載速率一般不超過125KB/s
100M寬頻也就是100 000 000bps = 100 000 000 / 8 / 1000 / 1000 = 12.5, 所以100M頻寬的下載速率最大可達到12.5MB/s
當然了,以上只是理論速率,實際上最大的下載速率可能還達不到那麼多,主要還會受到各種損耗的影響,一般100MB寬頻下載速率能達到10MB就算不錯了。
取樣率、取樣位數、位元率三者之間的關係
例:根據一個檔案的大小推算出檔案時長
譬如 "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(秒). 這樣就比較精確了。也就是:
(檔案總大小 - 頭資訊)/ (取樣率 * 取樣位數 * 通道數 / 8) [也就是位元率]≈ 檔案時長。
參考連結:
1.音訊 屬性詳解(涉及取樣率、通道數、位數、位元率、幀等)
2.PCM資料格式
4.PCM音訊資料