天天看點

淺談對于 mp3 檔案中 VBR 對比 CBR 的一些基本差異

從比特率編碼方式的角度來看,目前其中一種最常見的音頻檔案格式MP3,可以再分為兩種類型:一種是恒定比特率CBR(Constant Bit-Rate),這種類型的mp3每一幀的比特率都是恒定唯一的;另外一種就是可變比特率VBR(Variable Bit-Rate),這種類型就跟CBR相反,每一幀的比特率是不固定的,幀與幀之間的比特率可能一樣也可能不一樣。由于存在這樣兩種類型,播放mp3檔案時需要做的一些工作,比如擷取音頻資訊和播放進度控制,就需要分開處理。

要明确了解CBR和VBR的具體差異,就需要先了解音頻檔案的一個重要屬性:比特率(Bitrate),比特率又稱碼率或者位率,是指每秒傳送的比特(bit)數。機關為 bps(Bit Per Second),比特率越高,傳送資料速度越快。音頻中的比特率是指将模拟聲音信号轉換成數字聲音信号後,機關時間内的二進制資料量,是間接衡量音頻品質的一個名額。

音頻檔案的比特率機關一般是kbps,1 kbps = 1000 bps。而mp3的比特率預設是128 kbps,但是目前網絡下載下傳到的mp3更為常見的是192 kbps,而如果要擷取更加好的音質的高清mp3,比特率通常都要到達320 kbps,通常來講,比特率越高,音質就越好,但占用磁盤的空間就越大。

一般來說,聲音片段的音調越高,就需要更多的空間去存儲,比特率就越高。傳統的mp3檔案是CBR編碼的,也就是每一幀的比特率都是相同的,這樣就帶來了一個問題:如果每一幀的比特率是相同的,那麼每一幀的資料大小都是一樣的,無論這一幀的音調是高還是低,都是使用整段音頻中音調比較高的音頻幀的存儲空間的大小來存儲這一幀,但是對于音調低的音頻幀,其實并不需要這麼大的存儲空間。這樣就會造成存儲空間的浪費,無形中增大了mp3檔案的大小。

VBR編碼技術的出現,就是為了解決這個空間浪費的問題。VBR技術對每個音頻幀選擇最适合這一幀的比特率,對于音調比較低的音頻幀,比特率會比較低,資料大小就比較小,音調比較高的則比特率就會比較高,資料大小就比較大。這樣就能在不損失音頻品質的前提下,節省音頻資料的存儲空間,進一步壓縮mp3的檔案大小。

淺談對于 mp3 檔案中 VBR 對比 CBR 的一些基本差異

上圖簡要對比了CBR和VBR兩種類型的mp3檔案的資料内容上的差别。可以看到,VBR編碼的mp3,幀與幀之間由于資料内容的差異,比特率不一定相同,通常VBR技術會在8~320 kbps這個範圍壓縮編碼,是以相比整個檔案中比特率都是恒定的CBR編碼,VBR編碼在整個檔案中比特率是浮動可變的,這也是VBR(可變比特率)這個名字的由來。

除了CBR和VBR這兩種編碼,還存在一種ABR類型(Average Bit-Rate,平均比特率)的編碼,它與CBR基本相同,大多數音頻幀以指定的比特率編碼,但會在個别适當的内容使用高于指定的比特率編碼,但是通常這種内容很短,是以在檔案大小上跟CBR相比沒有太大的差異,是以這種類型并不常見。

使用VBR技術來編碼壓縮mp3檔案,誠然可以優化檔案的大小,但同時在音頻資訊的擷取和播放進度的控制也帶來了一些新的問題。

首先是音頻時間長度的計算。如果是CBR編碼,由于比特率恒定,所有音頻幀的資料大小是固定的,是以每一秒播放所需解碼的資料大小都是相同的,這樣計算音頻的時間長度就非常簡單。使用以下公式即可:

公式中,id3字段是指放在mp3檔案開頭或末尾的基本資訊字段,通常用來記錄音頻檔案的名字,歌手名,專輯名這三個資訊,id3分v1和v2兩個版本,v1隻記錄上述的三種資訊,且大小固定,一般放在檔案末尾;v2則比v1靈活,記錄的資訊類型不限于上述三種,且大小不固定,一般放在檔案開頭。id3字段是可選字段,mp3檔案不一定有,是以計算mp3的音頻時間,需要先讀取獲知id3是否存在。

對于VBR編碼的mp3檔案,由于每一幀的比特率是不固定的,是以每一幀的資料大小是任意的。顯然這樣每秒播放的資料大小都不一樣。這樣整個音頻的時間長度就不能以上述公式計算,需要借助其他的資料字段,這是VBR技術的其中一個缺點:計算音頻時長相對困難複雜。

VBR技術還有另外一個缺點,播放音頻檔案的時候不可避免會有跳到指定時間的位置播放的操作(也就是常說的seek操作),這時就需要把目标的時間位置換算成檔案位置,再跳轉到這個檔案位置偏移讀取解碼,如果是網絡播放的邊下載下傳邊播放的模式,在seek操作的時候還需要先計算出這個檔案位置,跳轉到這個位置先下載下傳一段才能繼續播放。對于CBR編碼,換算成檔案位置偏移也很簡單,使用的是以下公式:

