基于libmad的MP3解码播放器2013-05-27libmad:是一个开源的高精度mpeg音频解码库,支持 MPEG-1(Layer I, Layer II 和 LayerIII(也就是 MP3)。LIBMAD 提供 24-bit 的 PCM 输出,完全是定点计算,非常适合没有浮点支持的平台上使用。使用 libmad 提供的一系列 API,就可以非常简单地实现 MP3 数据解码工作。在 libmad 的源代码文件目录下的 mad.h 文件中,可以看到绝大部分该库的数据结构和 API 等。PCM编码:即为脉冲代码调制编码。PCM通过抽样,量化,编码三个步骤将连续的模拟信号转换成数字编码。libmad中的主要数据结构:
主要数据结构 | 作用 |
struct mad_stream | 存放解码前的Bitstream数据 |
struct mad_synth | 存放解码合成滤波后的PCM数据 |
struct mad_pcm | 定义了音频的采样率,声道个数和PCM采样数据,用来初始化音频 |
struct mad_frame | 记录MPEG帧解码后PCM数据的数据结构,其中的mad_header用来记录MPEG帧的基本信息,比如MPEG层数、声道模式、流比特率、采样比特率。声道模式包括单声道、双声道、联合立体混音道以及一般立体声。 |
MAD通过回调函数机制来实现解码,每个回调函数会返回一个枚举类型mad_flow,通过mad_flow可以控制解码的过程。在未经处理的情况下,MAD一般输出32bit,以little endian格式存放在mad_fixed_t中的数据。但是大多数的声卡并能支持输出高达32bit精度的数据,因而还必须对mad_fixed_t进行量化,圆滑处理以及抖动,使到采样信号降到16bit精度。MAD负责的只是解码的过程,它工作过程是:从外部获取输入,逐帧解码,在解码的过程中返回信息,然后得到解码结果。开发人员要手动设置输入输出。在libmad中提供了一个解码源程序minimad.c,实现了将MP3文件解码成pcm数据,并将其数据显示在终端上。现在就以该源码程序为例,来写出我们自己的基于libmad的MP3播放器。在我们打开我们的音频程序之时同时也打开我们的音频设备"/dev/dsp"。
static int sfd; if((sfd = open("/dev/dsp", O_WRONLY)) < 0){ printf("can not open device!!!/n"); return 1; }