文章目錄
- 一、前言
- 二、概述
- 三、音頻相關概念
- 1、采樣率(Sampling rate)
- 2、位深度(Bit depth)
- 3、比特率(Bit rate)
- 4、聲道(Audio channel)
- 5、音頻幀
- 6、音頻編碼
- 7、音頻解碼
一、前言
嵌入式音視頻開發過程中涉及到的音視頻相關概念有很多,本文對音頻一些常見的術語和概念進行詳細的介紹和總結。
二、概述
如何采集聲音?
通過模數轉換原理,聲音模數轉換是將聲音信號從模擬形式轉換為數字形式的過程。它是數字聲音處理的基礎,常用于語音識別、音頻編碼等應用中。
為什么音視頻采集完之后,不能直接傳輸,要進行編碼?
在音視頻采集完之后,通常不會直接傳輸原始數據,而是要經過編碼處理,主要原因有以下幾個:
?
數據量過大: 原始音視頻數據量非常龐大。例如,未經壓縮的高清(1080p)視頻,每秒的數據量可以達到數百MB,即使是未經壓縮的音頻數據也會占用較大的帶寬。直接傳輸這些數據會占用過多的網絡資源,甚至可能無法進行實時傳輸。
?
帶寬限制: 大多數網絡環境(尤其是互聯網或無線傳輸環境)都存在帶寬限制。將原始數據進行壓縮編碼可以大幅減少數據量,從而使得在有限的帶寬內能夠流暢地傳輸音視頻數據。
?
存儲空間: 原始音視頻數據的存儲需求極大,經過編碼壓縮后,可以顯著減少所需的存儲空間,使得數據更易于存儲和管理。
?
傳輸可靠性和錯誤恢復: 編碼協議中往往包含糾錯和恢復機制,能夠在傳輸中出現數據丟失或錯誤時進行恢復,確保接收到的音視頻數據質量。這是原始數據所不具備的優勢。
?
兼容性和標準化: 編碼格式通常是標準化的,這意味著不同設備和平臺之間可以互相兼容。例如,H.264是廣泛應用的視頻編碼標準,不同的設備和軟件都可以編碼和解碼這種格式的數據,提高了互操作性。
?
實時性要求: 為了滿足實時傳輸的需求,編碼算法可以進行優化,使數據傳輸和解碼過程更為迅速,從而減少延時。這在實時通信(如視頻通話、直播)中尤為重要。
?
安全性和版權保護: 編碼過程中可以加入加密和數字版權管理(DRM)措施,保護數據的安全性和版權。這在商業應用和版權保護方面具有重要意義。
?
綜合以上原因,對于大部分應用場景來說,通過編碼壓縮方式傳輸音視頻數據既節省了傳輸帶寬和存儲空間,同時又能保證數據傳輸的效率和可靠性。因此音視頻在采集完之后,通常都需要進行一定的編碼處理,再進行傳輸。
三、音頻相關概念
1、采樣率(Sampling rate)
當我們想要數字化的記錄聲音時,需要將聲音的模擬信號轉換成數字信號,這個過程就是采樣。采樣率指的是在單位時間內(每一秒)采集的樣本數量,通常用赫茲(Hz)表示。例如44100Hz,指的就是每秒采樣數為44100,也常被簡稱為44.1KHz。
藍色代表模擬音頻信號,紅色的點代表采樣得到的量化數值。采樣頻率越高,紅色的間隔就越密集。
具體來說,采樣率越高,數字化的聲音信號就越接近原始聲音,所以采樣率越高聲音質量就越好,但是數字化文件的大小也會越大。常見的采樣率有8kHz、16kHz、44.1kHz、48kHz等。語音通話、監控攝像頭等,這些場景下,音頻采樣率一般只有8KHz,這個頻率雖然聽音樂是一種折磨,會一卡一卡的,但是對聽清別人說話倒是一點問題沒有。
2、位深度(Bit depth)
位深度,也叫位寬,采樣精度,單位為Bit。上圖中,每一個紅色的采樣點,都需要用一個數值來表示大小,這個數值的數據類型大小可以是:4bit、8bit、16bit、24bit等等,位數越多,則位深度越大,記錄的樣本數據精度就越高,表示得就越精細,聲音質量自然就越好,當然,數據量也會成倍增大。
位深影響信號的信噪比和動態范圍,也決定了文件的大小,理論上來說,位深越高,質量越好,同時其所生成的文件也越大。
筆者借用網絡上看過的一個總結:聲波,有頻率和振幅,頻率高低決定音調,振幅大小決定響度,采樣率是對頻率采樣,位深是對振幅采樣。
3、比特率(Bit rate)
比特率俗稱碼率。顧名思義,比特率就是Bit的速率的意思,意思為單位時間內(每一秒)傳輸或處理的Bit的數量。比如一個單聲道,用44.1KHz/16Bit的配置來說,它的比特率就為 44100*16*1=705600,單位是bit/s,因為通常計算出來的數字都比較大,大家就用kbit/s了,也就是705.6kbit/s(也有人用bps,或者kbps來當比特率的單位,意思是一樣的,bps是比特/秒(bits per second)的縮寫,表示每秒鐘傳輸的比特數)。
何為比特數?就是比特率乘以時長即可。1Byte(字節)等于8個Bit。通常情況下,文件大小的算法是這樣的,比如,所選擇的采樣率為44100,位深為16Bit,單軌道,時長為60s,則Bits(比特數)的值為44100*16*1*60=42336000,然后我們再將Bits(比特數)轉換成Byte(字節),直接除以8等于5292000個Byte,有了Byte我們就可以將其轉換成KB或者M(結果大約是5168KB,5M左右)。
計算公式:Bits(比特數) = 采樣率 x 位深 x 通道數 x 時長
以上計算的是不壓縮的原始音頻數據。
4、聲道(Audio channel)
聲道,是指在不同空間位置錄制或播放聲音時采集或播放的獨立音頻信號。通俗的講就是:聲道數就是聲源個數。比如:單聲道(Mono),采集源只有一個;雙聲道也稱為立體聲(Stereo),采集源有兩個,分別為左和右;多聲道即環繞聲(Surround Sound),采集源有多個。
每個聲道的聲音樣本都會單獨記錄,一般雙聲道的采樣數是單聲道的兩倍,多聲道同理。在數字音頻處理中,立體聲(左右通道)的采樣數據可以有不同的排列方式,具體取決于音頻文件的格式和存儲標準。這里是兩種常見的排列方式:
交錯排列(Interleaved):
在交錯排列方式中,左右通道的采樣數據是交替存儲的,每個通道的采樣點依次排在一起。這是最常見的一種格式,廣泛應用于WAV、AIFF等音頻文件中。
例如,對于一個包含4個采樣點的立體聲樣本,數據排列如下:
數據在內存中的實際排列方式為:L1, R1, L2, R2, L3, R3, L4, R4。
?
非交錯排列或平面排列(Non-Interleaved or Planar):
在這種方式中,每個通道的數據是連續存儲的,即所有左通道的數據存儲在一起,然后是所有右通道的數據。某些專業音頻處理軟件和格式(如某些版本的FLAC)可能會使用這種方式。
使用相同的例子,數據排列如下:
數據在內存中的實際排列方式為:L1, L2, L3, L4, R1, R2, R3, R4。
?
以上兩個排列方式各有優缺點,交錯排列方式通常在播放和處理過程中更具效率,因為其數據連續性可以減少緩存缺失(cache miss)。而非交錯排列方式可能在某些批處理或信號處理算法中略微簡化操作,但在實時播放和任意讀取時可能稍顯復雜。
?
總的來說,交錯排列(interleaved)是更為常見和普遍使用的方式,特別是在需要實時播放和處理的情況下。
聲道越多,播放的音頻效果越立體,但是存儲的數據越大。
5、音頻幀
理論上,音頻并不需要音頻幀的概念,因為音頻采樣數據和采樣率已經可以把音頻播放描述清楚了。
但是音視頻文件播放時,為了保證音視頻同步,程序需要根據每幀的播放時間戳進行有序播放。由于每個音頻采樣數據太小了,如果每個采樣數據都記錄播放時間戳的話,那么就得不償失了。畢竟一個時間戳數據的大小比一個音頻采樣數據都大,所以就有了音頻幀的概念。
音頻幀的概念沒有視頻幀那么清晰,幾乎所有視頻編碼格式都可以簡單的認為一幀就是編碼后的一幅圖像。但音頻幀跟編碼格式相關,它是各個編碼標準自己實現的。
音頻幀實際上就是把一小段時間的音頻采樣數據打包起來,如每20ms的音頻采樣數據合并成一幀。這里的具體時間間隔是具體編碼碼格式決定的,一般不需要特別關心。
如果以PCM(未經編碼的音頻數據)來說,它根本不需要幀的概念,根據采樣率和采樣精度就可以播放了。比如采樣率為44.1kHz,采樣精度為16bit的音頻,你可以算出bitrate(比特率)是44100*16 bps,每秒的音頻數據是固定的44100*16/8字節。
對采樣率為44.1kHz的AAC音頻進行解碼時,一幀的解碼時間須控制在23.22毫秒內。通常是按1024個采樣點一幀。
分析:
1、 AAC
AAC(高級音頻編碼)采用了一種稱為MDCT(修正離散余弦變換)的技術來處理音頻信號。MDCT在AAC中的一個幀長度為1024個采樣點,是出于技術性能、壓縮效率、音質以及標準化等多方面的考慮。
音頻幀的播放時長 = 一個AAC幀對應的采樣點個數 / 采樣頻率(單位為s)
一個AAC原始幀包含某段時間內1024個采樣點相關數據。
44.1kHz采樣率,表示每秒44100個采樣點,則當前一幀的播放時長 = 1024*1000/44100 = 22.32ms。
48kHz采樣率,則當前一幀的播放時長 = 1024*1000/48000 = 21.32ms。
22.05kHz采樣率,則當前一幀的播放時長 = 1024 *1000/220500 = 46.43ms。
2、MP3
mp3每幀包含1152個采樣點,則每幀播放時長 = 1152*1000/sample_rate(采樣率)。
例如:sample_rate = 44100Hz時,計算出每幀播放時長 = 1152*1000/441000 = 26.122ms,這就是經常聽到的mp3每幀播放時間固定為26ms的由來。
詳細請看下圖:
6、音頻編碼
音頻編碼是將原始的未壓縮音頻數據轉換為壓縮格式的一系列過程,目的是減少數據量,以便更高效地存儲和傳輸。以下是常見的音頻編碼流程:
1、采樣和量化(Sampling and Quantization)
采樣:音頻信號是連續的模擬信號,采樣是將其在時間軸上以固定的間隔進行離散化,也就是每秒鐘記錄一定數量的音頻樣本,這個過程生成一系列離散的數據點。采樣率通常以赫茲(Hz)為單位,例如44.1kHz表示每秒采樣44100次。
量化:將這些離散的采樣點的電壓值轉化為數字格式,通常是用二進制數表示。量化級別決定了每個采樣點的精度,通常稱為比特深度(bit depth),例如16位或24位越高的比特深度能表示的音頻細節就越多。
?
2、預處理(Pre-processing)
過濾和去噪(Filtering and Denoising):優化音頻信號的質量,對采樣數據進行提前處理,包括去除噪音和不必要的頻段。
分幀(Framing):將音頻數據分割成小的幀(幀通常包含數百到數千個采樣點),以便于后續處理。
?
3、變換和特征提取(Transformation and Feature Extraction)
變換(Transformation):通過數學變換(如快速傅里葉變換FFT或離散余弦變換DCT)將音頻信號從時域轉換到頻域,這可以使得某些頻率特性更容易被分析和處理。
?
4、壓縮(Compression)
無損壓縮(Lossless Compression):在不損失任何音頻信息的前提下壓縮數據,例如FLAC。如果需要保留音頻的全部細節,可以選擇無損壓縮,但壓縮率不高。
有損壓縮(Lossy Compression):通過丟棄人耳不易察覺的音頻信息來達到更高的壓縮比例,例如MP3、AAC。這種方法有效減小文件大小,但會損失一些音質。
?
5、編碼(Coding)
音頻編碼器(Audio Encoder):采用特定的編碼算法將壓縮后的音頻數據轉換為一種標準格式,這會涉及使用例如熵編碼(Entropy Coding)(如哈夫曼編碼)等技術,提高數據的壓縮效率。
元數據添加(Adding Metadata):往編碼數據中加入相關的元數據,如采樣率、比特率、聲道數等,以及文件的其他信息如標題、藝術家、專輯等。
?
6、封裝(Packaging)
容器格式(Container Format):將編碼后的音頻數據和元數據存儲在某種容器格式中。例如WAV、MP3、AAC等。
?
7、存儲和傳輸(Storage and Transmission)
存儲在本地或者通過網絡傳輸。編碼后的音頻文件由于體積較小,因此能夠高效地在各種平臺和設備之間進行傳輸和共享。
?
總結
音頻編碼通過一系列復雜的處理步驟,大幅減少了音頻數據量。這一過程涉及采樣、量化、預處理、變換、壓縮和編碼等多個階段,其目標是在音質和數據量之間取得平衡,以便更高效地存儲和傳輸音頻數據。無論是用于實時傳輸的有損編碼,還是用于高保真存儲的無損編碼,不同的編碼方式和技術滿足了不同應用的需求。
音頻編碼標準
音頻編碼標準 | 描述 |
---|---|
PCM (Pulse Code Modulation) | 基本的脈沖編碼調制方式,無損編碼,采樣率高,文件較大 |
G711 (A-law 和 μ-law) | G.711是一種關鍵的音頻編碼標準,憑借其高語音質量、低延遲和廣泛的兼容性,成為電話網絡和VoIP服務中的重要組成部分,G.711并不是嚴格意義上的無損編碼,G.711的語音質量通常被認為是接近于原始模擬信號的 |
MP3 (MPEG-1 Audio Layer 3) | 有損壓縮音頻編碼,流行的音頻格式,文件小,保留較高音質 |
AAC (Advanced Audio Coding) | 高級音頻編碼標準,有損壓縮,音質優秀,常用于在線音頻流媒體 |
OGG Vorbis | 開源音頻編碼,有損壓縮,提供高音質,文件相對小 |
FLAC (Free Lossless Audio Codec) | 無損音頻編碼,保留原始音頻質量,文件較大,用于音頻編輯和存檔 |
Opus | 開放式、免專利的音頻編碼標準,支持廣泛的比特率,適用于語音通話和音頻流傳輸 |
WMA (Windows Media Audio) | 微軟開發的音頻編碼標準,有損壓縮,適用于 Windows 平臺 |
AC3 (Dolby Digital) | 杜比數字音頻編碼標準,多用于 DVD、藍光光盤等視頻音頻壓縮 |
DTS (Digital Theater Systems) | 數字影院系統音頻編碼標準,提供高質量環繞聲音效果 |
ALAC (Apple Lossless Audio Codec) | 蘋果無損音頻編碼標準,保留音頻原始質量,適用于蘋果設備 |
7、音頻解碼
音頻解碼的流程總體上可以分為以下幾個步驟:
1、接收編碼數據: 通過網絡下載、存儲設備讀取等方式獲取到編碼的音頻文件。通常,這些文件使用各種壓縮和編碼技術對原始音頻數據進行了處理,以減少文件大小并便于傳輸。
?
2、解析文件格式: 了解音頻文件的格式(如MP3、AAC、FLAC等),并準確解析文件頭,以獲取編碼信息、采樣率、聲道數、比特率等關鍵參數。
?
3、提取編碼數據: 從音頻文件中提取出實際的音頻數據流,這部分數據是經過壓縮和編碼后的,需要還原成原始的未壓縮音頻數據。
?
4、解碼音頻數據: 使用相應的解碼算法將壓縮的音頻數據還原成原始的PCM (Pulse Code Modulation) 數字音頻信號。這一步驟需要了解具體的編碼/解碼算法,比如MP3的霍夫曼編碼、AAC的MDCT轉換等。
?
5、音頻處理(可選): 根據需求,對解碼后的音頻數據進行處理,比如增益調整、均衡、混音等。
?
6、輸出音頻: 將解碼并處理過的PCM音頻數據傳輸到音頻輸出設備,比如揚聲器、耳機等,或者存儲為新的音頻文件。
?
這是一個較為簡化的描述,各種編碼格式和解碼器可能有些具體操作上的差異,但大致流程一致。
有建議或疑問,評論區溝通交流。
該專欄下一篇文章我們對嵌入式音視頻開發中視頻相關概念進行詳解。