注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

东月之神

在单纯的观念里面,生命就容易变得比较深刻!

 
 
 

日志

 
 
关于我

别驻足,梦想要不停追逐,别认输,熬过黑暗才有日出,要记住,成功就在下一步,路很苦,汗水是最美的书!

网易考拉推荐

mp3编码步骤简介  

2011-11-14 17:48:13|  分类: Audio/Video |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Mp3编码过程的几个步骤
Mp3使用了两种压缩技术来缩减音频数据量——其中一种是有损失的,一种是无损的。第一趟压缩先丢弃人耳不能感知的那部分数据,以及那些虽然可以感知,但对音质影响不太大的数据,第二趟压缩用一般的数据压缩算法减少冗余,以达到进一步减小文件大小的目的。事实上第一趟压缩是mp3压缩过程中最麻烦的步骤,主要的算法复杂度都体现在这个阶段。
感知编解码器的复杂度非常高,它们的具体工作方式互不相同,但所有的感知编解码器的基本原理都是一样的。简要地说,MP3编码过程可以被细分为下面几个离散的任务:
       把信号划分为若干片断,每个片断成为一个“帧”。一般来说一帧的长度大概是几分之一秒。分析信号以确定它的能量谱分布。也就是在听力能感觉到的整个频谱范围内,怎样分配音频文件中的bit才能最好地表示被编码的这段声音。因为最好能用同一个算法(只做小的调整)对整个频谱的不同部分进行有效的编码,这一步把信号进一步划分为几个亚带,这些亚带可以被独立地处理以便得到最佳结果。(注意所有亚
带的编码算法都是同一个,只不过它们对比特的分配不同,具体的分配由编码器决定。)考虑到编码比特率,还要计算一个帧所占用的最大比特数。这一步用于确定原始声音数据中,多大比例的数据将被保留,多大比例的数据将被丢弃。编码器储存着人类心理声学的数学模型作为一个参考表,并把声音文件的每一帧的频率分布和参考表进行比较。从比较结果可以确定,哪些频率因为容易被人类感知而在回放时必须被准确渲染,那些频率因为不易被人类感知而可以用较少的比特来描述,甚至直接丢弃。将上述处理完成后的比特流通过一个哈夫曼编码器,压缩冗余信息。哈夫曼编码过程与心理声学模型无关,只是用传统的信息理论减小信息冗余。这一步压缩不会丢弃任何信息,只是用较少的空间保存同样多的信息。经过哈夫曼编码压缩的各帧被装配为一个串行的比特流,每个数据帧前面会有一个帧头。帧的头部包括了指导性的“元数据”,保存了关于该帧的特定信息。在整个编码过程中,还有其他很多因素参与进来,这些因素通常是由编码开始前用户指定的编码器命令行选项决定的。此外,编码算法本身对某一帧进行编码的时候,还可能会依赖于该帧的前面或者后面那些帧的编码结果。整个编码过程中通常某些步骤是可以并行进行的。上面我们描述的这些步骤并不一定按照我们描述的顺序前后串行进行。
各种不同的压缩格式,不论是被用于音频,视频或者是静止图片、随机选择的文件,都既可以做成无损压缩,也可以是有损压缩。区别是明显的:无损压缩经过解压缩之后恢复出来的数据和原数据完全相同,有损压缩则做不到这一点。Zip压缩就是无损压缩。同时有些类型的数据中,部分信息被丢弃是可以忍受的:或者是因为你本来就感觉不到这些数据,或者是因为你希望通过丢弃部分次要信息来减小文件体积。
有损压缩的一个例子是JPEG,jpeg压缩基于这样一个事实:静止图像文件通常都保存了很多不必要的信息,这些信息对显示一张效果可以被人接受的图片来说没有用处。Jpeg编码就是丢弃了一部分非必要信息,并且用数学方法去除了剩余信息中的冗余,这样对那些不需要达到很高分辨率的图片就可以取得很高的压缩比。虽然jpeg编码并不能很精确地和mp3编码过程类比,但是它说明了有损压缩的基本概念。重要的是必须理解,不论一个mp3文件压缩的品质多么高,它也丢弃了原来那个未经压缩的信号中的相当一部分信息。 

MP3包括以下4个部分:

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

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

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

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

一、            帧头结构帧中的头32位是头信息,包括以下部分:Sgncword:同步字位串“111111111111”用掉头信息的前12位。ID:用来显示算法标识的一位,1表示MPEG音频,0保留。Layer:用来表示所使用的层的两位,11表示第一层,10表示第二层,01表示第三层,00保留。如果要改变层,则要求解码器重新复位。Protection_bit:用于表示在音频比特流中是否有冗余来完成查错和隐藏的一位。1为有,0为没有。Bit_rate_index:比特率索引表示比特速率,全零值表示“任意方式”条件。为了提供最小的可能的延迟和复杂度,在第一、二层中解码器没有必要要求支持连续变化的。第三层通过转换bit_rate_index位支持可变比特率。Sampling_frequency:用来表示所使用的层的两位,00表示44.1kHz01表示48kHz10表示32kHz11表示保留。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:可以给出一帧中的主数据部分起始端在比特流中的位置。这个位置等于前一帧的主数据结束位置加上一位;主数据结束位置可以从前一帧的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 对于长窗(窗类型为013),和par2_length = 18 * slen1 + 18 * slen2,对于短窗(窗类型为2对于 switch_point 1part2_length = 17 * slen1 + 18 * slen2(窗类型为2)。对于长窗,part2_length在窗类型为013下的值和在switch_point = 0的值是一样的。big_values[gr]:每一个颗粒的频谱值是用不同的霍夫曼码表编码而成的。从零到奈奎斯特采样频率的整个频段范围可以划分为几个区域:每个区域用不同的霍夫曼码表编码。区域的划分是以最大的量化值作为依据的,这个依据在设想高频的值的幅度比较小或根本就不需要编码这个条件下成立的。从最高频率开始,队成对的量化值为0的值的数目进行记数,所得的数目用rzero表示。然后再将量化值中满足成两对的其绝对值不超过1的个数进行计数,其数目可以用count1表示。那么还有偶数个量化值留下来,最后留下来的值的频带范围会一直下延到零,在这一频段范围内的值就称为big_valuesglobal_gain[gr]:量化阶大小信息是在边带信息中的global_gain变量传送的,并且该值是对数量化的。scale_compress[gr]:依据下表选择用于传送定标因子所需比特数目。如果窗类型为013slen1:用于表示010子带的定标因子的长度;slen2:用于表示1120子带的定标因子的长度。如果窗类型为2并且switch_point0slen1:用于表示05子带的定标因子的长度;slen2:用于表示611子带的定标因子的长度。如果窗类型为2并且switch_point1slen1:用于表示07子带的定标因子的长度(长窗定标因子子带)和从45的定标因子的长度(窗定标因子子带)。slen2:用于表示611子带的定标因子的长度。blocksplit_flag[gr]:用于表示一个数据块使用不止一个正常窗的标志。如果该标志被置为1,那么其他几个变量会按缺省值设置。region_addressl = 8(在窗类型为1或为3region_addressl = 9(在窗类型为2region_addressl = 0,在这种情况下区域2的长度为0如果该标志没有置为1,那么窗类型为0block_type[gr]:表示在第三层一帧中每个颗粒所用的窗的类型。类型0:保留;类型1:起始窗;类型23个短窗;类型3:结束窗。witch_point[gr]:表示长/短转换的分离点。cb_limit:对应长窗的定标因子子带的数目,对于第三层的所有模式和采样频率来说该值为一个常数21cb_limit_short:对应短窗的定标因子子带的数目,对于第三层的所有模式和采样频率来说该值为一个常数12table_select[region][gr]:依据最大量化值和信号本地的数据来采用不同的霍夫曼码表来进行编码,总共有32个霍夫曼码表。subblock_gain[window][gr]:表示源自全局增益的对应一个子窗的增益偏移,该值仅仅用于窗类型为短窗的情况下,在译码器子窗的值必须除以4subblock_gain(window)的幂次加以修正。region_address1[gr]:是一个对频谱的进一步划分来提高霍夫曼编码器的性能,可以说是对由big_values所描述的区域详细划分,以获得一个比较好的错误控制和编码效率。可以划分为3个区域,每个区域根据其最大量化值和本地信号数据使用不同的霍夫曼码表进行编码。region_address[1,2]的值用于指向所划分的区域的边界,区域边界是以将频谱划分成关键子带来排列的。在窗类型为短窗的情况下,代表不同时间片的定标因子子带将分别计数,如果switch_point0,在一个微粒中的定标因子子带的数目为12 × 336;如果窗类型为2并且switch_point1,定标因子子带的数目为8 9 × 3 35region_address1统计一直到第一个区域最高频率边缘的定标因子子带的数目。region_address2[gr]:统计一直到第三个区域最高频率边缘的定标因子子带的局部或全部的数目。在窗类型为短窗的情况下,代表不同时间片的定标因子子带将分别计数。preglag[gr]:这是一个对量化值的额外高频的放大的一个简捷途径,如果该值置1,将有一个表中的值加入到定标因子中去。scalefac_scale[gr]:根据scale_scale使用2或根号2组为量化阶的容量定标因子进行对数量化。scalefac_scale0量化阶为1.414scalefac_scale1量化阶为2count1table_select[gr]:该标志用来选择在前面提到的count1区域所使用霍夫曼码表。scalefac[sb][gr]:定标因子用于对量化噪声染色,如果量化噪声用比较合适的形状进行染色,那么量化噪声就阿可以完全被屏蔽掉。在第三层中,定标因子在解码器中用于获得对应每个数据块的划分因子,跨越好几个频率谱线的这些数据块叫做定标因子子带,并且像关键子带一样尽可能紧的加以选择。haffman_code_bits:对于小于等于15的所有量化值可以用一个霍夫曼码直接编码,一般使用(xy)来表示。如果量化值的幅度超过15ESC码就用来标识这些值。如果一对数据不全为0,那么会有一或两位比特附加到霍夫曼码字上。

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

  评论这张
 
阅读(548)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017