MP3數據結構

1.MP3簡述

​ MP3全稱爲MPEG Audio Layer 3,它是一種高效的計算機音頻編碼方案,它以較大的壓縮比將音頻文件轉換成較小的擴展名爲.mp3的文件,基本保持源文件的音質,MP3是ISO/MPEG標準的一部分,現已形成MPEG Layer1、Layer2、Layer3三種音頻編解碼方案,分別對應MP1、MP2、MP3 這三種聲音文件。
​ MPEG(Moving Picture Expert Group)是ISO下的一個動態圖像專家組,它指定的MPEG標準廣泛的應用於各種多媒體中,MPEG標準包括視頻和音頻標準,其中音頻標準已制定出MPEG-1、MPEG-2、MPEG-2 ACC、MPEG-4。MPEG-1和MPEG-2標準使用同一個音頻編解碼族Layer1、2、3,MP3絕大多數使用的是MPEG1標準
​ ID3一般位於一個mp3文件的開頭或末尾的若干字節內,記錄該mp3文件的歌手、標題、專輯名稱、年代、風格等信息,ID3分位兩個版本,V1版ID3在文件末尾的固定128字節,以TAG字符開頭,若沒有則認爲無ID3V1信息,V2版ID3位於mp3的開頭,長度可變。

2.MP3文件結構

​ MP3文件大體上分爲三個部分:ID3V2 + 音頻數據 + ID3V1

2.1.ID3V2解析

​ ID3V2一共有四個版本,ID3V2.1/2.2/2.3/2.4,目前流行的播放軟件一般只支持第三版即ID3V2.3,由於ID3V1記錄在文件的末尾處,ID3V2就只能記錄在文件的首部了,也是因爲這個原因,對ID3V2的操作比ID3V1要慢,而且ID3V2的結構比ID3V1的結構複雜的多,但是ID3V2可以記錄更多的信息,長度可變,ID3V1則長度固定爲128字節,以TAG字符開頭。
​ ID3V2.3由一個標籤頭和若干個標籤幀或者一個擴展標籤頭組成(至少要有一個標籤幀),每一個標籤幀記錄一種信息,例如作曲、標題等。

2.1.1. 標籤頭

位於文件開始處,長度爲10字節,結構如下:

B[0:2]	 標識頭,必須爲“ID3”
B[3]	版本號,ID3V2.3 就記錄3
B[4]	副版本號,此版本記錄爲0
B[5]	標誌字節,一般爲0,只使用高三位,其它位爲0
			a:表示是否使用Unsynchronisation;
			b:表示是否有擴展頭部,一般沒有,所以一般也不設置;
			c:表示是否爲測試標籤,99.99%的標籤都不是測試標籤,不設置
B[6:9]	標籤大小,共四個字節,每個字節只使用低7位,最高位不使用恆爲0,計算時將最高位去掉,得到28bit的數據,計算公式如下:Size=(Size[0]&0x7F)*0x200000+(Size[1]&0x7F)*0x400+(Size[2]&0x7F)*0x80+(Size[3]&0x7F)

2.1.2. 標籤幀

​ 每個標籤幀都有10個字節的幀頭和至少一個字節的內容構成,標籤幀與"標籤頭/其他標籤幀"無特殊字節分割,只能通過幀頭信息來確定幀內容的大小。幀頭長度10字節,定義如下:

B[0:3]	標識幀,說明其內容類型,例如作者,標題等
			TIT2=標題
			TPE1=作者
			TALB=專集
			TRCK=音軌格式:N/M 其中N爲專集中的第N首,M爲專集中共M首,N和M    爲ASCII 碼錶示的數字
			TYER=年代是用ASCII 碼錶示的數字
			TCON=類型直接用字符串表示
			COMM=備註格式:"eng\0備註內容",其中eng 表示備註所使用的自然語言
B[4:7]	幀內容大小 ,不包括幀頭,不得小於1,計算公式如下:Size = Size[0]*0x100000000 + Size[1]*0x10000+ Size[2]*0x100 +Size[3];
B[8:9]	標誌幀,只定義了6 位使用每個字節的高三位,其他位均爲0
			a -- 標籤保護標誌,設置時認爲此幀作廢
			b -- 文件保護標誌,設置時認爲此幀作廢
			c -- 只讀標誌,設置時認爲此幀不能修改
			x -- 壓縮標誌,設置時一個字節存放兩個BCD 碼錶示數字
			y-- 加密標誌
			z-- 組標誌,設置時說明此幀和其他的某幀是一組

2.2.音頻數據解析

​ |<–4字節幀頭–>|<–2字節可選CRC,取決於幀頭的第16位–>|<–32字節通道信息–>|<–聲音數據–>|

2.2.1. 數據幀幀頭

幀頭長4字節,結構如下:
在這裏插入圖片描述

2.2.2. 幀大小和幀長度

​ 幀大小即每幀的採樣數,表示一幀數據中採樣的個數,該值是恆定的,如下表所示:

在這裏插入圖片描述

​ 幀長度是壓縮時每一幀的長度,包括幀頭的4個字節。它將填充的空位也計算在內。Layer 1的一個空位長4字節,Layer 2和Layer 3的空位是1字節。當讀取MPEG文件時必須計算該值以便找到相鄰的幀。注意:因爲有填充和比特率變換,幀長度可能變化

計算公式如下:

Layer 1:	Len(字節) = ((每幀採樣數/8*比特率)/採樣頻率)+填充*4
Layer2/3:	Len(字節) = ((每幀採樣數/8*比特率)/採樣頻率)+填充

例:MPEG1 Layer3 比特率128000,採樣率44100,填充0,幀長度爲((1152/8*128K)/44.1K+0=417字節

2.2.3. 幀持續時間

計算公式:每幀持續時間(毫秒) = 每幀採樣數 / 採樣頻率 * 1000
例:1152/441000*1000=26ms

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章