关于libmad开源mp3音频解码库的使用

本文介绍了libmad开源库的使用方法,包括下载、编译和安装步骤,以及主要的结构体和API函数。通过解码、合成和播放过程,展示了如何利用libmad进行MP3文件的解码。回调函数机制和mad_flow枚举类型在控制解码流程中的作用也得到了阐述。
摘要由CSDN通过智能技术生成

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&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值