一前言
現(xiàn)實生活中,我們聽到的聲音都是時間連續(xù)的,我們稱為這種信號叫模擬信號。模擬信號需要進(jìn)行數(shù)字化以后才能在計算機(jī)中使用。
目前我們在計算機(jī)上進(jìn)行音頻播放都需要依賴于音頻文件。那么音頻文件如何生成的呢?
音頻文件的生成過程是將聲音信息采樣、量化和編碼產(chǎn)生的數(shù)字信號的過程,我們?nèi)硕苈牭降穆曇纛l率范圍為(20Hz~20KHz),因此音頻文件格式的最大帶寬是20KHZ。
根據(jù)奈奎斯特的理論,音頻文件的采樣率一般在40~50KHZ之間。
奈奎斯特采樣定律,又稱香農(nóng)采樣定律,即:為了不失真地恢復(fù)模擬信號,采樣頻率應(yīng)該大于等于模擬信號頻譜中最高頻率的2倍。
二概念
聲音的本質(zhì)是一種能量波,由振動而產(chǎn)生的能量波,通過傳輸介質(zhì)傳輸出去。
聲音有三個屬性:
-
音調(diào):聲音頻率的高低,表示人的聽覺分辨一個聲音的調(diào)子高低的程度。音調(diào)主要由聲音的頻率決定,同時也與聲音強度有關(guān)。
-
音量:由“振幅”(amplitude)和人離聲源的距離決定,振幅越大響度越大。
-
音色:又稱聲音的品質(zhì),波形決定了聲音的音色。
波長是決定音調(diào)高低;振幅是決定音量高低;波紋是決定音色。
三PCM介紹
PCM(Pulse Code Modulation),即脈沖編碼調(diào)制技術(shù)。
由于我們?nèi)硕牭降穆曇艟鶠槟M信號,那么我們?nèi)绾螌⒙牭降男畔⒋鎯ζ饋砟??這就涉及到了PCM技術(shù)。
PCM技術(shù)就是把聲音從模擬信號轉(zhuǎn)化為數(shù)字信號的技術(shù),即對聲音進(jìn)行采樣、量化的過程,經(jīng)過PCM處理后的數(shù)據(jù),是最原始的音頻數(shù)據(jù),即未對音頻數(shù)據(jù)進(jìn)行任何的編碼和壓縮處理。
四PCM原理
脈沖編碼調(diào)制就是把一個時間連續(xù),取值連續(xù)的模擬信號變換成時間離散,取值離散的數(shù)字信號后在信道中傳輸。脈沖編碼調(diào)制就是對模擬信號先抽樣,再對樣值幅度量化,編碼的過程。
簡化來說:PCM脈沖編碼調(diào)制,以一個固定的頻率對模擬信號進(jìn)行采樣,并將采樣的信號按照一定精度進(jìn)行量化,最終量化后的值被輸出,記錄到存儲介質(zhì)中。
如下圖所示:
-
原始模擬音頻數(shù)據(jù)如下:
-
按照固定頻率進(jìn)行采樣,得到:
-
最后,對采樣后的數(shù)據(jù)選擇合適精度進(jìn)行量化:
五PCM相關(guān)概念
5.1采樣頻率
采樣頻率:單位時間內(nèi)對模擬信號的采樣次數(shù),它用赫茲(Hz)來表示。采樣頻率越高,聲音的還原就越真實越自然,當(dāng)然數(shù)據(jù)量就越大。采樣頻率一般共分為22.05KHz、44.1KHz、48KHz三個等級。
Tip:
5kHz的采樣率僅能達(dá)到人們講話的聲音質(zhì)量。
11kHz的采樣率是播放小段聲音的最低標(biāo)準(zhǔn),是CD音質(zhì)的四分之一。
22kHz采樣率的聲音可以達(dá)到CD音質(zhì)的一半,目前大多數(shù)網(wǎng)站都選用這樣的采樣率。
44kHz的采樣率是標(biāo)準(zhǔn)的CD音質(zhì),可以達(dá)到很好的聽覺效果。
48KHz:miniDV、數(shù)字電視、DVD、電影和專業(yè)音頻。
采樣位數(shù)(Sample Bits):又稱為采樣精度,量化級,也相當(dāng)于每個采樣點所能被表示的數(shù)據(jù)范圍。
采樣位數(shù)通常有8bits或16bits兩種,采樣位數(shù)越大,所能記錄聲音的變化度就越細(xì)膩,相應(yīng)的數(shù)據(jù)量就越大。
8bits為低品質(zhì),16bits為高品質(zhì),16bits最為常見。
5.3聲道數(shù)
聲道數(shù)(Channels):又稱為通道數(shù),指的是:能支持不同發(fā)聲的音響個數(shù),它是衡量音響設(shè)備的重要指標(biāo)之一。
Tip:
單聲道的聲道數(shù)為1個聲道;
雙聲道的聲道數(shù)為2個聲道;
立體聲道的聲道數(shù)默認(rèn)為2個聲道;
立體聲道(4聲道)的聲道數(shù)為4個聲道。
知道上面三個概念,我們就能夠計算出來一個原始的音頻文件所占用空間大小了。
$$空間大小(Byte)=采樣頻率(hz)*時長(s) * 采樣位數(shù)(bit)*聲道數(shù)/8
$$
量化: 量化就是通過四舍五入的方法將采樣后的模擬信號轉(zhuǎn)換成一種數(shù)字信號的過程。
對于采樣來說,就是在時間軸上對信號數(shù)字化;
對于量化來說,就是在幅度軸上對信號數(shù)字化
通過采樣時測的的模擬電壓值,要進(jìn)行分級量化,按整個電壓變化的最大幅度劃分成幾個區(qū)段,把落在某區(qū)段的采樣到的樣品值歸成一類,并給出相應(yīng)的量化值。
-
幀(Frame):一個聲音的基本數(shù)據(jù)單元,其長度為采樣位數(shù)和通道數(shù)的乘積。
-
周期(Period Size):音頻設(shè)備一次處理所需要的幀數(shù),對于音頻設(shè)備的數(shù)據(jù)訪問以及音頻數(shù)據(jù)的存儲,都是以此為單位。硬件緩沖傳輸單位,即完成這么多采樣幀的傳輸,就會回饋一個中斷。
-
Buffer Bytes: 一個應(yīng)用Buffer有多少個字節(jié),DMA緩沖區(qū)大小。
因為Buffer Size由應(yīng)用設(shè)置,其可大可小,若其太大,則傳輸?shù)难訒r太大,所以對此進(jìn)行分片,提出Period的概念。overrun,錄制時,數(shù)據(jù)都滿了,應(yīng)用來不及取走;underrun,需要數(shù)據(jù)來播放,應(yīng)用來不及寫入數(shù)據(jù)
-
Sign :表示樣本數(shù)據(jù)是否是有符號位
-
Byte Ordering:字節(jié)序,表明數(shù)據(jù)是小端(little-endian)存儲還是大端(big-endian)存儲,通常均為little-endian。
-
nteger Or Floating Point :整形或者浮點型,大多數(shù)格式的PCM樣本數(shù)據(jù)使用整形表示。
-
交錯模式:數(shù)字音頻信號存儲的方式。數(shù)據(jù)以連續(xù)幀的方式存放,即首先記錄第一幀的左聲道樣本和右聲道樣本,再開始第2幀的記錄…
-
非交錯模式: 首先記錄的是一個周期內(nèi)所有幀的左聲道樣本,再記錄所有右聲道樣本。
以FFmpeg中常見的PCM數(shù)據(jù)格式s16le為例:它描述的是有符號16位小端PCM數(shù)據(jù)。
s表示有符號,16表示位深,le表示小端存儲。
六PCM數(shù)據(jù)流
對于PCM數(shù)據(jù)都是一些文本化的描述,那么一段PCM格式的數(shù)據(jù)流怎么表示的呢?
以8-bit有符號為例,長得像這樣:
+---------+-----------+-----------+---- binary | 0010 0000 | 1010 0000 | ... decimal | 32 | -96 | ... +---------+-----------+-----------+----
每個分割符"|"分割字節(jié)。因為是 8-bit 有符號表示的采樣數(shù)據(jù),所以采樣的范圍為-128~128。
OK,對于PCM數(shù)據(jù)流的存儲而言,上面僅僅只是單聲道。對于多聲道的PCM數(shù)據(jù)而言,通常會交錯排列,就像這樣:
+---------+-----------+-----------+-----------+-----------+---- FL | FR | FL | FR | FL | +---------+-----------+-----------+-----------+-----------+----
對于8-bit有符號的PCM數(shù)據(jù)而言,上圖表示第一個字節(jié)存放第一個左聲道數(shù)據(jù)(FL),第二個字節(jié)放第一個右聲道數(shù)據(jù)(FR),第三個字節(jié)放第二個左聲道數(shù)據(jù)(FL)…
七編碼
一個完整的音頻,經(jīng)過采樣和量化后的信號,需要將它轉(zhuǎn)化為數(shù)字編碼脈沖,這一過程稱為編碼。
編碼簡單來說,就是按一定格式記錄采樣和量化后的數(shù)字?jǐn)?shù)據(jù)。
PCM技術(shù)僅僅包含采樣和量化,并不包含編碼部分,這里僅簡單介紹。
7.1音頻編碼協(xié)議ACC
AAC(Advanced Audio Coding)高級音頻編碼,是一種聲音數(shù)據(jù)的文件壓縮格式。AAC分為ADIF和ADTS兩種文件格式。
-
ADIF(Audio Data Interchange Format):音頻數(shù)據(jù)交換格式。這種格式的特征是只有音頻數(shù)據(jù)最前面具有頭字節(jié),音頻數(shù)據(jù)流中間沒有頭字節(jié)。因此它的解碼只能在頭字節(jié)處開始進(jìn)行。故這種格式常用在磁盤文件中。
-
ADTS(Audio Data Transport Stream):音頻數(shù)據(jù)傳輸流。這種格式的特征是它每一單元音頻數(shù)據(jù)都有一個header字節(jié),解碼可以在這個流中任何位置開始。
PCM數(shù)據(jù)是最原始的音頻數(shù)據(jù),完全無損,所以PCM數(shù)據(jù)雖然音質(zhì)優(yōu)秀但體積龐大,為了解決這個問題先后誕生了一系列的音頻格式,這些音頻格式運用不同的方法對音頻數(shù)據(jù)進(jìn)行壓縮,其中有無損壓縮和有損壓縮兩種。
-
無損壓縮:將數(shù)據(jù)壓縮之后,通過解碼還能還原成與原始數(shù)據(jù)一模一樣的數(shù)據(jù)為無損壓縮。
-
ALAC、APE、FLAC
-
有損壓縮:消除冗余信息,如人耳能聽到的聲音為20Hz - 20000Hz 以內(nèi),所以可以將此范圍外的聲音去除掉。
-
MP3、AAC、OGG、WMA
其他概念
-
碼率:(也成位速、比特率) 是指在一個數(shù)據(jù)流中每秒鐘能通過的信息量,代表了壓縮質(zhì)量。
比如MP3常用碼率有128kbit/s、160kbit/s、320kbit/s等等,越高代表著聲音音質(zhì)越好。
MP3中的數(shù)據(jù)有ID3和音頻數(shù)據(jù)組成,ID3用于存儲歌名、演唱者、專輯、音軌等我們可以常見的信息。
$$
碼率 = 采樣率 * 采樣位數(shù) * 聲道數(shù)
$$
例如:
如果是CD音質(zhì),采樣率44.1KHz,采樣位數(shù)16bit,立體聲(雙聲道), 碼率 = 44.1 * 1000 * 16 * 2 = 1411200bps = 176400Bps,那么錄制一分鐘的音樂, 大概176400 * 1 * 60 / 1024 / 1024 =10.09MB。
-
音頻幀: 音頻數(shù)據(jù)是流式的,本身沒有明確的一幀幀的概念,在實際的應(yīng)用中,為了音頻算法處理/傳輸?shù)姆奖?,一般約定俗成取2.5ms~60ms為單位的數(shù)據(jù)量為一幀音頻。