1 简介
MAD(libmad)是一个开源的高精度MPEG音频解码库,支持MPEG-1(Layer I, Layer II 和LayerIII-也就是 MP3)。LIBMAD提供24-bit的PCM输出,完全是定点计算,非常适合没有浮点支持的平台上使用。使用libmad 提供的一系列API,就可以非常简单地实现 MP3数据解码工作。在libmad 的源代码文件目录下的 mad.h 文件中,可以看到绝大部分该库的数据结构和API等。
2 libmad中的主要数据结构
struct mad_stream 存放解码前的Bitstream 数据
struct mad_synth 存放解码合成滤波后的PCM数据
struct mad_pcm 定义了音频的采样率,声道个数和PCM 采样数据, 用来初始化音频
struct mad_frame 记录MPEG 帧解码后PCM 数据的数据结构,其中的mad_header 用来记录MPEG 帧的基本信息,比如MPEG 层数、声道模式、流比特率、采样比特率。声道模式包括单声道、双声道、联合立体混音道以及一般立体声
3 解码流程
MP3解码有同步方式和异步方式两种,libmad是以桢为单位对MP3进行解码的,所谓同步方式是指解码函数在解码完一帧后才返回并带回出错信息,异步方式是指解码函数在调用后立即返回,通过消息传递解码状态信息。 mad API的调用顺序:
- 1)mad_decoder_init()【decoder.h】 Minimad.c中给出了一个函数调用过程的实例。首先定义一个mad_decoder变量(解码器对象),这时不需要对解码器对象进行任何