1. 采樣率
采樣率(sampleRate), 采樣率就是每秒從連續信號中提取並組成離散信號的采樣個數,它用赫茲(Hz)來表示,說的簡單一點就是每秒在每個聲道上采樣的個數。采樣就是把模擬信號數字化的過程,不僅僅是音頻需要采樣,所有的模擬信號都需要通過采樣轉換為可以用0101來表示的數字信號,示意圖如下所示:
藍色代表模擬音頻信號,紅色的點代表采樣得到的量化數值。采樣頻率越高,紅色的間隔就越密集,記錄這一段音頻信號所用的數據量就越大,同時音頻質量也就越高。根據奈奎斯特理論,采樣頻率只要不低於音頻信號最高頻率的兩倍,就可以無損失地還原原始的聲音。通常人耳能聽到頻率范圍大約在20Hz~20kHz之間的聲音,為了保證聲音不失真,采樣頻率應在40kHz以上。常用的音頻采樣頻率有:8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz、96kHz、192kHz等。
2. 位深度
位深度,也叫位寬,量化精度,上圖中,每一個紅色的采樣點,都需要用一個數值來表示大小,這個數值的數據類型大小可以是:4bit、8bit、16bit、32bit等等,位數越多,表示得就越精細,聲音質量自然就越好,當然,數據量也會成倍增大。常見的位寬有:8bit 或者 16bit。
3. 聲道數
由於音頻的采集和播放是可以疊加的,因此,可以同時從多個音頻源采集聲音,並分別輸出到不同的揚聲器,故聲道數一般表示聲音錄制時的音源數量或回放時相應的揚聲器數量。單聲道(Mono)和雙聲道(Stereo)比較常見,顧名思義,前者的聲道數為1,后者為2。
4. Sample、Frame、Packet
這三個概念很重要,很容易搞混,蘋果在其Core Audio 官方文檔中明確定義了 audio stream, channel, sample, frame, packet 和sample rate 這些概念: https://developer.apple.com/library/archive/documentation/MusicAudio/Conceptual/CoreAudioOverview/WhatisCoreAudio/WhatisCoreAudio.html
- A sample is single numerical value for a single audio channel in an audio stream.
- A frame is a collection of time-coincident samples. For instance, a linear PCM stereo sound file has two samples per frame, one for the left channel and one for the right channel.
- A packet is a collection of one or more contiguous frames. A packet defines the smallest meaningful set of frames for a given audio data format, and is the smallest data unit for which time can be measured. In linear PCM audio, a packet holds a single frame. In compressed formats, it typically holds more; in some formats, the number of frames per packet varies.
從上面文檔定義,簡單來說,可以這樣理解:
- sample 是一個聲道的一個采樣。
- frame 是一個時間點的樣本集合,舉例來說,一個線性的PCM 雙聲道音頻文件每個Frame有2個樣本,一個左聲道樣本,和一個右聲道樣本。
- packet 是一個或多個 frame 的集合,一個 packet 包含多少個 frame,是由聲音文件格式決定的。譬如 PCM 文件格式中一個 packet 包含 1 個frame。而 MP3 文件格式中一個 packet 包含 1152 個frames。
從上面定義來看這三個概念互相獨立,定義清晰。
這些概念為什么容易搞混?
然而在日常討論中,會在多種場合下使用 frame 和 packet 兩個詞,但是各種場合下它們代表的含義是不同的,所以比較容易搞混。
舉下面不同場景的例子來說明:
1. 在討論 MPEG 格式的時候,如網上常見的MPEG文件格式介紹,把 MPEG 一個 header + payload (幀頭 + 數據內容)的數據結構叫做一個 frame (MPEG數據幀),一個 MPEG 數據幀包含了多個音頻幀。事實上這個東東在上述 iOS Core Audio 定義中,卻又被稱為一個 packet。所以兩份文檔中,分別使用了 packet 和 frame 兩個詞指代同一個概念。
2. 網絡傳輸音頻的時候,會把音頻數據進行打包發送,這個時候也用到 packet 的概念,他有自己獨立的 packet header 定義,又跟 iOS Core Audio 定義的 packet 不是同一個了。
3. 在討論計算機網絡時,硬件數據幀稱為 frame,而數據鏈路層將 frame 打包成 packet 之后提供給上層網絡層使用。 這里 frame 和 packet 的概念又跟音頻討論中的含義不一樣了。
4. FFmpeg是一個音/視頻編碼解碼及轉換的開源軟件。它定義了兩個結構體,AVPacket 一份代表經過壓縮的音頻/視頻數據,AVFrame 代表一份解壓后的一個音頻/視頻數據。視頻一個 AVPacket 通常只包含一個 AVFrame,經過壓縮的音頻 AVPacket 通常包括多個 AVFrame。可以看到 FFmpeg 在處理音頻和視頻時,對 packet 和 frame 概念的使用跟 iOS Core Audio 基本一致。
從上面例子可以看到,不同場景下都使用了 frame 和 packet 兩個詞語會代表不一樣的含義。更糟糕的是,如果使用了中文“幀”,在某些語境下,到底是代表數據幀、音頻幀、packet 還是 frame 呢,就更容易分不清楚了。
參考鏈接
1. 音頻開發中常用到的概念
2. 理解iOS Core Audio音頻概念