MPEG标准制定方法 mpeg编码标准( 二 )


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)0044100220501102501480002400012000103200016000800011reservedreservedreservedPadding-bit如果设置了,则用一个slot填充数据(slot对框架大小的计算很重要) Layer I的slot大小是4字节,其余情况是1字节 。
设置值描述0没有填充1使用一个额外的slot填充数据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 31Layer III:
Intensity stereoMS stereooffoffonoffoffonononEmphasis设置值描述00none0150/15 ms10reserved11CCIT J.17MP3边信息边信息紧接着帧头 。它包含了一些解码器会用到的一些信息,用于解码器控制音频流的播放,但不包含实际的音频数据 。下表显示了所有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;数据结构关键字段说明:


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: