1. 河豚號 > 生活百科 >

mpeg編碼標(biāo)準(zhǔn)(MPEG標(biāo)準(zhǔn)制定方法)

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

聯(lián)系我們

在線咨詢:點(diǎn)擊這里給我發(fā)消息

微信號:15705946153

工作日:9:30-18:30,節(jié)假日休息