MP3的帧结构

来源:互联网 发布:java鼠标点击事件 编辑:程序博客网 时间:2024/04/29 12:42


原文地址:http://www.eefocus.com/jjbearustc/blog/07-09/3716_3e901.html

MP3帧包括以下4个部分:

1、帧头:比特流中包含同步和状态信息的部分。

2、错误校验:比特流中包含查错信息的部分。

3、音频信息:比特流中包含音频采样点信息的部分。

4、辅助数据:比特流中用于辅助数据的部分。

一、帧头结构帧中的头32位是头信息

Sgncword:同步字位串“1111,1111,1111”用掉头信息的前12位。

ID:用来显示算法标识的一位,1表示MPEG音频,0保留。

Layer:用来表示所使用的层的两位,11表示第一层,10表示第二层,01表示第三层,00保留。如果要改变层,则要求解码器重新复位。

Protection_bit:用于表示在音频比特流中是否有冗余来完成查错和隐藏的一位。1为有,0为没有。

Bit_rate_index:比特率索引表示比特速率,全零值表示“任意方式”条件。为了提供最小的可能的延迟和复杂度,在第一、二层中解码器没有必要要求支持连续变化的。第三层通过转换bit_rate_index位支持可变比特率。

Sampling_frequency:用来表示所使用的层的两位,00表示44.1kHz,01表示48kHz,10表示32kHz,11表示保留。

Padding_bit:如果该位为1,那么在MP3的一帧中就可以含有一个额外的数据片来根据平均比特率来调整采样频率;在其他情况下该位置为0,并且该位在采样率44.1kHz下有效。

Private_bit:该位是专用使用位,该位将来由ISO使用。

Mode:在第三层中,加入立体声模式是增强立体声模式或是混合立体声模式。00表示立体声,01加入立体声模式(增强立体声模式或混合立体声模式),10表示双通道,11表示单通道。

Mode extension表示是采用哪一种加入立体声的编码方法。通过下表可以决定如何使用增强立体声和混合立体声这两种模式。

 

增强立体声

混合立体声

00

不采用

不采用

01

采用

不采用

10

不采用

采用

11

采用

采用

                        

Copyright:如果该位等于0那么在编码数据流中就没有版权限制。如果等于1,那么有版权保护。

Riginal/home:如果该位等于0, 那么编码数据流是拷贝而来的,如果为1,那么编码数据流是原始的未经拷贝的。

Emphasis:表示应当使用的不被强调的类型。

二、错误校验部分crc_check

是一个编码比特流中的用于任意错误检测的16位奇偶校验字。

 三、音频数据部分

allocation[sb]:表示在子带sb中用来表示每个采样点的比特的个数。对单声道的子带或采用加入立体声模式的子带有效。

scalefactor[sb]:表示用来与子带sb中的重量化采样点相乘的子带因子。其由六个比特组成一个无符号整数,作为在子带因子表中用来检索的一个索引。

sample[sb][s]:在子带sb中的第s个采样点的编码表示,用于单声道模式和增强立体声模式中的子带采样点数据的表示。

Main_data_end:主数据结束的值,用于决定一帧中主数据的最后一位在比特流中的位置。主结束值以下一帧的帧头为参考的,以字节为标量的负的偏移来指出最后一位在比特流主数据部分中的位置。

Main_data_beg:可以给出一帧中的主数据部分起始端在比特流中的位置。这个位置等于前一帧的主数据结束位置加上一位[g1] ;主数据结束位置可以从前一帧的main_data_end中得到。

Scfsi[scfsi band]:比例因子选择信息。提供了比例因子的数目的信息,这些比例因子要传送给子带sb及在这一帧中这些比例因子在哪一部分有效。第三层使用变化的scfsi_band给每组定标因子而不是每个定标因子提供scfsi的值。scfsi的值控制了在微粒中定标因子的使用:如果scfsi的值为0,定标因子是分别传送给每一个微粒;如果scfsi的值为1,传送给微粒1的定标因子对微粒2来说也是有效的。

scfsi[scfsi_band][ch]:与scfsi[scfsi_band]作用一样,用于双声道模式、立体声模式和增强立体声模式中一个通道的比例因子选择信息。

part2_3_length[gr]:这个值包含了主数据部分中用于表示定标因子和霍夫曼编码数据的比特的数目。因为边带信息的长度总是相同的,所以这个值可以用于计算出每个微粒主信息的起始端和辅助信息的位置。

part2_length:该值包含了在主数据中用于定标因子的比特的数目。其值以下列方式给出:

对于switch_point= 0,

part2_length = 11 * slen1 + 10 * slen2 对于长窗(窗类型为0,1和3),和par2_length= 18 * slen1 + 18 * slen2,对于短窗(窗类型为2)

对于switch_point = 1,

part2_length = 17 * slen1 + 18 * slen2(窗类型为2)。对于长窗,part2_length在窗类型为0,1和3下的值和在switch_point= 0的值是一样的。

big_values[gr]:每一个颗粒的频谱值是用不同的霍夫曼码表编码而成的。从零到奈奎斯特采样频率的整个频段范围可以划分为几个区域:每个区域用不同的霍夫曼码表编码。区域的划分是以最大的量化值作为依据的,这个依据在设想高频的值的幅度比较小或根本就不需要编码这个条件下成立的。从最高频率开始,队成对的量化值为0的值的数目进行记数,所得的数目用rzero表示。然后再将量化值中满足成两对的其绝对值不超过1的个数进行计数,其数目可以用count1表示。那么还有偶数个量化值留下来,最后留下来的值的频带范围会一直下延到零,在这一频段范围内的值就称为big_values。

global_gain[gr]:量化阶大小信息是在边带信息中的global_gain变量传送的,并且该值是对数量化的。

