日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何计算MP3总时长的问题(二)

發布時間:2025/4/14 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何计算MP3总时长的问题(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?????? 接著上一次的往下寫

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的總時長,牢牢記住上面的表格,一切的信息都能從那里來。

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

轉載于:https://www.cnblogs.com/candycaicai/archive/2010/11/12/1875936.html

總結

以上是生活随笔為你收集整理的如何计算MP3总时长的问题(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。