mp3 編碼
在MPEG文件中,沒有主標(biāo)頭,因?yàn)镸PEG的音頻文件是由一系列被稱為幀的較小部分組成的。每個幀都是一個具有自己標(biāo)頭和音頻信息的數(shù)據(jù)塊。
Layer II,II,III的音頻幀頭都是相同的,不同之處體現(xiàn)在音頻數(shù)據(jù)的編碼方式。幀本身是由slot組成的。Layer I的slot大小是4字節(jié),其余情況是1字節(jié)。
除了Layer之外,MPEG音頻本身也有3個版本,這個幾個版本的不同之處體現(xiàn)在能處理的采樣率不同(參考 表2.1.2)。MPEG 1 (ISO/IEC 13818-3) 和MPEG2(ISO/IEC 11172-3)是ISO標(biāo)準(zhǔn). MPEG2.5對MPEG2進(jìn)行的非官方的擴(kuò)展,它是為了支持更低的采樣率。MPEG2/2.5 也常被簡稱為LSF(Low SamplingFrequencies),既低采樣率
對于Layer I和Layer II,幀是完全彼此獨(dú)立的,因此您可以剪切MEPG音頻文件的任何部分并正確的播放。然后,播放器將從發(fā)現(xiàn)的第一個完整有效的幀開始播放。但是,Layer III,幀不總是獨(dú)立的,因?yàn)樗赡苁褂昧薭yte resevoir,這是一種內(nèi)部緩沖區(qū),因此幀之間通常是相互依賴的。在最壞的情況下,可能至少需要輸入9個幀才能解碼單個幀。
如果你需要檢索有關(guān)MPEG的音頻文件的信息,那么可以簡單的找到第一幀,然后從它的header中獲取信息。除比特率外,其他幀中的信息應(yīng)該與第一個幀是一致的,因?yàn)榭赡墚?dāng)前是VBR的文件。在VBR的文件中,可以在每個幀中更改比特率。例如,為了在整個文件中保持音樂的高質(zhì)量,當(dāng)音樂比較復(fù)雜時就需要更多的位來做編碼
幀頭本身的長度是32位的(4字節(jié))。幀頭的前十二位(在MPEG2.5擴(kuò)展的情況下為前十一位)始終設(shè)置為1,稱為幀同步。幀還可能有可選的CRC校驗(yàn)和。它長16位,如果存在,則緊跟在幀頭之后。CRC之后就是音頻數(shù)據(jù)。通過重新計(jì)算CRC并將值與文件中的值進(jìn)行比較,就可以檢查比特流在傳輸期間是否已經(jīng)被更改。
一個文件可以被編碼成恒定比特率(CBR)或可變比特率(VBR),這意味著每幀可以有不同的比特率。可變比特率的質(zhì)量往往比恒定比特率編碼的文件更高,因?yàn)樗麄兛梢栽谛枰牡胤绞褂酶叩谋忍芈省?/p>
MP3文件的整體結(jié)構(gòu):
[ID3 V2] | [APE 頭]: 可選
ID3 V2的頭,大多數(shù)最新的MP3,都有這個頭
用于APE格式的頭,現(xiàn)在也用于MPEG
第一幀
MPEG 音頻頭, 通常大小為4字節(jié).(當(dāng)Protection bit==0時,幀頭后會有16bit=2byte的CRC,此時幀頭大小為6字節(jié))
邊信息,9/17/32 字節(jié)
[Xing 頭]: 可選 8-120字節(jié),如果是VBR,多數(shù)都有此Xing頭,而且只有第一幀有
音頻數(shù)據(jù)
第二幀
幀頭
邊信息
音頻數(shù)據(jù)
第三幀
幀頭
邊信息
音頻數(shù)據(jù)
最后一幀
幀頭
邊信息
音頻數(shù)據(jù)
[TAG]: 可選。128字節(jié)的ID3 V1信息,如果沒有前面的ID3 V2,多數(shù)都有這個ID3 V1的頭
mp3幀頭編碼
起始位置0位高位開始
起始位置大小位置描述
01131-21幀同步標(biāo)識,11個‘1’。用于定位幀頭起始位置
11220-19MPEG音頻版本
13218-17Layer序列號
15116Protection bit
16415,12比特率
20211-10采樣率
2219Padding bit的定義
2318保護(hù)位
2427-6channel模式
2625-4只用于Joint stereo 模式擴(kuò)展
2813版權(quán)位 0:無版權(quán) 1:有版權(quán)
2912原始位 0:原始媒體的副本 1:原始媒體
3021-0Emphasis
MPEG音頻版本
設(shè)置值描述
00MPEG version2.5
01保留
10MPEG version2
11MPEG version1
Layer序列號
設(shè)置值描述
00保留
01Layer III
10Layer II
11Layer I
Protection-bit
設(shè)置值描述
0protected by 16 bit CRC following header
1no CRC
比特率
bitsV1,L1V1,L2V1,L3V2,L1V2, L2 & L3
0000freefreefreefreefree
0001323232328
00106448404816
00119656485624
010012864566432
010116080648040
011019296809648
01112241129611256
100025612811212864
100128816012814480
101032019216016096
1011352224192176112
1100384256224192128
1101416320256224144
1110448384320256160
1111badbadbadbadbad
NOTES: All values are in kbps
V1: MPEG Version 1
V2: MPEG Version 2 and Version 2.5
L1: Layer I
L2: Layer II
L3: Layer III
“free”:: free fromat. free bitrate必須保持恒定,并且必須小于允許的最大的比特率. 解碼器不需要支持free bitrate的流
“bad”: 意思是這個值是不被允許的.
MPEG文件可能具有可變的比特率(VBR)。每一個幀可以用不同的比特率來創(chuàng)建。這是可以在所有的layer中使用。Layer III必須這個方式,Layer I 和 Layer II 解碼器可以選擇支持 針對Layer II,不允許使用比特率和模式的一些組合。下面是一些允許的組合
bitrate單通道立體聲intensity stereodual channe
freeyesyesyesyes
32yesnonono
48yesnonono
56yesnonono
64yesyesyesyes
80yesnonono
96yesyesyesyes
112yesyesyesyes
128yesyesyesyes
160yesyesyesyes
192yesyesyesyes
224noyesyesyes
256noyesyesyes
320noyesyesyes
384noyesyesyes
采樣率
抽樣速率指定每秒鐘有多少個樣本被記錄。每個MPEG版本可以處理不同的samplingrates。
采樣率索引MPEG-1 (Hz)MPEG-2 (Hz)MPEG-2.5 (Hz)
00441002205011025
01480002400012000
1032000160008000
11reservedreservedreserved
Padding-bit
如果設(shè)置了,則用一個slot填充數(shù)據(jù)(slot對框架大小的計(jì)算很重要) Layer I的slot大小是4字節(jié),其余情況是1字節(jié)。
設(shè)置值描述
0沒有填充
1使用一個額外的slot填充數(shù)據(jù)
channel模式
設(shè)置值描述
00立體聲
01Joint stereo
10Dual channel(2 mono channels)
11Single channel(mono)
注意:雙通道文件由兩個獨(dú)立的單聲道組成。每一個都只使用了文件的一半比特率。大多數(shù)解碼器將其輸出為立體聲,但情況并非總是如此。使用一個例子是在相同的比特流中承載了兩個不同語言的語音,那么解碼器需要僅解碼所選擇的語言進(jìn)行播放
模式擴(kuò)展
擴(kuò)展模式被用來增加了一些沒有在立體聲效果使用的信息,從而減少了所需的位。這些位由在Joint stereo模式下的編碼器動態(tài)的確定,每一個幀的Joint stereo都可以改變,甚至可以打開或者關(guān)閉
MPEG文件的整個的頻率范圍分為了多個子帶,共有32個子帶。對于Layer I和Layer II來說兩個位確定了當(dāng)應(yīng)用intensity stereo時的頻率范圍(頻帶)。針對Layer III,這兩個位決定了使用哪一種類型的joint stereo(intensity stereo或者m/s stereo). 頻率范圍由解壓縮算法來確定
設(shè)置值Layer I & II
00bands 4 to 31
01bands 8 to 31
10bands 12 to 31
11bands 16 to 31
Layer III:
Intensity stereoMS stereo
offoff
onoff
offon
onon
Emphasis
設(shè)置值描述
00none
0150/15 ms
10reserved
11CCIT J.17
MP3邊信息
邊信息緊接著幀頭。它包含了一些解碼器會用到的一些信息,用于解碼器控制音頻流的播放,但不包含實(shí)際的音頻數(shù)據(jù)。下表顯示了所有Layer III文件的邊信息的大小
模式MPEG 1MPEG 2/2.5 (LSF)
立體聲,聯(lián)合立體聲,雙通道3217
Mono179
對于Layer I的文件,你必須考慮到擴(kuò)展模式(見表2.1.6)。然后你可以以下公式計(jì)算出用于計(jì)算CRC的比特位的數(shù)量:
4 * ( 聲道數(shù) * bound of intensity stereo + (32 – bound of intensity stereo) );
這可以被讀成兩倍的立體聲子帶加上單子帶的數(shù)量和結(jié)果乘以4。對于簡單的mono幀,這等于128,因?yàn)橥ǖ赖臄?shù)目是1,而強(qiáng)度立體聲的邊界是32,這意味著沒有強(qiáng)度立體聲。對于立體幀,這是256。有關(guān)更多信息,請查看類CMPAFrame中的rc代碼。
MP3解析的解析
基于MPG123庫
核心數(shù)據(jù)結(jié)構(gòu)
typedef struct mpstr_tag {
struct buf *head, *tail; /* buffer linked list pointers, tail points to oldest buffer */
int vbr_header; /* 1 if valid Xing vbr header detected */
int num_frames; /* set if vbr header present */
int enc_delay; /* set if vbr header present */
int enc_padding; /* set if vbr header present */
/* header_parsed, side_parsed and data_parsed must be all set 1
before the full frame has been parsed */
int header_parsed; /* 1 = header of current frame has been parsed */
int side_parsed; /* 1 = header of sideinfo of current frame has been parsed */
int data_parsed;
int free_format; /* 1 = free format frame */
int old_free_format; /* 1 = last frame was free format */
int bsize;
int framesize;
int ssize; /* number of bytes used for side information, including 2 bytes for CRC-16 if present */
int dsize;
int fsizeold; /* size of previous frame, -1 for first */
int fsizeold_nopadding;
struct frame fr; /* holds the parameters decoded from the header */
struct III_sideinfo sideinfo;
unsigned char bsspace[2][MAXFRAMESIZE + 1024]; /* bit stream space used ???? */ /* MAXFRAMESIZE */
real hybrid_block[2][2][SBLIMIT * SSLIMIT];
int hybrid_blc[2];
unsigned long header;
int bsnum;
real synth_buffs[2][2][0x110];
int synth_bo;
int sync_bitstream; /* 1 = bitstream is yet to be synchronized */
int bitindex;
unsigned char *wordpointer;
plotting_data *pinfo;
lame_report_function report_msg;
lame_report_function report_dbg;
lame_report_function report_err;
} MPSTR, *PMPSTR;
數(shù)據(jù)結(jié)構(gòu)關(guān)鍵字段說明:
struct buf *head, *tail
這是一個字符串雙向鏈表
head 是外部請求輸入的buffer
tail 是獲取的之前的buffer,解析的時候從tail開始。解析后會更新pos位置
wordpointer是指向bsspace的指針
decodeMP3_clipchoice中每次計(jì)算出頭的大小,side info的大小,data的大小,都會復(fù)制到這個指針的內(nèi)存里面,使用copy_mp來復(fù)制,復(fù)制的源是tail中的數(shù)據(jù)
消費(fèi)者在commong.c中的一系列的getbits函數(shù),這些函數(shù)會更新bitindex以及wordpointer的指向getbitsgetbits_fastget_leq_8_bitsget_leq_16_bits
bsspace是位流的空間
decodeMP3_clipchoice是核心的入口函數(shù)
關(guān)鍵的流程解析:
addbuf
將輸入的需要解碼的數(shù)據(jù),插入到head的buffer中
本文由網(wǎng)上采集發(fā)布,不代表我們立場,轉(zhuǎn)載聯(lián)系作者并注明出處:http://m.zltfw.cn/shbk/39860.html