這個文章是關于結構的MPEG音頻幀頭包括XING和VBRI頭。其目的是估計的期限MPEG音頻文章件的準確和盡快。本文章不包括任何提示就如何解碼/編碼實際的音頻數(shù)據(jù)。 MPEG音頻文章件存在于不同層次。最常見的是MPEG 1層III (也稱為MP3 ) ,因為它最復雜的壓縮技術。
我知道有其他文章的MPEG音頻幀頭(甚至CodeProject ) ,但我將進入一個更深一點。
一個MPEG音頻文件組成的框架。每個幀包含一個頭開始在其遵循的音頻數(shù)據(jù)。這音頻數(shù)據(jù)總是包含一個fixed number of samples 。當前存在三個層次的MPEG音頻,其中的方式有所不同的音頻數(shù)據(jù)進行編碼的框架內(nèi),但他們都有同樣的頭格式。該框架本身由插槽。在層一,一個插槽始終是第4字節(jié)長,在所有其他層次的插槽是1字節(jié)長。
附加層也有三個版本的MPEG音頻,不同的采樣率,他們可以處理(見table 2.1.2 ) 。 MPEG 1 ( ISO/IEC 13818-3 )和MPEG 2 ( ISO/IEC 11172-3 )是ISO標準。 MPEG 2.5是一個非官方擴展MPEG 2支持甚至更低的采樣率。 MPEG 2/2.5也被稱為下LSF的縮寫,它的采樣頻率下。每個版本可以處理三個層次。如果你想知道更多有關技術細節(jié)的MPEG音頻文件,請看看規(guī)格。你可以找到他們和其他許多有用信息MPEG在www.MP3-Tech.org 。
文件可與編碼要么常數(shù)碼率( CBR )或可變量比特率( VBR ) ,這意味著每幀可以有不同的比特率。因此,質(zhì)量是這些文件往往高于文件編碼常數(shù)a碼率模式,因為他們可以使用較高的比特率的音樂需要它。
頭開始時每幀32位是長期和具有以下格式。 0位頭中是最重要的位( MSB )完整的頭。請注意,位置是零基;位置,長度和實例都在位格式。
Position | Length | Meaning | Example |
---|---|---|---|
0 | 11 | Frame sync to find the header (all bits are always set) | 1111 1111 111 |
11 | 2 | Audio version ID (see table 3.2 also) 00 - MPEG Version 2.5 (unofficial extension of MPEG 2) | 11 |
13 | 2 | Layer index 00 - reserved | 01 |
15 | 1 | Protection bit 0 - protected by 16 bit CRC following header | 1 |
16 | 4 | Bitrate index (see table 2.1.3) | 1001 |
20 | 2 | Sampling rate index (see table 2.1.2) | 11 |
22 | 1 | Padding bit If it is set, data is padded with with one slot (important for frame size calculation) | 0 |
23 | 1 | Private bit (only informative) | 1 |
24 | 2 | Channel mode 00 - Stereo Note: Dual channel files are made of two independent mono channels. Each one uses exactly half the bitrate of the file. Most decoders output them as stereo, but it might not always be the case. | 01 |
26 | 2 | Mode extension (Only used in Joint Stereo) (see table 2.1.6) | 00 |
28 | 1 | Copyright bit (only informative) | 1 |
29 | 1 | Original bit (only informative) | 1 |
30 | 2 | Emphasis 00 - none The emphasis indication is here to tell the decoder that the file must be de-emphasized, that means the decoder must 're-equalize' the sound after a Dolby-like noise suppression. It is rarely used. | 00 |
在指定的采樣率有多少樣品每秒記錄。每個MPEG版本可以處理不同的采樣率。
Sampling Rate Index | MPEG 1 | MPEG 2 (LSF) | MPEG 2.5 (LSF) |
---|---|---|---|
00 | 44100 Hz | 22050 Hz | 11025 Hz |
01 | 48000 Hz | 24000 Hz | 12000 Hz |
10 | 32000 Hz | 16000 Hz | 8000 Hz |
11 | reserved |
該比特率總是顯示在每秒。請注意,前綴kilo(簡稱小'k')并不意味著1024個,但千比特每秒!該比特率索引1111則保留,并應永遠不再使用。在MPEG音頻標準有一個免費的格式描述。這個免費的格式是指該文件編碼恒定比特率,這不是一個預先確定的比特率。只有極少數(shù)的解碼器能夠處理這些文件。
Bitrate Index | MPEG 1 | MPEG 2, 2.5 (LSF) | |||
---|---|---|---|---|---|
Layer I | Layer II | Layer III | Layer I | Layer II & III | |
0000 | free | ||||
0001 | 32 | 32 | 32 | 32 | 8 |
0010 | 64 | 48 | 40 | 48 | 16 |
0011 | 96 | 56 | 48 | 56 | 24 |
0100 | 128 | 64 | 56 | 64 | 32 |
0101 | 160 | 80 | 64 | 80 | 40 |
0110 | 192 | 96 | 80 | 96 | 48 |
0111 | 224 | 112 | 96 | 112 | 56 |
1000 | 256 | 128 | 112 | 128 | 64 |
1001 | 288 | 160 | 128 | 144 | 80 |
1010 | 320 | 192 | 160 | 160 | 96 |
1011 | 352 | 224 | 192 | 176 | 112 |
1100 | 384 | 256 | 224 | 192 | 128 |
1101 | 416 | 320 | 256 | 224 | 144 |
1110 | 448 | 384 | 320 | 256 | 160 |
1111 | reserved |
在MPEG 1層II ,只有一些組合的比特率和模式允許的。在MPEG 2/2.5 ,就沒有這種限制。
Bitrate | Allowed modes |
---|---|
free | all |
32 | single channel |
48 | single channel |
56 | single channel |
64 | all |
80 | single channel |
96 | all |
112 | all |
128 | all |
160 | all |
192 | all |
224 | stereo, intensity stereo, dual channel |
256 | stereo, intensity stereo, dual channel |
320 | stereo, intensity stereo, dual channel |
384 | stereo, intensity stereo, dual channel |
計算幀大小,您需要的樣本數(shù)量每MPEG音頻幀。因此,您可以使用如下表:
MPEG 1 | MPEG 2 (LSF) | MPEG 2.5 (LSF) | |
---|---|---|---|
Layer I | 384 | 384 | 384 |
Layer II | 1152 | 1152 | 1152 |
Layer III | 1152 | 576 | 576 |
然后,你就可以計算出幀大小這樣的:
Frame Size = ( (Samples Per Frame / 8 * Bitrate) / Sampling Rate) + Padding Size
由于四舍五入的錯誤,官方計算公式幀大小是一個有點不同。據(jù)ISO標準,你必須計算在幀大小插槽(見2. MPEG Audio Format ) ,然后截斷這一數(shù)字為整數(shù),之后乘它與插槽的大小。你可以找到正確的方式計算幀大小的類CMPAHeader
在我的代碼。
你的時間的文件在幾秒鐘內(nèi)采用的公式如下:
Duration = File Size / Bitrate * 8
該方法獲得的第一個個幀頭中的文件,然后計算期限由上述公式正常工作只為CBR文件。
延伸的模式是用來加入信息,是沒有用的立體聲效果,從而減少了所需的位。這些位是動態(tài)確定的編碼在聯(lián)合立體聲模式,聯(lián)合立體聲可以改變從一幀到另一國,或什至開啟或關閉。對于所有其他渠道模式,推廣模式領域是無效的。
完整的頻率范圍MPEG音頻文件分為子帶。有32子帶。對于層I和II ,這兩個位在頭中確定的頻率范圍(頻帶)的強度立體聲應用。在這個頻率范圍內(nèi),只有一個通道存儲。所有其他帶包含的信息在兩個不同的渠道。對于層III ,這兩個位確定哪些類型的聯(lián)合立體聲是用來(強度立體聲和/或米/秒的立體聲) 。
Value | Layer I & II | Layer III | |
---|---|---|---|
M/S stereo | Intensity stereo | ||
00 | bands 4 to 31 | off | off |
01 | bands 8 to 31 | off | on |
10 | bands 12 to 31 | on | off |
11 | bands 16 to 31 | on | on |
如果保護位在頭中沒有設置,框架包含了16位CRC (循環(huán)冗余校驗) 。這直接如下校驗幀頭和是一個很大的尾端WORD
。要驗證這一點校驗你必須計算的框架和比較CRC計算與存儲CRC 。如果他們不等于轉讓可能出現(xiàn)的錯誤。這也是有益的CRC檢查,以確認你真的發(fā)現(xiàn)的開始幀,因為這樣做同步位在相同的情況下也發(fā)生在數(shù)據(jù)節(jié)的一幀。
該CRC計算方法是,通過運用CRC - 16算法(與生成器polynom 0x8005 )的部分范圍。以下數(shù)據(jù)被認為是為CRC :最后兩個字節(jié)的頭和若干位的音頻數(shù)據(jù)如下校驗后的頭。校驗本身必須跳過CRC計算。不幸的是有沒有簡便的方法來計算的數(shù)目幀所必需的校驗計算層II 。因此,我離開了代碼。您需要其他信息除了頭計算必要位。然而,它是有可能的數(shù)量計算的保護層位在我和層III只有在信息的頭。
對于層III ,您認為完整的一側信息CRC計算。在如下方面信息的頭或CRC層III文件。它包含的信息一般解碼框架,但并不包含實際的編碼錄音樣品。下表顯示的大小方面信息的所有層III文件。
MPEG 1 | MPEG 2/2.5 (LSF) | |
---|---|---|
Stereo, Joint Stereo, Dual Channel | 32 | 17 |
Mono | 17 | 9 |
對于層我的文件,您必須考慮的模式擴展(見表2.1.6 )的頭。然后,你就可以計算number of bits所必需的CRC計算采用的公式如下:
4 * (number of channels * bound of intensity stereo +(32 - bound of intensity stereo));
這可以被理解為2次的數(shù)量加上立體聲子帶的數(shù)目和單子帶的結果乘以4 。對于簡單單框架,這等于128 ,因為一些渠道之一和約束的強度立體聲是32 ,也就是說,沒有強度立體聲。立體框架,這是256 。欲了解更多信息看一下CRC代碼類CMPAFrame
。
有些文件編碼與可變量比特率模式( VBR ) 。要估計的時間這些文件,你必須知道average bitrate整個文件。它常常很多不同的比特率的第一個個幀,因為最低的比特率可用于沉默的音樂書籍(尤其是在開頭) 。要獲得此平均碼率,你必須通過所有幀中的文件和計算,通過總結比特率每幀的劃分是通過一些幀。因為這不是一個很好的做法(非常緩慢) ,存在著更多的VBR頭內(nèi)的數(shù)據(jù)節(jié)的第一個個幀(幀后頭) 。它們包含的總數(shù)范圍內(nèi)的文件,從中可以計算時間以秒計算公式為:
Duration = Number of Frames * Samples Per Frame / Sampling Rate
附加的是, VBR頭往往載有一份表格,這是必須尋求職位文件。
這往往是頭(但不幸的是,并非總是)添加到文件的編碼與可變量比特率模式。這頭站第一個個后,音頻頭MPEG在某一特定的位置。整個第一個個幀其中包含XING頭是一個有效的,但空的音頻幀,所以即使解碼器,它不認為這頭可以解碼文件。 XING頭的看臺一側后,信息層III文件。所以,你可以計算的開始XING頭相對的開始幀增加4字節(jié)(為MPEG音頻頭)的值從table 2.2.1 。抵銷計算不考慮16位CRC以下的頭,等于為所有層,雖然只有層III有一個方面的信息。
宣讀了這一頭,你就必須找到第一個個MPEG音頻頭,然后進入這一特定位置的框架內(nèi)。該XING頭這個身具有以下格式。 (請注意,位置是零基;位置,長度和例子是每個字節(jié)的格式。 )
Position | Length | Meaning | Example |
---|---|---|---|
0 | 4 | VBR header ID in 4 ASCII chars, either 'Xing' or 'Info', not NULL-terminated | 'Xing' |
4 | 4 | Flags which indicate what fields are present, flags are combined with a logical OR. Field is mandatory. 0x0001 - Frames field is present | 0x0007 (means Frames, Bytes & TOC valid) |
8 | 4 | Number of Frames as Big-Endian DWORD (optional) | 7344 |
8 or 12 | 4 | Number of Bytes in file as Big-Endian DWORD (optional) | 45000 |
8, 12 or 16 | 100 | 100 TOC entries for seeking as integral BYTE (optional) | |
8, 12, 16, 108, 112 or 116 | 4 | Quality indicator as Big-Endian DWORD from 0 - best quality to 100 - worst quality (optional) | 0 |
根據(jù)這一格式,頭必須XING只包含ID和旗幟。所有其他字段是可選的,取決于它的旗幟設置。有時,這種頭也增加CBR文件。然后它往往具有ID 'Info' 而不是'Xing' 。
存在的LAME extension這個頭,這是用普通LAME編碼,但我并沒有考慮到這一點,因為這是沒有必要的時間估計。盡管如此,這里是連結documentation of the MP3 Info Tag 。
這頭只用MPEG音頻文件編碼與編碼弗勞恩霍夫據(jù)我所知。這是不同于XING頭。你會發(fā)現(xiàn)它完全32 bytes結束后的第一個個頭MPEG音頻文件中的。 (請注意,位置是零基;位置,長度和例子是每個字節(jié)的格式。 )
Position | Length | Meaning | Example |
---|---|---|---|
0 | 4 | VBR header ID in 4 ASCII chars, always 'VBRI', not NULL-terminated | 'VBRI' |
4 | 2 | Version ID as Big-Endian WORD | 1 |
6 | 2 | Delay as Big-Endian float | 7344 |
8 | 2 | Quality indicator | 75 |
10 | 4 | Number of Bytes as Big-Endian DWORD | 45000 |
14 | 4 | Number of Frames as Big-Endian DWORD | 7344 |
18 | 2 | Number of entries within TOC table as Big-Endian WORD | 100 |
20 | 2 | Scale factor of TOC table entries as Big-Endian DWORD | 1 |
22 | 2 | Size per table entry in bytes (max 4) as Big-Endian WORD | 2 |
24 | 2 | Frames per table entry as Big-Endian WORD | 845 |
26 | TOC entries for seeking as Big-Endian integral. From size per table entry and number of entries, you can calculate the length of this field. |
請考慮,在結尾或開頭的文件,可能有更多的數(shù)據(jù)是不屬于MPEG音頻幀。這種數(shù)據(jù)被調(diào)用標記,因為它包含的數(shù)據(jù)文件,如標題,藝術家,田徑,年等您必須考慮這些標記,因為只有MPEG音頻數(shù)據(jù)計數(shù)的時間估計..在結束一個文件有可能是一個ID3V1標記,一個標記Lyrics3或Musicmatch的標記。在開始或結束時,該文件可能有ID3V2標簽和/或APE標記。您找到有關ID3和Lyrics3標簽www.id3.org 。 APE最初是為無損壓縮音頻文件的APE ( )格式。但是,現(xiàn)在這個標記也可用于MPEG音頻文件。在Musicmatch的標記是用舊版這個的Musicmatch的編碼。不幸的是很少有網(wǎng)頁上的信息有關此標記,因為它是一個專有格式Musicmatch的。
我寫的一些c++類處理MPEG音頻幀頭和VBR頭。類CMPAFile
代表整個文件,并提供方法訪問一個特定范圍內(nèi)( CMPAFrame
類) 。這個類實例一類CMPAHeader
代表MPEG音頻幀頭框架這個身。繼承各個領域的頭可以通過類變量。此外,還有CVBRHeader
類是概括CXINGHeader
和CVBRIHeader
。所有的標簽都繼承類CTag
。這些類是完全獨立于任何庫一樣MFC或ATL 。他們只使用Win32 API 。所有課程將拋出例外情況下的錯誤。所有例外的類型CMPAException
。您可以顯示的信息除了使用ShowError()
方法。所有課程使用CMPAStream
的文件訪問。這個類包含一個簡單的緩沖區(qū)。
下面是一個代碼段,這表明你可以使用這些類。請注意,您必須至少包括mpafile.h頭:
try {// open file and look for first header CMPAFile MPAFile(_T("C:\\test.mp3")) ;cout << MPAFile.GetLengthSec() << _T(" seconds");}catch(CMPAException& Exc){// show error message Exc.ShowError();}
欲了解更多信息,看看源代碼的演示項目MPEG Audio Info ,這是一個簡單的MFC對話框應用程序,它使用類CMPAFile
獲取信息MPEG的音頻文件。它也可以執(zhí)行檢查整個文件的錯誤的框架結構。
在這里,你可以找到的來源,我用于此文章:
如果您發(fā)現(xiàn)任何錯誤代碼或文章,或有改進建議,只要他們后論壇低于或?qū)懴潆娮余]件至webmaster@wincd.de 。
聯(lián)系客服