一、介绍
libmad
是一个高质量的MPEG音频解码器库,它由Robert Leslie
和Underbit Technologies
开发。libmad
最初发布于2000
年,目前最新版本是0.15.1b
,支持所有三个层次的MPEG
音频格式,即Layer I
、Layer II
和Layer III
,并且还支持VBR
(Variable Bit Rate
)和ABR
(Average Bit Rate
)编码方式。
libmad
可以将MPEG
音频流解码成PCM
音频流,以便于后续处理和播放。它采用了一系列高质量的算法来实现MPEG
音频流的解码,包括MDCT
(Modified Discrete Cosine Transform
)、Huffman
解码、积分滤波器等。libmad
提供了简单易用的API
接口,开发者可以轻松地将其集成到自己的应用程序中。
libmad
的代码遵循GNU
通用公共许可证(GPL
),这意味着任何人都可以免费使用和修改它。目前,libmad
的维护和更新工作由开源社区进行。
具体来说,libmad
的主要用途是在各种音频应用程序中对MPEG
音频流进行解码。例如,在音乐播放器中,当用户选择播放MPEG
格式的音频文件时,播放器就需要使用libmad
来将该文件解码成PCM
音频流,以便于后续的音频处理和播放。此外,libmad
还可以用于其他需要解码MPEG
音频流的应用程序,例如音频编辑软件、语音识别系统等。总的来说,libmad
是一个高质量、跨平台、支持多种MPEG
音频格式、简单易用的开源解码器,可以帮助开发者快速地实现MPEG
音频流的解码,并且保证解码后的音频数据质量较高。
二、获取
源代码在官网当中可支持两种方式获取:Ftp或者SourceForge 镜像。
三、构建
- 创建安装目录,解压源码包,并进入目录进行配置
linux@localhost:~$ tar zxvf libmad-x.y.z.tar.gz
linux@localhost:~$ cd libmad-x.y.z
# 6818 如需要制作的是静态库,则需要把参数enable-shared --disable-static改为enable-static --disable-shared
linux@localhost:~/libmad-x.y.z$ ./configure --host=arm-none-linux-gnueabi --enable-fpm=default --enable-sso --enable-accuracy --disable-debugging --disable-dependency-tracking --with-pic --with-gnu-ld --prefix=${HOME}/libmad --enable-shared --disable-static
# 1808
linux@localhost:~/libmad-x.y.z$ ./configure --host=aarch64-linux-gnu --enable-fpm=default --enable-sso --enable-accuracy --disable-debugging --disable-dependency-tracking --with-pic --with-gnu-ld --prefix=${HOME}/libmad enable-shared --disable-static
- 高版本
Gcc
已不支持-fforce-mem
参数,So
,剔除:
linux@localhost:~/libmad-x.y.z$ sed -i "s/-fforce-mem//g" Makefile
- 编译并安装
linux@localhost:~/libmad-x.y.z$ make && make install
四、查看
- 检查安装生成的文件是否是对应平台所需要的
linux@localhost:~/mad2arm$ ls -la
total 0
drwxrwxrwx 1 linux linux 4096 Sep 22 00:06 .
drwxr-xr-x 1 linux linux 4096 Sep 22 00:05 ..
drwxrwxrwx 1 linux linux 4096 Sep 22 00:21 include
drwxrwxrwx 1 linux linux 4096 Sep 22 00:21 lib
linux@localhost:~/mad2arm$ tree
.
├── include
│ └── mad.h
└── lib
├── libmad.a
├── libmad.la
├── libmad.so -> libmad.so.x.y.z
├── libmad.so.x -> libmad.so.x.y.z
└── libmad.so.x.y.z
2 directories, 6 files
linux@localhost:~/mad2arm$ file lib/libmad.so.x.y.z
lib/libmad.so.x.y.z: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, with debug_info, not stripped
确认无误后,即可将对应的库文件上传到开发板的lib
目录中使用,当然也可以配合其他库文件进行相关的移植。
五、处理
-
- 问题:指定新版交叉编译器无法进行识别:
linux@localhost:~/libmad-x.y.z$ ./configure --host=aarch64-linux-gnu --enable-fpm=arm --enable-sso --enable-accuracy --enable-gnu-ld --enable-speed --disable-debugging --prefix=${HOME}/mad2arm
checking host system type... Invalid configuration `aarch64-linux-gnu': machine `aarch64' not recognized
configure: error: /bin/bash ./config.sub aarch64-linux-gnu failed
-
- 解决:原因是使用
--host
指定参数时,而源码包中的config.sub
和config.guess
文件不是最新版本所导致的,拷贝下载新版本的配置基础文件
- 解决:原因是使用
linux@localhost:~/libmad-x.y.z$ wget -O config.guess 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD'
linux@localhost:~/libmad-x.y.z$ wget -O config.sub 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD'
- 错误:编译时提示错误,原因时指定浮点运算方式为
arm
时不适用
linux@localhost:~/libmad-x.y.z$ make
make[2]: *** [Makefile:383: synth.lo] Error 1
- 解决:指定浮点运算为默认
linux@localhost:~/libmad-x.y.z$ ./configure --host=aarch64-linux-gnu --enable-fpm=default --enable-sso --enable-accuracy --enable-gnu-ld --disable-debugging --prefix=${HOME}/mad2arm
六、例程
当使用libmad
解码MPEG
音频数据时,通常需要执行以下步骤:
-
初始化解码器:使用
mad_decoder_init()
函数初始化解码器,并设置回调函数来处理输入、输出和错误。 -
读取输入数据:在循环中使用
fread()
函数从文件中读取MPEG
音频数据,并将其存储到缓冲区中。 -
解码音频数据:使用
mad_decoder_run()
函数解码缓冲区中的MPEG
音频数据。这个函数会返回一个整数值,指示解码器是否成功解码了音频数据。 -
获取
PCM
数据:如果解码器成功解码了音频数据,则可以使用mad_decoder_finish()
函数获取解码后的PCM
数据。这个函数会返回解码后的PCM
帧数,以及PCM
数据的指针。