接著上一次的往下寫
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的總時間長度,牢牢記住上面的表格,一切的資訊都能從那裡來。
(才開始寫部落格,實在不太習慣,寫的比較慢,文章繼續連載)