Chinaunix首页 | 论坛 | 博客
  • 博客访问: 329044
  • 博文数量: 79
  • 博客积分: 2466
  • 博客等级: 大尉
  • 技术积分: 880
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-07 16:47
文章分类

全部博文(79)

文章存档

2014年(3)

2012年(7)

2011年(14)

2010年(2)

2009年(2)

2008年(2)

2007年(18)

2006年(31)

分类: LINUX

2007-02-23 12:14:44

The joint stereo effect

不少人曾经有机会在聆听立体声的时候用上一个亚低音扬声器(实际上绝大多数质量较好的计算机扬声器都包括了两个,或者四个,辅助扬声器,以及一个独立的亚 低音扬声器)。也许你已经注意到了,主扬声器以外的辅助扬声器对产生高质量的声音是很重要的;但是亚低音扬声器就不怎么受重视——亚低音扬声器经常被塞在 桌子底下,沙发后头,甚至是和起居室的家具集成在一起了。这样做对声音质量的影响很小,因为人耳朵对于高频低频声音很不敏感。

一个立体声mp3声音文件的大小,理论上,应该是同比特率的一个单声道mp3文件的两倍。但是如果考虑到,我们可以把左右两个声道的高频部分进行一定的合 并,放到其中某一个声道的数据中,那样我们就可以让文件变得小一些。在编码的时候,很多编码器都支持的”joint stereo”就是这个意思。反正我们也听不出高频声音到底是哪个喇叭发出来的,那就没必要把这些数据分别在两个声道的数据中重复保存。

有些高级音响发烧友会说,低频声音并不是完全没有方向感的,只不过和中频高频声音相比,低频声音的方向感没有那么强。要听出这种效果,那么这个人的耳朵一 定受到过相当程度的训练,对这样一个耳朵来说,恐怕已经不会满足于mp3的音质了。当joint stereo选项被打开的时候,声音文件中会被加入一些信息,用于引导播放器在播放过程中尽量地模拟这些声音的空间效果。并且注意,joint stereo编码模式在某些情况下会带来一些声音被挤压的效果,单纯增高压缩使用的比特率并不能解决这个问题,如果你觉得这些副作用让你不满意,只有关闭 joint stereo选项之后重新压缩。


MP3文件的结构

Inside the Header Frame

前面提到过,mp3文件被分割为很多很多的“帧”,每一个帧包含的声音数据能够播放很短很短的时间,大概是一秒的几分之一。每一个数据帧前面都有一个“帧头帧”,帧头保存了32个比特的“元数据”,描述的是紧随其后的数据帧的一些信息。帧头的格式是
AAAA AAAA AAAB BCCD EEEE FFGH IIJJ KLMM,其中包含了下面13个域:
AAAA: Frame sync
B: MPEG audio version
C: MPEG Layer
D: protection bit. if on, checksum follows header
E: Bitrate index
F: Sampling rate frequency index
G: padding bit, on or off, compensates for unfilled frames
H: private bit, on or off, allows for application-specific triggers
I: Channel Mode: stereo, joint stereo, dual channel, single channel
J: Mode extension: used only with joint stereo, to conjoin channel data
K: copyright: on or off
L: original: off if copy of original, on if original.
M: Emphasis: respects emphasis bit in the original recording; now obsolete.

Mp3帧头帧开始处是一个11bit的“同步”块。Mp3播放器可以通过搜寻第一个同步块,锁定到第一个有效数据帧上,以便开始播放。在你拖动播放器的进 度滑块,向前或者向后跳跃的时候,以及播放时跳过文件头部的ID3数据等非音频数据的时候,同步块都会起作用。当然,mp3播放器不能随便拿来一个文件, 只要在其中找到一个合法的同步块就认为这个文件是一个合法的mp3文件。因为从理论上讲,同步块这11bit的模式可能出现在任何随机的二进制文件中。因 此播放器还必须检查帧头中的其它数据是否合法,和/或检测前后是否出现了多个合法的mp3帧。

    Locking onto the Data Stream
如何锁定mp3数据流

Mp3的一个设计初衷是让它适合于广播。因此任何mp3数据流的任何接受方,必须能够以一个mp3数据流中的任何一点为起点,有效地锁定到这个数据流上。 我们之所以在每个数据帧前面都需要一个帧头,很大程度上是因为这个原因。有趣的是,理论上说,这个设计使得我们可以有效地将一个mpeg文件分割为任意的 若干段,然后随便地、独立地播放其中任何一段。但是实际上,对layer III的mpeg文件(就是mp3)来说,这是做不到的,因为mp3文件中一个数据帧的数据,常常对同一文件中的其它数据帧的数据有依赖关系:还记得我们 说过,mp3编码器在某一帧的空间不够用的时候,会拆东墙补西墙吧?

紧跟在同步块之后的是一个叫做ID的bit,这个bit说明文件压缩的标准是mpeg-1还是mpeg-2。之后是两个bit的“layer”参数,决定 该帧的编码方式是layer I, layer II, layer III还是“未定义”。如果protection bit是1,声音数据前面会被塞入一个16bit的校验和,保证数据完整性。

Bitrate不用说了,之后是抽样频率,从16KHZ到44100HZ,这依赖于我们使用的是mpeg-1还是mpeg-2。Padding bit用于保证每个frame都精确地满足指定的比特率,例如一个128kbps layer II,抽样频率44.1KHZ的比特流中,有的帧可能有417字节,有的则可能有418字节。那些417字节的帧的padding bit会被设置为1,以便补偿帧长度的不同。

Mode指的是该帧是单声道还是立体声,如果使用joint stereo,紧跟在后面的mode extension会告诉解码器一些附加的细节,例如不同声道的高频分量是不是被合并了。

Copyright bit并不是用来保存版权信息的(只有一个bit,显然不够),这个bit用来模拟CD和DAT文件中一个类似的关于版权的bit的。如果这个bit是 1,那么拷贝这个音轨就是违法的。如果数据是被保存在其原始媒介上,home bit就是1。Private bit用于某些特定的应用程序中来触发一些特定的事件。Emphasis域被用作一个标志,当原始录音中一个对应的“emphasis bit”被设置的时候,mp3文件中的这个标志也被设置为1,这个标志现在已经很少被使用了。最后,解码器会在帧头部后面读到校验和(如果帧头部中的 protection bit是1),校验和之后就是真正的数据帧了。

上述过程会对一个mp3文件中成千上万的帧反复重复。如果需要知道mp3帧头的细节,以及帧头中的上述各个域中的合法取值及其意义,包括各种查找表等详细信息,请参考。如果需要马上开始做些实际工作,可以看看的内容。
阅读(1893) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~