2.1.2 解码
MP3文件帧组成,每个帧又由帧头和帧数据组成。帧头长4字节。其数据结构如下:
typedef struct _tagHeader
{
unsigned int sync:12; file://同步信息
unsigned int version:1; file://版本
unsigned int layer:2; file://层
unsigned int error_protection:1; file://CRC校正
unsigned int bit_rate_index:4; file://码率索引
unsigned int sample_rate_index:2; file://采样率索引
unsigned int padding:1; file://空白字
unsigned int extension:1; file://私有标志
unsigned int channel_mode:2; file://立体声模式
unsigned int mode extension:2; file://保留
unsigned int copyright:1; file://版权标志
unsigned int original:1; file://原始媒体
unsigned int emphasis:2; file://强调方式
} HEADER, *LPHEADER;
在帧头后边是通道信息和增益因子(ScaleFactor),数据以比特流的形式送进编码器,当解码器在读到上述信息后,就可以进行解码了。解码比编码容易得多,播放器先进行帧同步,然后读取通道信息和增益因子,再进行Huffman解码,这样就得到解压以后的数据。但这些数据仍然不能进行播放,因为它们还只是一些频段信息,还需要经过特殊手段对他们转换组合,跟时间建立联系(实际上就是频域转时域)。然后进行一系列的逆变换,把音频信号重建出来。
前面说的是软解码,现在来谈谈硬解码,也就是现在很流行的MP3随身听。 它的工作流程一般是这样的:读取存储器上的数据(存储器可能是闪存,硬盘或光盘)→把数据送进解码芯片进行解码→通过数模转换器将解出来的数字信号转换成模拟信号-→再把转换后的模拟音频放大-→低通滤波后到耳机输出口。
也就就是说解码的主要任务交给了解码芯片。MP3的芯片分为单芯片和双芯片,单芯片设计就是把控制部分,MP3解码部分等都集成到一块芯片中;双芯片就是把控制部分和MP3解码部分分开。随着集成电路的发展,厂商都倾向于使用单芯片设计,而提供芯片的厂家就那么几家,所以,不同品牌的MP3播放器中,很大程度上决定回放质量的解码芯片可能是一样。
早期有不少MP3播放器不支持高于224kbps的MP3,这也是芯片惹的祸。VCD里的音频使用的是MP2格式(MPEG-1 Audio Layer2),所以不少MP3厂家为了节省成本,简化VCD的解码芯片用作MP3解码芯片,而VCD规范中音频流量最高是224kbps,问题由此产生。不过现在这中问题基本不存在了。