如何計算MP3總時間長度的問題(二)

來源:互聯網
上載者:User

       接著上一次的往下寫

2、Mp3的幀詳解 

  每一幀其實包括 幀頭,附加資訊,主要資料,其實我們只要找到幀頭,幀頭中所包含的資料就能讓我們掌控這一幀的資訊,幀頭固定4個位元組(32bit),格式如下

  AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM 

 下面是就是每個位置代表的含義: 

標識

長度

含義

樣本

A

11

用於同步幀,找到此幀頭(所有位均置 1)

11111111111

B

2

音頻版本 ID
00 - 版本是 MPEG 2.5 (MPED-2 的非官方擴充版本)
01 – 保留
10 – 版本是 MPEG 2 (ISO/IEC 13818-3)
11 – 版本是 MPEG 1 (ISO/IEC 11172-3) 通過ID查表得其他資訊

11

C

2

Layer 的索引
00 – 保留
01 - Layer III
10 - Layer II
11 - Layer I

01

D

1

保護位
1 – 無 CRC 0 – 用 16位的 CRC保護下面的幀頭

1

E

4

位元速率索引(查表)

1001

F

2

採樣率索引 (查表)

10

G

1

填充位,如果為1,計算幀長時,要多加1

1

H

1

私人位 (僅用於標示性的)

1

I

2

聲道的模式
00 – 立體聲
01 – 混合立體聲
10 – 雙聲道 (兩個單聲道)
11 – 一個聲道 (單聲道)

01

J

2

聯合立體聲(joint stereo) 採用聯合立體聲編碼方式的兩個聲道具有關聯性。

例如MS_stereo將兩個聲道相加、相差後處理,相減後去掉了左右聲道相同的成份,後續的壓縮可得到更高的壓縮率。

10

K

1

著作權保護,0=no 1=yes

1

L

1

原始版本,0=no 1=yes

0

M

1

預加重 00 - none
01 - 50/15 ms
10 - reserved
11 - CCIT J.17

01

 

  1)位元速率

其中E和F位置的值,是通過mpeg ID和layer索引查標準的值,我寫成了一個數組,直接查表得到位元速率

int  bitrate[5][15] = {
    /* MPEG-1 */
    { 0,  32000,  64000,  96000, 128000, 160000, 192000, 224000,  /* Layer I   */
    256000, 288000, 320000, 352000, 384000, 416000, 448000 },
    { 0,  32000,  48000,  56000,  64000,  80000,  96000, 112000,  /* Layer II  */
    128000, 160000, 192000, 224000, 256000, 320000, 384000 },
    { 0,  32000,  40000,  48000,  56000,  64000,  80000,  96000,  /* Layer III */
    112000, 128000, 160000, 192000, 224000, 256000, 320000 },
    /* MPEG-2 ,MPEG-2.5 */
    { 0,  32000,  48000,  56000,  64000,  80000,  96000, 112000,  /* Layer I   */
    128000, 144000, 160000, 176000, 192000, 224000, 256000 },
    { 0,   8000,  16000,  24000,  32000,  40000,  48000,  56000,  /* Layer    */
    64000,  80000,  96000, 112000, 128000, 144000, 160000 } /* II & III  */
};

  2)採樣頻率:

int samplingrate[4][3] = {  //value s are in Hz
    {11025 , 12000 , 8000},      //MPEG Version 2.5 
    {0,0,0},                                       //reserved 
    {22050, 24000, 16000},   //MPEG Version 2 (ISO/IEC 13818-3) 
    {44100, 48000, 32000}     //MPEG Version 1 (ISO/IEC 11172-3) 
}; 

3)每幀期間

在這裡在介紹一個比較重要的概念那就是,每幀期間,MP3有一個特殊性,那就是每幀期間是固定的:

每幀期間(毫秒) = 每幀採樣數 /  採樣頻率 * 1000

我們從第一幀的幀頭可以得音頻版本 ID和layer版本,從而可以確定每幀採樣個數

             mpeg 1   mpeg 2   mpeg 2.5

layer I    384         384        384

layer II   1152      1152      1152

layer III  1152      576        576

現在我們應該很清楚的知道,為什麼我們只需要知道MP3是mpeg1的layerIII層的原因了;(但是按照我現在的理解只要是layer III的就是MP3,呵呵,可以討論)

(寫這個有點慢,因為不會用,不知道咋添加表格,不習慣)

4)計算總時間長度

下面我們來看計算時間的公式:

播放時間 = 總幀bytes ÷ 位元速率 × 8000

位元速率:查表可得到;

總幀bytes:簡單的看就是,總檔案的大小-ID3資訊,總檔案大小就是讀取整個檔案的大小,ID3就是之前說過的ID3V2和ID3V1,ID3V1在末尾處128個位元組,ID3V2在檔案開始為止,大小可以從標籤頭得到,之前講過,這樣我們就能準確的得到總幀bytes,我們就能計算出來mp3的總時間長度了.

  

但是這隻是對固定位元速率(CBR)的MP3總時間長度的計算方式,對於變位元速率(VBR)的MP3,由於每幀的位元速率可能不同,用以上的公式就無法準確算出來mp3總時間長度,有些文檔說可以計算平均位元速率,但是這個估算值偏差有時候很大,下一次我來詳細講如果求變化位元速率Mp3的總時間長度,牢牢記住上面的表格,一切的資訊都能從那裡來。

(才開始寫部落格,實在不太習慣,寫的比較慢,文章繼續連載)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.