但是對于VBR編碼,顯然也是不能使用這個公式換算出檔案位置的。原因也很簡單:每一幀的比特率不固定,每秒的資料長度不平均。是以跟計算時長一樣,需要借助其他資料字段。

為了解決上述的兩個問題,VBR編碼增加了一些資料字段。目前VBR編碼技術主要有兩種,一種是Xing公司提出的Xing規範,一種是Fraunhofer編碼器的VBRI規範,由于使用VBRI規範的VBR編碼不常見,大多數VBR編碼都是采用Xing規範,是以本文隻對Xing規範如何解決音頻長度計算和seek操作的實作作介紹。

Xing規範的主要内容是Xing頭,這是指VBR編碼的mp3的開頭第一個音頻幀不用來存儲具體的音頻資料,而是用來存儲一些額外的音頻資訊。這些資訊以“Xing”這四個字元作為字段開頭的标記(也有部分檔案以“Info”這四個字元作為Xing頭的開頭标記)。

Xing頭在第一個音頻幀中的位置,是在标準的4個byte的mp3音頻幀幀頭之後,在幀頭和Xing頭之間,會有一段資料内容全是0的空白部分,這個空白部分的長度是指定的。解碼器在解析到第一個音頻幀的幀頭之後,就是通過跳過這段指定長度的空白部分,然後判斷接下來的内容是否就是‘Xing’或者‘Info’這四個字元,來判斷音頻是否VBR編碼。

空白部分的長度有mpeg版本和聲道數決定,具體如下表(機關為byte):

MPEG版本

單聲道

非單聲道

MPEG 1

18

32(最常見)

MPEG 2

9

下圖是VBR編碼的mp3的第一幀資料的字段結構的例子:

淺談對于 mp3 檔案中 VBR 對比 CBR 的一些基本差異

Xing頭的字段結構和存儲的資訊内容如下表:

淺談對于 mp3 檔案中 VBR 對比 CBR 的一些基本差異

現在首先看看如何利用Xing頭中的資訊來計算VBR編碼中音頻時間的長度。

如果Xing頭中包含總幀數這個資訊,那麼就先把總幀數讀出來,假設檔案如上表中舉例,總幀數是7344。然後乘以每幀采樣數,得到總采樣數。每幀采樣數是mp3檔案的固定屬性,這個數值由MPEG版本和layer版本決定,與編碼類型是CBR還是VBR無關。

每幀采樣數詳細如下表:

Layer 1

Layer 2

Layer 3

384

1152

576

檔案是mp3格式,也就是MPEG 1 Layer 3,每幀采樣數就是1152,那麼總采樣數就是

現在得到了總采樣數,那麼總的音頻時間就不難得出了,由于采樣率也是音頻檔案的固定屬性,假設是44.1 kHz,是以總的音頻時間就是總采樣數除以采樣率,也就是

是以,隻要VBR編碼的Xing頭裡帶有包含總幀數這個字段(一般都會有),就能計算得出音頻時長。

下面再來看看VBR編碼如何利用Xing頭的資訊實作Seek操作。

VBR編碼的seek操作主要是利用Xing頭中的TOC表(如果這個表存在),TOC表(Table Of Contents)是一個長度為100的byte數組,數組中每個元素都代表在音頻時長内的一個特定的時間點對應的檔案的相對位置。 簡單的說,TOC表的組成,就是把整個檔案平均分成256段,每一段代表一個檔案位置,再把總的音頻時長平均分為100段,每一段代表一個時間點,然後對這100個時間點,每一個都找出256個檔案位置中其對應的那個位置,這個位置是這256個位置中的相對位置,取值在0~255,放在TOC表中。

如何使用TOC表實作時間點到檔案位置的映射,算法如下:

假設檔案持續240秒,現在需要跳到60秒,檔案長度為5000000 byte,那麼先用以下公式計算出60秒對應TOC表的哪個元素:

然後在根據以下公式算出檔案位置:

但是上述算法,隻能在這種情況有效:目标時間點是TOC時間點,也就是目标時間點在把總時長平均分成100份的100個時間點之中,對于目标時間點不在這100個時間點之中的情況,如果參考android系統在解碼VBR編碼的mp3時候的做法,就是在上述算法的基礎上,再算出目标時間點在時間位置上處于那100個TOC時間點中的哪兩個相鄰的TOC時間點之間,假設這兩個TOC時間點對應的相對檔案位置是TOC[a]和TOC[b],通過這兩個相對檔案位置用線性插值的方式算出目标時間點的相對檔案位置,進而算出目标檔案位置。

android系統源碼中利用Xing頭的TOC表實作音頻時間點和其對應的檔案位置的換算,代碼如下:

以上就是VBR編碼的mp3播放的seek操作的具體實作原理。

通過以上的分析介紹,我們可以知道,mp3的CBR和VBR兩種編碼類型各有優劣:在編解碼的複雜程度的角度看,CBR相對簡單容易操作;在存儲空間的使用率的角度看,VBR使用率更高。由于mp3是目前最常見的音頻格式,在做用戶端的音頻解碼工作的時候,對這兩種編碼類型都要做細緻的針對性的處理,這樣才能減少播放mp3出現的問題,提高播放的體驗。

參考資料:

MPEG音頻檔案格式(包括MP3格式)詳解——轉載:http://blog.chinaunix.net/uid-20792001-id-1841011.html

MP3 File Structure Description:http://www.multiweb.cz/twoinches/mp3inside.htm