MAD(libmad)是一个开源的高精度MPEG音频解码库。libmad提供24-bit的PCM输出,完全定点计算。使用libmad提供的一系列API可以实现MP3文件的解码。 这里仅介绍这个库的相关使用方法。
1,首先下载libmad的源码包 libmad-0.15.0b.tar.gz并解压
2.在解压出来的目录下编译规则文件Makefile, ./comfigure -prefix /usr/
3.之后会生成Makefile文件,make编译(注意:编译可能会出错,查找原因后,在Makefile文件中去掉-fforce-mem即可)
4.make install
这之后我们就可以使用libmad的API了,但是我们还没有音频输出的驱动,要加载相应的音频播放驱动,执行 modprobe snd-psm-oss,就可以在/dev下看到 dsp或是dsp1了,这就是mp3音频输出的设备节点。
主要结构体(mad.h):
主要数据结构
struct mad_stream
存放解码前的Bitstream数据
struct mad_synth
存放解码合成滤波后的PCM数据
struct mad_pcm
定义了音频的采样率,声道个数和PCM采样数据,用来初始化音频
struct mad_frame
记录MPEG帧解码后PCM数据的数据结构,其中的mad_header用来记录MPEG帧的基本信息,比如MPEG层数、声道模式、流比特率、采样比特率。声道模式包括单声道、双声道、联合立体混音道以及一般立体声。
主要的一些API函数:
void mad_stream_init(struct mad_stream *)
void mad_synth_init(struct mad_synth *);
void mad_frame_init(struct mad_frame *);
以上3个 API 初始化解码需要的数据结构。
void mad_stream_buffer(struct mad_stream , unsigned char const , unsigned long);
此函数把原始的未解码的 MPEG 数据和 mad_stream 数据结构关联,以便使用 mad_frame_decode( ) 来解码 MPEG 帧数据。
int mad_frame_decode(struct mad_frame , struct mad_stream );
把 mad_stream 中的 MPEG 帧数据解码。
void mad_synth_frame(struct mad_synth , struct mad_frame const );
把解码后的音频数据合成 PCM 采样。
void mad_stream_finish(struct mad_stream *);
void mad_frame_finish(struct mad_frame *);
mad_synth_finish(struct mad_synth);
以上 3 个 API 在解码完毕后使用,释放 libmad 占用的资源等。
还有一些其他的API的使用方法和作用可以在头文件 mad.h中查看。(头文件mad.h已经在源码包解压的目录下)但是下面给出的例程已经能完成音频的解码播放,所以只需要了解 libmad的运行机制(回调函数机制),然后在相应的回调函数中稍加改动就可以使用了。
下面将给出一个简单的例程:
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <sys/stat.h>
# include <sys/mman.h>
# include <sys/soundcard.h>
# include <sys/ioctl.h>
# include <sys/fcntl.h>
# include <sys/types.h>
# include "mad.h&