【此文目的】 1. 了解 MPEG相關知識 2. 了解 MP3 的常見術語含義 3. 詳解 VBR MP3的幀頭格式及含義 4. 搞懂如何去計算 CBR和 VBR的 MP3檔案的播放時間(duration) 【目錄】 1.MPEG 的相關知識.............................................................................2 1.1 MPEG 是啥......................................................................................................3 1.2 為啥沒了 MPEG-3 ...........................................................................................3 1.3 MPEG2.5 又是啥.............................................................................................3 1.4 MPEG 中不同幀之間的關系..........................................................................3 1.5 MPEG-1和 MPEG-2音頻特性.......................................................................4 1.5.1 MPEG-1 音頻(ISO/IEC 11172-3)...................................................................4 1.5.2 MPEG-2 音頻(ISO/IEC 13813-3)..................................................................4 1.6 什麼是 ISO/IEC 11172-3 和 ISO/IEC 13818-3..............................................4 2 MP3 中常見的術語................................................................................5 2.1 啥叫 MP3.........................................................................................................5 2.2 什麼是 LSF......................................................................................................5 2.3 什麼是幀(frame)........................................................................................5 2.4 什麼是幀頭(header)...................................................................................5 2.5 啥是 CBR和 VBR ..........................................................................................5 2.6 比特率(bitrate)...........................................................................................6 2.7 邊資訊(side information)...........................................................................6 3 VBR MP3 的幀頭格式詳解..................................................................6 3.1 VBR MP3的幀頭類型.....................................................................................6 3.2 MPEG 音頻幀格式及其含義介紹..................................................................6 4 MP3 的播放時間的計算公式及 XING 和 VBRI 頭介紹....................94.1 CBR的 MP3 的播放時間(duration)計算公式................................................9 4.2 VBR的 MP3 的播放時間(duration)計算公式................................................9 4.2.1 Xing TAG / Xing 頭(header)...........................................................................9 4.2.2 VBRI頭(header)............................................................................................10 5 計算 CBR 和 VBR 的 MP3 檔案的播放時間的步驟......................11 5.1 定位到 MPEG的幀頭的位置......................................................................11 5.2 解析 MPEG幀頭,擷取必要資訊..............................................................11 5.3 判斷是 VBR還是 CBR,根據公式計算播放時間....................................11 5.3.1 定位出 Xing 頭....................................................................................................12 5.3.2 如果有,解析 Xing 頭,并計算播放時間........................................................12 5.3.3 如果沒 XING 頭,定位出 VBRI 頭位置,找 VBRI 頭....................................12 5.3.4 如果都沒找到,說明是 CBR,則計算 CBR的播放時間..............................12 6 MP3 的檔案的内容組織結構..............................................................13 7 後記......................................................................................................14 8 文章引用..............................................................................................15 【表格索引】 表 1 MPEG音頻幀頭的格式................................................................................................7 表 2 比特率............................................................................................................................8 表 3 每幀的采樣數................................................................................................................8 表 4 MPEG不同版本對應的采樣率....................................................................................8 表 5 XING 頭......................................................................................................................10 表 6 VBRI頭.......................................................................................................................11 表 7 Layer III 的邊資訊(side information)....................................................................12 表 8 MP3檔案的内容組織結構.........................................................................................14 1.MPEG的相關知識 想要了解如何計算 VBR的 MP3的播放時間之前,要簡單了解一些 MP3相關的一些基本概 念,主要是 MPEG 的相關知識和編解碼的一些知識: 1.1 MPEG 是啥 MPEG 全名Moving Pictures Experts Group,動态圖像專家組,簡單說就是一個專家組, 專門研究一些音視訊規範的,是以才叫專家,不是我們國家的“磚家”哦。這個專家組是在 ISO/IEC(International Standards Organization/International Electrotechnical Commission, 國際标準化組織/國際電工委員會)聯合指導下成立的。這個組,專門去研究出一個數字音 視訊的壓縮相關的規範,是以最後研究出适用于不同應用環境的 N多規範。 和事物發展的過程類似,研究出這麼多的規範也是,不同時期,不同的版本,針對不同的應 用。也是由簡到繁。并且,命名規則都是,按照阿拉伯數字從小到大的:MPEG 1,MPEG2, MPEG4,MPEG-7,最新版本,好像都有 MPEG-21 了。 1.2為啥沒了 MPEG-3 估計有人納悶了,為啥中間的 MPEG3 咋沒了呢? 是沒 MPEG3,當然,不是被劉謙變魔術變沒了,而是由于當時設計者沒有規劃好,導緻已 經設計好的 MPEG2,性能太好了,都能幹本來打算讓 MPEG3 幹的活了,是以後來幹脆就 不去再設計 MPEG3了,原定計劃就取消了,也就沒了 MPEG3。看來這個 MPEG3,待遇 貌似不比胎死腹中好多少。對于很多人誤解的,以為 MP3就是 MPEG-3,也就更錯的離譜 了。關于 MP3的名稱來曆,下面會再解釋。 1.3 MPEG2.5又是啥 MPEG2.5,簡單說就是出身不正,不是官方推出的規範。MPEG 2.5是針對 MPEG2的一 個非官方的擴充版本,支援更低的采樣率。關于其更多解釋,網上找到這些: MPEG 聲音标準提供三個獨立的壓縮層次:Layer I、Layer II 和 Layer III。使用者具體選哪個 Layer,可以根據自己的要求,在權衡複雜性和聲音品質之後,做出自己的選擇。 A.Layer I 的編碼器最為簡單,編碼器的輸出資料率為 384 kb/s,主要用于小型數字盒式磁 帶(digital compact cassette,DCC)。 B.Layer II的編碼器的複雜程度屬中等,編碼器的輸出資料率為 256 kb/s~192 kb/s,其 應用包括數字廣播聲音(digital broadcast audio,DBA)、數字音樂、CD-I(compact disc-interactive)和 VCD(video compact disc)等。 C.Layer III 的編碼器最為複雜,編碼器的輸出資料率為 64 kb/s,主要應用于 ISDN 上的聲 音傳輸。 MPEG-1 Layer III 支援的采樣率為 32,44.1,48khz,比特率支援 32---320kbps MPEG-2 Layer III支援的采樣率為 16,22.05,24khz,比特率支援 8---160kbps Fraunhofer對此又進行擴充,将原來MPEG-2所支援的低采樣率再除以2,得到: 8, 11.025, 和 12 kHz,比特率跟 MPEG-2相同,稱為 "MPEG 2.5"。 1.4 MPEG 中不同幀之間的關系 對于 Layer I 和 Layer II,不同的幀之間,是互相獨立的。也就意味着,你可以任意截取 MPEG 的音頻檔案,然後找到第一個正确的幀頭,然後解碼,然後接下來放餘下的幀,這樣都可以正确的播放。而對于 Layer III,所有幀不保證都是互相獨立的。由于可能用到“位元組蓄水池 (byte reservoir)”,即内部的一個資料緩存,這些幀,都是相關的,最差情況下,要連續 緩沖儲存 9個幀,才能對第一幀解碼。 1.5 MPEG-1和 MPEG-2 音頻特性 1.5.1 MPEG-1音頻(ISO/IEC 11172-3) 其描述了三層音頻編碼,具有如下特性: A. 一個或兩個音頻聲道 B.采樣率 32KHz、44.1KHz 或 48KHz C. 比特率從 32Kbps 到 448Kbps D. 每一層都有其自己的其他特點。 1.5.2 MPEG-2音頻(ISO/IEC 13813-3) 其包含了對 MPEG-1 的兩種擴充。通常稱為 MEGP-2/低采樣率(LSF)和 MPEG-2/多聲道 (Multichannel)。 1.5.2.1 MPEG-2/LSF 的特性: A. 一個或兩個音頻聲道 B.采樣率隻有 MPEG-1 的一半 C. 比特率從 8Kpbs 到 256Kbps 1.5.2.2 MPEG-2/多聲道,的特性: A. 多達 5 個全範圍的音頻聲道和一個 LFE(Low Frequency Enhancement,也叫做 重低 音)聲道 B. 采樣率和 MPEG-1相同 C. 對于 5.1聲道,最高的比特率可達 1Mpbs 1.6 什麼是 ISO/IEC 11172-3 和 ISO/IEC 13818-3 由于 MPEG隻是 ISO/IEC下面的一個組織,是以,關于 MPEG 音頻部分的規範,也多是 出自 ISO/IEC之手。 是以,ISO/IEC 11172 和 ISO/IEC 13818,其實就是 MPEG1 的音頻部分和 MPEG-2的别 名。 另外,由于 MPEG-1 和MPEG-2,每個都分好幾個部分,其中,第三部分是關于音頻的。 是以,ISO/IEC 11172-3 和 ISO/IEC 13818-3,就分别對應着 MPEG-1 的音頻,MPEG-2 的音頻,也就是我們常常提到的 MPEG 的音頻檔案所對應的規範。 2 MP3 中常見的術語 知道了 MPEG 的來龍去脈後,在了解 MP3 的播放時間如何計算之前,也要知道其他一些, 和 MP3相關的知識,和常見的術語: 2.1 啥叫 MP3 注意,這個 MP3,不是 MPEG-3,但是為何叫 MP3,是因為: MPEG 規範中規定了,每一個版本的 MPEG,比如 MPEG1,MPEG2等,都有三種不同的 Layer,不同 Layer 的序号指令是以羅馬數字的,是以叫做 Layer I, Layer II, Layer III。 其中,最常見的就是 MPEG 1 的 Layer III,就是衆所周知的 MP3。 根據事物發展由簡到繁的規律,我們知道,Layer III,相對 Layer I 和 Layer II,其有着更複 雜的壓縮算法。正是其相對複雜,用了很多算法,比如聲學上的掩蔽效應(masking effect), Huffman 壓縮等,使得盡可能保持音質的基礎上,極大地減少了音頻檔案大小,也就是說, 盡量讓你聽上去音頻聲音和音質都沒啥變化,但是 MP3的檔案大小,相對于原先沒處理的, 或者其他格式的,比如 WAV 格式等,要小很多,友善大家互相傳播交流。這也是 MP3 如 此流行的主要原因之一。 2.2 什麼是 LSF MPEG2/2.5 也常被簡稱為 LSF(Low Sampling Frequencies),低采樣率。 2.3 什麼是幀(frame) 通俗點說,就是一段連續的資料塊。對于 MPEG 音頻檔案本身,并沒有什麼檔案頭,而是 由很多資料塊所組成,這樣的單個的資料塊,就叫做一個(資料/音頻)幀(frame)。MP3 檔案,同理,由很多個幀所組成。幀,也是其他很多音視訊技術中的基本機關。 2.4 什麼是幀頭(header) 每一個幀裡面,包含了幀頭和音頻資料。幀頭,就是在幀的頭部,有一定長度的資料,用于 描述改幀音頻的一些參數,用于解碼器對此音頻幀進行解碼。對于 MPEG 的幀頭,是固定 的 32 比特,即 4 位元組。 2.5 啥是 CBR和 VBR CBR(Constant bitrate)固定(/不變)比特率,VBR(Variable bitrate ),不定(/可變)比特 率,變與不變,指的是 MP3的比特率是否固定。音頻檔案可以被編碼成 CBR或 VBR。VBR 意思就是,每一幀的比特率不同。由于 VBR可以在需要的時候,采用高比特率,是以,一 般來說,VBR的音質比 CBR的要好。 很多種音視訊檔案,都可以按照 VBR來壓縮,比如 MP3、WMA、Vorbis OGG、AAC, MPEG-2 的視訊等。VBR的優點是,和 CBR相比,用更小的空間,即檔案更小,實作更高 的音質。缺點是,編碼複雜度增加,編碼需要更長時間,而有些硬體編碼器可能和 VBR不 相容。 2.6 比特率(bitrate) 即每秒包含/播放了多少個比特的資料。比特率常用 Kbps(kilo bits per second,千比特每 秒)表示。此處的千位元組=1000位元組,而不是 1024. 2.7 邊資訊(side information) 在 MPEG 音頻的幀頭後面,有一些解碼器會用到的一些資訊,用于解碼器控制音頻流的播 放,它就叫做 邊資訊。不同版本的 MPEG 的 Layer III 的邊資訊的大小,詳見後面的表。 3 VBR MP3的幀頭格式詳解 3.1 VBR MP3的幀頭類型 VBR MP3的幀頭主要有兩種,XING 和 VBRI。 關于它們的具體格式和含義,下面會詳細解釋。 另外常常會提到的是,關于 V1和 V2 兩個版本的 ID3 頭資訊,這個主要是用于記錄音頻文 件的一些描述資訊,比如歌手,專輯,曲風等,和對音頻檔案解碼,沒有直接關系。屬于存 儲音頻檔案附屬資訊的頭。 ID3的 V1和V2,不會同時存在。如果存在 ID3的話,一般 ID3 V1會放在音頻檔案的最後, 大小 128個位元組,其中前三個位元組是字元“TAG”。ID3 V2 放在音頻檔案的開頭處,前三個 位元組是字元“ID3”。 關于 ID3的具體格式,請參考附錄中的引用文獻。 由于此處介紹的内容,目的是盡快,盡可能精确地去估算 MP3 檔案的(持續)播放時間。 是以,此處不涉及,關于如何去編解碼實際的音頻資料。 3.2 MPEG 音頻幀格式及其含義介紹 MPEG 音頻檔案,由一個個的幀(Frame)組成。每一幀都有個幀頭(Frame Header), 位于該幀的最開始處,接下來的是音頻資料。音頻資料多數都是包含了 固定數目 的 音頻 采樣(Sample)。正是基于這個特性,才有後面的 VBR的播放時間計算公式。 前面介紹過了,目前,存在的三種 Layer 的 MPEG 音頻,盡管他們的壓縮方法各不相同, 但是幀頭格式都一樣。 這些幀,由一個個的 Slot(槽)組成。 Layer I 中,一個 Slot 是4 個位元組,在 Layer II和 Layer III中,一個 Slot 是一個位元組。 MPEG 幀頭的格式及含義 位置 長度 含義 示例 0 11 用于同步幀,找到此幀頭(所有位均置 1) 1111 1111 111 11 2 音頻版本 ID (參見 表 3.2) 00 - 版本是 MPEG 2.5 (MPED-2 的非官方擴充版本) 01 – 保留 10 – 版本是 MPEG 2 (ISO/IEC 13818-3) 11 – 版本是 MPEG 1 (ISO/IEC 11172-3) 11 13 2 Layer 的索引 00 – 保留 01 - Layer III 10 - Layer II 11 - Layer I 01 15 1 保護位 0 – 用 16位的 CRC保護下面的幀頭 1 – 無 CRC 1 16 4 比特率索引 (參見 表 2.1.3) 1001 20 2 采樣率索引 (參見表 2.1.2) 11 22 1 填充位 如果設定了,就會對每幀資料填充一個 slot (對于幀大 小的計算很重要) 0 23 1 私有位 (僅用于标示性的) 1 24 2 聲道的模式 00 – 立體聲 01 – 混合立體聲 10 – 雙聲道 (兩個單聲道) 11 – 一個聲道 (單聲道) 注: 雙聲道檔案由兩個獨立的單聲道所組成。大多數解 碼器把雙聲道輸出成立體聲,但是實際上,不是所有的 雙聲道都是立體聲的。 01 26 2 模式擴充 (僅用于聯合立體聲) (參見 表 2.1.6) 00 表 1 MPEG音頻幀頭的格式 在 MPEG 标準中,描述了一種自由格式(free format),這種自由格式意思為用一個固定 比特率對檔案進行編碼,而此固定的比特率不是我們表中預定義好的。一般的解碼器都無法 解碼這類音頻檔案。 下面是比特率索引表,(機關:Kbit/sec)。 MPEG 1 MPEG 2, 2.5 (LSF) 比特率 索引 Layer I Layer II Layer III Layer I Layer II & III 0000 空閑 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 保留 表 2 比特率 為了計算幀大小,我們需要知道,每一幀裡面包含多少個采樣,即采樣數/幀(sample per frame)。 MPEG 1 MPEG 2 (LSF) MPEG 2.5 (LSF) Layer I 384 384 384 Layer II 1152 1152 1152 Layer III 1152 576 576 表 3 每幀的采樣數 根據 MPEG幀頭裡面的索引,對應的,不同版本的 MPEG的采樣率也是不同的: 采樣率索引 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 保留 表 4 MPEG不同版本對應的采樣率 4 MP3 的播放時間的計算公式及 XING 和 VBRI頭介紹 4.1 CBR 的 MP3的播放時間(duration)計算公式 是以,幀大小可以用如下公式計算: Frame Size = ( (Samples Per Frame / 8 * Bitrate) / Sampling Rate) + Padding Size 幀大小 = ((每幀的采樣數 ÷ 8 × 比特率) ÷ 采樣率)+ 填充大小 【公式 1】 由于舍入誤差,官方的計算幀大小的方法和此稍有不同。根據 ISO 标準,應該以 slot 為單 位進行計算,然後對結果取整,再乘于 slot 的大小。 用如下公式可以計算 MP3的播放時間,以秒為機關: CBR Duration = File Size / Bitrate * 8 播放時間 = 檔案大小 ÷ 比特率 × 8 【公式 2】 對于 CBR的檔案,可以用上面的公式,通過第一幀,算出整個檔案的播放時間。 對于 VBR,要用另外的公式。下面将會詳細介紹。 4.2 VBR 的 MP3的播放時間(duration)計算公式 想要計算 VBR的 MP3 的播放時間,我們必須要知道整個檔案的平均比特率(average bitrate)。此平均比特率,一般來說,往往和第一幀的比特率相差很大。因為 MP3音樂的 開頭部分,很多是用于現實标題的一些幾乎無聲的資料。也就意味着,如果解碼器對于 VBR 檔案,按照CBR檔案來解碼,而去通過第一幀去計算整個檔案的播放時間,那麼往往結果 和實際相差很大。這也就是後面引用中一個文章裡面遇到的情況,即,Media Player Classic 播放 VBR的MP3時的時間問題。 為了得到平均比特率,你必須周遊整個檔案的所有幀,然後再才能計算出來,即算出一 共有多少幀,将每一幀的比特率加起來得到個總和,用總和去除于幀數,就是平均比特率了。 由于這個做法效率太低,是以就有了 VBR的頭這個東西,其放在第一幀幀頭的後面的。 其包含了此 VBR一共有多少幀,有了總的幀數,你就可以用下面的公式去計算播放時間了: VBR Duration = Number of Frames * Samples Per Frame / Sampling Rate VBR檔案播放總時間 = 總的幀數 × 每一幀的采樣個數÷ 比特率 【公式 3】 此外,VBR的頭中,往往還包含了一個用于定位的 TOC(table of content)目錄表。即用 于在快進或快退的時候,通過表中的資訊,可以友善地定位到對應的位置。如果沒有此 TOC 表,需要單獨去計算出對應的位置,比較麻煩。 4.2.1 Xing TAG / Xing頭(header) 此 tag由 XING 公司推出的算法/規範,是以叫做 XING。 對于大多數的 VBR檔案都加了此頭,但并不全是。此頭位于 MPEG 音頻頭後面的某個特定 位置。包好了此 XING 頭的第一個幀,其後的資料是空的,是以即使解碼器沒有考慮到此頭, 也可以正常處理此幀。對于Layer III的檔案來說,比如常見的MP3,此VBR放在邊資訊(side information)之後。 下表是 XING 頭的具體格式及含義: 位置 長度(位元組) 含義 示例 0 4 4 個 ASCII 字元的 VBR 頭 ID,要麼是 Xing, 要麼是 Info,無 NULL 結尾(普通字元串都以 NULL,即\0 結尾) 'Xing' 4 4 存放一個标志,用于表示接下來存在哪些域/字 段,各字段邏輯或的結果. 0x0001 - 存在總幀數(Frames)字段 0x0002 - 存在檔案大小(Bytes)字段 0x0004 –存在 TOC字段 0x0008 – 存在音頻品質訓示字段 0x0007 就表示下面存在 總 幀數,檔案大小總字 節數,TOC表 8 4 總幀數(Frames),大端[可選] 7344 8 或 12 4 檔案總大小,機關位元組,大端[可選] 45000 8,12,16 100 TOC表,大端[可選] 8 或 12, 16, 108, 112 ,116 4 音頻品質訓示,最差 0,最好 100,大端[可選] 0 表 5 XING 頭 雖然知道了 XING 頭的具體含義,可以去根據具體的值,解析出對應的含義了,但是,由于 其是放在 side information之後的,是以,要先定位,找到 XING頭,關于其位置,用如下 公式計算: XING 頭位置 = MPEG 頭位置 + MPEG幀頭大小 + 邊資訊大小 = MPEG 頭位置 + 4 + 邊資訊大小 【公式 4】 根據頭的格式,Xing 頭裡面必須包含 ID和 flag這兩個段。其他字段都是可選的,是否包含, 要看 flag 的值。有時候這個 Xing 頭,CBR裡面也有,此時,前面的 ID的值就是 Info,而 不是 Xing 了。 4.2.2 VBRI 頭(header) 據了解,目前此頭資訊,隻有用 Fraunhofer 的編碼器生成的 MPEG 音頻檔案,才會用到此 頭。其和 Xing 頭不一樣,其放在第一個 MPEG 頭的後面,大小正好是 32位元組。其位置, 長度和示例,都是以位元組為機關。 下表是 VBRi頭的具體格式及含義,機關為位元組: 位置 長度 含義 示例 0 4 4個 ASCII字元的 VBR頭 ID:“VBRI”無 NULL 結尾 “VBRI” 4 2 版本 ID,大端,類型:DWORD 1 6 2 延遲,類型:float 7344 8 2 音頻品質訓示 75 10 4 檔案總大小,大端,類型:DWORD 45000 14 4 總的幀數,大端,類型:DWORD 7344 18 2 TOC表的表項數目,大端,類型:WORD 100 20 2 TOC表項的縮放因子,大端,類型:DWORD 1 22 2 單個 TOC表項的大小,機關位元組,最大為 4,大端,類型:DWORD 2 24 2 幀數/表項,大端,類型:WORD 845 26 用于檢索的 TOC表,整型值,可以通過每個表項大小乘于表項個數 得到此 TOC表的總大小,大端 表 6 VBRI頭 5 計算CBR和VBR的MP3檔案的播放時 間的步驟 此處隻是大概總結一下,具體解析出播放時間,需要哪些步驟。其對應的代碼,可以去文章 引用中的【1】,注冊登入後,可以下載下傳源代碼,自己看,就知道了。 或者,可以去參考引用【2】中的 Mplayer 的 VBR 的 patch,裡面寫的更加簡單,但是也 更容易看明白。 5.1 定位到 MPEG 的幀頭的位置 如果檔案開始沒有 ID3 V2的頭資訊,那麼一般 MPEG 的幀頭位置是 0,當然,具體還是要 根據幀頭中的同步位(sync bit),共 11位去定位找到幀頭。 5.2 解析 MPEG 幀頭,擷取必要資訊 主要是根據幀頭格式,解析出 MPEG 的版本,MPEG 的 Layer,以及采樣率,比特率等信 息,用于後面的解碼和計算播放時長。 5.3 判斷是 VBR 還是 CBR,根據公式計算播放時間 解析完 MPEG 頭之後,按照如下步驟去判斷是 CBR還是 VBR,并計算出播放時長: 5.3.1 定位出 Xing頭 根據: XING 頭位置 = MPEG頭位置 + 4 + 邊資訊大小 【公式 4】 計算定位到 XING 頭所在位置。上式中: MPEG 頭位置: 如果沒有 ID3 V2 這類的資訊的話,那麼 MPEG 頭位置就是檔案的最開始,即 0的位置。 MPEG 幀頭大小: 固定的 32 bit = 4位元組,是以加 4. 邊資訊大小: 對應 Layer III,根據 MPEG 的版本,查下表可得,機關為位元組: MPEG 1 MPEG 2/2.5 (LSF) 立體聲,聯合立體聲,雙聲道 32 17 單聲道 17 9 表 7 Layer III 的邊資訊(side information) 5.3.2 如果有,解析 Xing 頭,并計算播放時間 VBR檔案播放總時間 = 總的幀數 × 每一幀的采樣個數÷ 比特率 【公式 3】 計算出播放時間長度。 其中: 總的幀數(Number of Frames): 可以通過解析 XING 頭,找出裡面總幀數(Frames),這個字段,一般都是存在的。 每一幀的采樣個數(Samples Per Frame): 根據前面解析 MPEG,找到 MPEG的版本,以及其實哪個 Layer,然後根據表 3.2.3 每幀 的采樣數,得到,每一幀有多少個采樣。 比特率(Sampling Rate): 根據前面解析 MPEG,找到 4比特大小的比特率索引 ,然後根據表 3.2.2 比特率(機關: Kbit/sec),得到此比特率大小。 5.3.3 如果沒 XING頭,定位出 VBRI頭位置,找 VBRI 頭 如果找到,解析 VBRI,然後和 XING 頭算法類似,得到需要的值,再根據【公式 3】計算 出播放時間長度。 5.3.4 如果都沒找到,說明是 CBR,則計算 CBR的播放時間 Xing 和 VBRI 都無,則是CBR,然後就可以用【公式 1】和【公式 2】,計算出播放時間 長度了。 其中【公式 1】中所涉及到的: 每幀的采樣數(Samples Per Frame): 同上,可根據 MPEG 頭解析出來。 比特率(Bitrate): 同上,可根據 MPEG 頭解析出來。 采樣率(Sampling Rate): 根據 MPEG頭中解析出來的采樣率索引,然後查表:表 3.2.4 MPEG 不同版本對應的采樣 率,即可。 填充大小(Padding Size): 根據 MPEG幀頭中的 Padding 位得知是 0 還是 1。多數 MP3,都沒有 padding,即為 0. 計算出上面幾個值後,可以根據: 幀大小 = ((每幀的采樣數 ÷ 8 × 比特率) ÷ 采樣率)+ 填充大小 【公式 1】 計算出幀大小,然後再去計算: 檔案大小(File Size): 這個自己計算就可以得到,我的了解是: 檔案大小 = 總檔案大小 – 頭資訊 這裡的頭資訊,指的是 ID3 V1或 ID3 V2 之類的頭。 剩下的,總檔案大小,這個不用多解釋吧,就是整個讀取出來的檔案大小。 然後,就可以根據: 播放時間 = 檔案大小 ÷ 比特率 × 8 【公式 2】 計算出播放時間了。 6 MP3 的檔案的内容組織結構 是以,總結起來,一般的 MP3 檔案所包含的内容如下: [ID3。。。] ID3 V2的頭,大多數最新的 MP3,都有這個頭 [APE 頭] 用于 APE 格式的頭,現在也用于 MPEG 第一幀包含: 1.MPEG 音頻頭, 固定的 4 位元組 2.邊資訊,9/17/32 位元組 [3.Xing 頭] 8-120 位元組,如果是 VBR,多數都有此 Xing 頭,而且隻有第一幀有 。。。。。音頻資料。。。。 第二幀(幀頭,邊資訊,資料。。。) 第三幀(幀頭,邊資訊,資料。。。) 。。。 最後一幀(幀頭,邊資訊,資料。。。) [TAG 。。。] 128位元組的 ID3 V1資訊,如果沒有前面的 ID3 V2,多數都有這個 ID3 V1的頭 注:[]号内的,表示,可選,即如果有的話。 表 8 MP3 檔案的内容組織結構 7 後記 最後想說的是,其實很無語,對于很多東西,尤其是計算機相關的技術,網上能找到的中文資料,多數都是說的不是太清楚。其中,包括我這裡要找的,如何去計算 VBR的播放時間, 多數情況是,不論是去百度 Google 一下,還是去 Google 百度一下,找了半天,還是沒看 到有幾個人能說清楚。讓人越發感歎道,國内的計算機方面的技術,和國外,差的的确不是 一點兩點。人家把規範都定好了,過了 N年了,結果咱們到現在,也沒幾個搞清楚咋回事。。。 是以,對于計算機方面的資料,尤其是涉及底層技術的,能詳細解釋清楚你的問題的,多數 都是一些英文原版資料。是以,在此,再次,感謝一下原作者。。。 8 文章引用 【1】MPEG Audio Frame Header [登陸該頁面後,有源碼和程式供下載下傳] http://www.codeproject.com/KB/audio-video/mpegaudioinfo.aspx 【2】MPlayer-1.0rc1 和 MPlayer-1.0rc2 的 VBR patch http://hi.baidu.com/serial_story/blog/item/9180ba35f07d1d1891ef39e8.html 【3】MPEG AUDIO FRAME HEADER (mp3 format) http://www.datavoyage.com/mpgscript/mpeghdr.htm 【4】.MPEG Audio Layer I/II/III frame header http://www.mp3-tech.org/programmer/frame_header.html 【5】MP3 Profi Info http://www.goat.cz/index.php?path=MP3_MP3ProfiInfo 【6】MP3 Tech http://www.mp3-tech.org/ 【7】Media Player Classic 播放 VBR的 MP3時的時間問題 http://xialulee.spaces.live.com/blog/cns!4ee324c8acfa82db!230.entry?wa=wsignin1.0&sa =835890451 【8】什麼是 MP3 http://wenwen.soso.com/z/q140151046.htm 【9】Variable bitrate http://en.wikipedia.org/wiki/Variable_bitrate 【10】MPEG Audio Compression Basics http://www.datavoyage.com/mpgscript/mpeghdr.htm 【11】ID3 tag version 2 http://id3.org/id3v2-00