简介
Minimp3 是一个轻量级的 MP3 解码库,用于解码 MP3 音频文件,主要以简单、快速、占用内存少为特点。它是用纯 C 语言编写的,旨在嵌入式系统和资源有限的设备中使用。Minimp3 的设计目标是尽可能减少代码体积和运行时内存消耗,同时保持对 MP3 格式的高效解码。
Minimp3 的特点:
1、小巧轻量:源代码体积极小,仅几百行代码,适合在资源受限的环境中使用。
2、跨平台:可以在多种平台(包括嵌入式系统、移动设备、桌面应用等)上运行。
3、无需依赖库:不依赖于其他外部库,独立运行。
高效:具有高效的解码性能,能在低功耗设备上快速解码 MP3 文件。
4、支持多种采样率和比特率:支持各种标准的 MP3 比特率(如 VBR、CBR)和采样率。
5、开源:Minimp3 是开源的,可以自由使用和修改。
使用方法:
1.使用 Minimp3 解码 MP3 文件通常需要进行以下步骤:
2.初始化解码器。
3.读取 MP3 数据流。
4.解码音频帧。
5.获取解码后的 PCM 音频数据,用于进一步处理或播放。
minimp3使用示例
示例1
#include "minimp3.h"
#include "minimp3_ex.h"
mp3dec_t mp3d;
mp3dec_file_info_t info;
if (mp3dec_load(&mp3d, "yourfile.mp3", &info, NULL, NULL)) {
printf("Error loading MP3 file.\n");
return -1;
}
// PCM 数据已经解码,存储在 info.buffer 中,可以进行播放或保存。
示例2
#include "minimp3.h"
#include "ff.h" // FatFs 文件系统库
#include <stdint.h>
mp3dec_t mp3d; // MP3 解码器结构体
mp3dec_frame_info_t info; // MP3 帧信息
short pcm[MINIMP3_MAX_SAMPLES_PER_FRAME]; // 用于存储解码后的 PCM 数据
// 解码 MP3 文件函数,使用 FatFs
void decode_mp3(const char *filename) {
FRESULT fr; // 文件操作结果
FIL file; // FatFs 文件对象
UINT bytes_read; // 实际读取的字节数
BYTE buffer[4096]; // MP3 数据缓冲区
UINT bytes_left = 0; // 缓冲区内未处理的数据量
const BYTE *data; // 指向当前解码位置
// 打开 MP3 文件
fr = f_open(&file, filename, FA_READ);
if (fr != FR_OK) {
printf("无法打开文件: %s\n", filename);
return;
}
// 初始化 MP3 解码器
mp3dec_init(&mp3d);
// 读取和解码 MP3 文件
do {
// 读取文件到缓冲区
fr = f_read(&file, buffer + bytes_left, sizeof(buffer) - bytes_left, &bytes_read);
bytes_read += bytes_left; // 加上未处理的数据
data = buffer; // 指向缓冲区开头
while (bytes_read > 0) {
// 解码 MP3 帧
int samples = mp3dec_decode_frame(&mp3d, data, bytes_read, pcm, &info);
if (info.frame_bytes == 0) {
break; // 文件尾部或帧错误
}
// 移动数据指针
data += info.frame_bytes;
bytes_read -= info.frame_bytes;
if (samples > 0) {
// PCM 数据已解码并存储在 pcm 数组中,可以进一步处理或播放
}
}
// 把未处理的数据移到缓冲区开头(如果有剩余)
bytes_left = bytes_read;
if (bytes_left > 0) {
memmove(buffer, data, bytes_left);
}
} while (fr == FR_OK && bytes_read > 0);
// 关闭文件
f_close(&file);
}
int main() {
// 初始化 FatFs 和其他硬件部分(如 SD 卡)
// ...
// 调用解码函数,传入 MP3 文件路径
decode_mp3("example.mp3");
// 其他任务或进入低功耗模式
// ...
return 0;
}
代码说明
FatFs 文件系统:通过 f_open 打开 MP3 文件,f_read 读取 MP3 数据,并使用 f_close 关闭文件。
Minimp3 解码:每次从 FatFs 读取的数据块都会通过 mp3dec_decode_frame 解码,生成 PCM 音频数据。解码后的 PCM 数据存储在 pcm 数组中,可以用于播放或进一步处理。
流式解码:因为 MP3 文件比较大,通常无法一次性加载到内存中。因此,代码采用了流式解码方式,每次读取一块数据并逐帧解码。
总结
通过结合 Minimp3 和 FatFs,您可以在嵌入式设备上实现轻量、高效的 MP3 解码。FatFs 提供了对存储设备的文件访问功能,而 Minimp3 则负责将 MP3 文件解码为 PCM 数据,便于后续的音频处理或播放。这种方案非常适合资源受限的嵌入式项目,尤其是在使用 SD 卡存储音频的场景中。
minimp3开源库
https://github.com/lieff/minimp3