mpeg編碼標準包括什么 mpeg編碼標準包括mpeg視頻什么視頻音頻同步三大部分



文章插圖
mpeg編碼標準包括什么 mpeg編碼標準包括mpeg視頻什么視頻音頻同步三大部分

文章插圖
mp3 編碼
在MPEG文件中,沒有主標頭,因為MPEG的音頻文件是由一系列被稱為幀的較小部分組成的 。每個幀都是一個具有自己標頭和音頻信息的數據塊 。
Layer II,II,III的音頻幀頭都是相同的,不同之處體現在音頻數據的編碼方式 。幀本身是由slot組成的 。Layer I的slot大小是4字節,其余情況是1字節 。
除了Layer之外,MPEG音頻本身也有3個版本,這個幾個版本的不同之處體現在能處理的采樣率不同(參考 表2.1.2) 。MPEG 1 (ISO/IEC 13818-3) 和MPEG2(ISO/IEC 11172-3)是ISO標準. MPEG2.5對MPEG2進行的非官方的擴展,它是為了支持更低的采樣率 。MPEG2/2.5 也常被簡稱為LSF(Low SamplingFrequencies),既低采樣率
對于Layer I和Layer II,幀是完全彼此獨立的,因此您可以剪切MEPG音頻文件的任何部分并正確的播放 。然后,播放器將從發現的第一個完整有效的幀開始播放 。但是,Layer III,幀不總是獨立的,因為它可能使用了byte resevoir,這是一種內部緩沖區,因此幀之間通常是相互依賴的 。在最壞的情況下,可能至少需要輸入9個幀才能解碼單個幀 。
如果你需要檢索有關MPEG的音頻文件的信息,那么可以簡單的找到第一幀,然后從它的header中獲取信息 。除比特率外,其他幀中的信息應該與第一個幀是一致的,因為可能當前是VBR的文件 。在VBR的文件中,可以在每個幀中更改比特率 。例如,為了在整個文件中保持音樂的高質量,當音樂比較復雜時就需要更多的位來做編碼
幀頭本身的長度是32位的(4字節) 。幀頭的前十二位(在MPEG2.5擴展的情況下為前十一位)始終設置為1,稱為幀同步 。幀還可能有可選的CRC校驗和 。它長16位,如果存在,則緊跟在幀頭之后 。CRC之后就是音頻數據 。通過重新計算CRC并將值與文件中的值進行比較,就可以檢查比特流在傳輸期間是否已經被更改 。
一個文件可以被編碼成恒定比特率(CBR)或可變比特率(VBR),這意味著每幀可以有不同的比特率 ??勺儽忍芈实馁|量往往比恒定比特率編碼的文件更高,因為他們可以在需要的地方使用更高的比特率 。
MP3文件的整體結構:
[ID3 V2] | [APE 頭]: 可選ID3 V2的頭,大多數最新的MP3,都有這個頭用于APE格式的頭,現在也用于MPEG第一幀MPEG 音頻頭, 通常大小為4字節.(當Protection bit==0時,幀頭后會有16bit=2byte的CRC,此時幀頭大小為6字節)邊信息,9/17/32 字節[Xing 頭]: 可選 8-120字節,如果是VBR,多數都有此Xing頭,而且只有第一幀有音頻數據第二幀幀頭邊信息音頻數據第三幀幀頭邊信息音頻數據最后一幀幀頭邊信息音頻數據[TAG]: 可選 。128字節的ID3 V1信息,如果沒有前面的ID3 V2,多數都有這個ID3 V1的頭mp3幀頭編碼
起始位置0位高位開始
起始位置大小位置描述01131-21幀同步標識,11個‘1’ 。用于定位幀頭起始位置11220-19MPEG音頻版本13218-17Layer序列號15116Protection bit16415,12比特率20211-10采樣率2219Padding bit的定義2318保護位2427-6channel模式2625-4只用于Joint stereo 模式擴展2813版權位 0:無版權 1:有版權2912原始位 0:原始媒體的副本 1:原始媒體3021-0Emphasis
MPEG音頻版本
設置值描述00MPEG version2.501保留10MPEG version211MPEG version1
Layer序列號
設置值描述00保留01Layer III10Layer II11Layer I
Protection-bit
設置值描述0protected by 16 bit CRC following header1no CRC
比特率
bitsV1,L1V1,L2V1,L3V2,L1V2, L2 & L30000freefreefreefreefree000132323232800106448404816001196564856240100128645664320101160806480400110192968096480111224112961125610002561281121286410012881601281448010103201921601609610113522241921761121100384256224192128110141632025622414411104483843202561601111badbadbadbadbad
NOTES: All values are in kbps
V1: MPEG Version 1V2: MPEG Version 2 and Version 2.5L1: Layer IL2: Layer IIL3: Layer III“free”:: free fromat. free bitrate必須保持恒定,并且必須小于允許的最大的比特率. 解碼器不需要支持free bitrate的流“bad”: 意思是這個值是不被允許的.
MPEG文件可能具有可變的比特率(VBR) 。每一個幀可以用不同的比特率來創建 。這是可以在所有的layer中使用 。Layer III必須這個方式,Layer I 和 Layer II 解碼器可以選擇支持 針對Layer II,不允許使用比特率和模式的一些組合 。下面是一些允許的組合
bitrate單通道立體聲intensity stereodual channefreeyesyesyesyes32yesnonono48yesnonono56yesnonono64yesyesyesyes80yesnonono96yesyesyesyes112yesyesyesyes128yesyesyesyes160yesyesyesyes192yesyesyesyes224noyesyesyes256noyesyesyes320noyesyesyes384noyesyesyes
采樣率
抽樣速率指定每秒鐘有多少個樣本被記錄 。每個MPEG版本可以處理不同的samplingrates 。
采樣率索引MPEG-1 (Hz)MPEG-2 (Hz)MPEG-2.5 (Hz)0044100220501102501480002400012000103200016000800011reservedreservedreserved
Padding-bit
如果設置了,則用一個slot填充數據(slot對框架大小的計算很重要) Layer I的slot大小是4字節,其余情況是1字節 。
設置值描述0沒有填充1使用一個額外的slot填充數據
【mpeg編碼標準包括什么 mpeg編碼標準包括mpeg視頻什么視頻音頻同步三大部分】channel模式
設置值描述00立體聲01Joint stereo10Dual channel(2 mono channels)11Single channel(mono)
注意:雙通道文件由兩個獨立的單聲道組成 。每一個都只使用了文件的一半比特率 。大多數解碼器將其輸出為立體聲,但情況并非總是如此 。使用一個例子是在相同的比特流中承載了兩個不同語言的語音,那么解碼器需要僅解碼所選擇的語言進行播放
模式擴展
擴展模式被用來增加了一些沒有在立體聲效果使用的信息,從而減少了所需的位 。這些位由在Joint stereo模式下的編碼器動態的確定,每一個幀的Joint stereo都可以改變,甚至可以打開或者關閉
MPEG文件的整個的頻率范圍分為了多個子帶,共有32個子帶 。對于Layer I和Layer II來說兩個位確定了當應用intensity stereo時的頻率范圍(頻帶) 。針對Layer III,這兩個位決定了使用哪一種類型的joint stereo(intensity stereo或者m/s stereo). 頻率范圍由解壓縮算法來確定
設置值Layer I & II00bands 4 to 3101bands 8 to 3110bands 12 to 3111bands 16 to 31
Layer III:
Intensity stereoMS stereooffoffonoffoffononon
Emphasis
設置值描述00none0150/15 ms10reserved11CCIT J.17
MP3邊信息
邊信息緊接著幀頭 。它包含了一些解碼器會用到的一些信息,用于解碼器控制音頻流的播放,但不包含實際的音頻數據 。下表顯示了所有Layer III文件的邊信息的大小
模式MPEG 1MPEG 2/2.5 (LSF)立體聲,聯合立體聲,雙通道3217Mono179
對于Layer I的文件,你必須考慮到擴展模式(見表2.1.6) 。然后你可以以下公式計算出用于計算CRC的比特位的數量:
4 * ( 聲道數 * bound of intensity stereo + (32 – bound of intensity stereo) );
這可以被讀成兩倍的立體聲子帶加上單子帶的數量和結果乘以4 。對于簡單的mono幀,這等于128,因為通道的數目是1,而強度立體聲的邊界是32,這意味著沒有強度立體聲 。對于立體幀,這是256 。有關更多信息,請查看類CMPAFrame中的rc代碼 。
MP3解析的解析
基于MPG123庫
核心數據結構
typedef struct mpstr_tag {struct buf *head, *tail; /* buffer linked list pointers, tail points to oldest buffer */intvbr_header;/* 1 if valid Xing vbr header detected */intnum_frames;/* set if vbr header present */intenc_delay;/* set if vbr header present */intenc_padding;/* set if vbr header present *//* header_parsed, side_parsed and data_parsed must be all set 1before the full frame has been parsed */intheader_parsed;/* 1 = header of current frame has been parsed */intside_parsed;/* 1 = header of sideinfo of current frame has been parsed */intdata_parsed;intfree_format;/* 1 = free format frame */intold_free_format; /* 1 = last frame was free format */intbsize;intframesize;intssize;/* number of bytes used for side information, including 2 bytes for CRC-16 if present */intdsize;intfsizeold;/* size of previous frame, -1 for first */intfsizeold_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 */realhybrid_block[2][2][SBLIMIT * SSLIMIT];inthybrid_blc[2];unsigned long header;intbsnum;realsynth_buffs[2][2][0x110];intsynth_bo;intsync_bitstream;/* 1 = bitstream is yet to be synchronized */intbitindex;unsigned char *wordpointer;plotting_data *pinfo;lame_report_function report_msg;lame_report_function report_dbg;lame_report_function report_err;} MPSTR, *PMPSTR;數據結構關鍵字段說明:
struct buf *head, *tail這是一個字符串雙向鏈表head 是外部請求輸入的buffertail 是獲取的之前的buffer,解析的時候從tail開始 。解析后會更新pos位置wordpointer是指向bsspace的指針decodeMP3_clipchoice中每次計算出頭的大小,side info的大小,data的大小,都會復制到這個指針的內存里面,使用copy_mp來復制,復制的源是tail中的數據消費者在commong.c中的一系列的getbits函數,這些函數會更新bitindex以及wordpointer的指向getbitsgetbits_fastget_leq_8_bitsget_leq_16_bitsbsspace是位流的空間
decodeMP3_clipchoice是核心的入口函數
關鍵的流程解析:
addbuf將輸入的需要解碼的數據,插入到head的buffer中