scale_compress[gr]:依据下表选择用于传送定标因子所需比特数目。如果窗类型为0、1或3:slen1:用于表示0到10子带的定标因子的长度;slen2:用于表示11到20子带的定标因子的长度。如果窗类型为2并且switch_point为0:slen1:用于表示0到5子带的定标因子的长度;slen2:用于表示6到11子带的定标因子的长度。如果窗类型为2并且switch_point为1:slen1:用于表示0到7子带的定标因子的长度(长窗定标因子子带)和从4到5的定标因子的长度(窗定标因子子带)。slen2:用于表示6到11子带的定标因子的长度。

blocksplit_flag[gr]:用于表示一个数据块使用不止一个正常窗的标志。如果该标志被置为1,那么其他几个变量会按缺省值设置。region_addressl = 8(在窗类型为1或为3)region_addressl= 9(在窗类型为2)region_addressl = 0,在这种情况下区域2的长度为0。如果该标志没有置为1,那么窗类型为0。

block_type[gr]:表示在第三层一帧中每个颗粒所用的窗的类型。类型0:保留;类型1:起始窗;类型2:3个短窗;类型3:结束窗。

witch_point[gr]:表示长/短转换的分离点。

cb_limit:对应长窗的定标因子子带的数目,对于第三层的所有模式和采样频率来说该值为一个常数21。

cb_limit_short:对应短窗的定标因子子带的数目,对于第三层的所有模式和采样频率来说该值为一个常数12。

table_select[region][gr]:依据最大量化值和信号本地的数据来采用不同的霍夫曼码表来进行编码,总共有32个霍夫曼码表。

subblock_gain[window][gr]:表示源自全局增益的对应一个子窗的增益偏移,该值仅仅用于窗类型为短窗的情况下,在译码器子窗的值必须除以4的subblock_gain(window)的幂次加以修正。

region_address1[gr]:是一个对频谱的进一步划分来提高霍夫曼编码器的性能,可以说是对由big_values所描述的区域详细划分,以获得一个比较好的错误控制和编码效率。可以划分为3个区域,每个区域根据其最大量化值和本地信号数据使用不同的霍夫曼码表进行编码。region_address[1,2]的值用于指向所划分的区域的边界,区域边界是以将频谱划分成关键子带来排列的。在窗类型为短窗的情况下,代表不同时间片的定标因子子带将分别计数,如果switch_point为0,在一个微粒中的定标因子子带的数目为12 × 3=36;如果窗类型为2并且switch_point为1,定标因子子带的数目为8 + 9 × 3 = 35。region_address1统计一直到第一个区域最高频率边缘的定标因子子带的数目。

region_address2[gr]:统计一直到第三个区域最高频率边缘的定标因子子带的局部或全部的数目。在窗类型为短窗的情况下,代表不同时间片的定标因子子带将分别计数。preglag[gr]:这是一个对量化值的额外高频的放大的一个简捷途径,如果该值置1,将有一个表中的值加入到定标因子中去。

scalefac_scale[gr]:根据scale_scale使用2或根号2组为量化阶的容量定标因子进行对数量化。scalefac_scale为0量化阶为1.414;scalefac_scale为1量化阶为2。count1table_select[gr]:该标志用来选择在前面提到的count1区域所使用霍夫曼码表。

scalefac[sb][gr]:定标因子用于对量化噪声染色,如果量化噪声用比较合适的形状进行染色,那么量化噪声就阿可以完全被屏蔽掉。在第三层中,定标因子在解码器中用于获得对应每个数据块的划分因子,跨越好几个频率谱线的这些数据块叫做定标因子子带,并且像关键子带一样尽可能紧的加以选择。

haffman_code_bits:对于小于等于15的所有量化值可以用一个霍夫曼码直接编码,一般使用(x,y)来表示。如果量化值的幅度超过15,ESC码就用来标识这些值。如果一对数据不全为0,那么会有一或两位比特附加到霍夫曼码字上。

四、辅助数据Ancillary_bit:辅助位由用户定义。


 [g1]为什么?

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我的世界被banip怎么办 dnf深渊宝珠出了怎么办 吞噬魔4个球吃了怎么办 dnf没有支援兵了怎么办 家里没通天然气怎么办 苹果6p16g不够用怎么办 魅蓝手机内存不够用怎么办 3dmax灯光全黑怎么办 高压15o低压1oo怎么办 源码一位乘法中c怎么办 怀孕搬了重东西怎么办 深蹲力量不涨怎么办 ps4连接显示器分辨率低怎么办 大疆失去链接后怎么办 脑袋被锤了几拳怎么办 华为手机变板砖怎么办 电脑网页打开很慢怎么办 网页加载速度太慢.怎么办 cad字显示不出来怎么办 dell笔记本打不开机怎么办 手机系统界面已停止运行怎么办 大石退出菊丸怎么办 word空白页面突然变大了怎么办 高速上车胎爆了怎么办 没有定速巡航跑长途怎么办 惠普笔记本驱动无法安装怎么办 狙击手遇到热追踪导弹怎么办 做完卷腹脖子疼怎么办 医疗设备销售遭遇瓶颈怎么办 给顾客加油加超了怎么办 卡密码输错两次怎么办 擤鼻涕耳朵会响怎么办 鼻子里有血丝是怎么办 怀孕8周上火了怎么办 鼻炎犯了鼻涕流不停怎么办 擤鼻涕眼睛肿了怎么办 感冒咳嗽鼻子不通气怎么办 宝宝感冒不会擤鼻涕怎么办 新生儿鼻腔里有鼻涕怎么办 宝宝鼻腔有鼻涕出不来怎么办 怀孕的人感冒了怎么办