如何计算MP3总时长的问题(二)
?????? 接著上一次的往下寫
2、Mp3的幀詳解?
每一幀其實包括 幀頭,附加信息,主數據,其實我們只要找到幀頭,幀頭中所包含的數據就能讓我們掌控這一幀的信息,幀頭固定4個字節(32bit),格式如下
AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM?
下面是就是每個位置代表的含義:
| 標識 | 長度 | 含義 | 示例 |
| A | 11 | 用于同步幀,找到此幀頭(所有位均置 1) | 11111111111 |
| B | 2 | 音頻版本 ID | 11 |
| C | 2 | Layer 的索引 | 01 |
| D | 1 | 保護位 | 1 |
| E | 4 | 比特率索引(查表) | 1001 |
| F | 2 | 采樣率索引 (查表) | 10 |
| G | 1 | 填充位,如果為1,計算幀長時,要多加1 | 1 |
| H | 1 | 私有位 (僅用于標示性的) | 1 |
| I | 2 | 聲道的模式 | 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 |
?
??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总时长的问题(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一起来用Websocket(一)开篇 W
- 下一篇: 在Java项目用框架(hibernate