本帖最后由 gtbestom 于 2021-8-24 16:38 编辑
#申请原创# @21小跑堂
上回说了 bmp 格式图片解码并显示,这篇换个格式,解码 mp3 文件
先说效果,流畅解码 320kbps 及以下 mp3 文件,320kbps 以上码率未测试,找不到高码率 mp3 文件
播放效果感觉比 10 年前的 mp3 随身播放器好很多,当然如果要更高音质,推荐 vs1053 解码芯片
mp3 格式相对复杂,而且进行了压缩和变换,如果使用软解,无疑耗费资源,效果也有待考证
想想 64K 的 Flash 空间已经快用完了,默默放弃软解
硬解码 mp3,就需要外接解码芯片,从库存里翻出一片 vs1003 解码模块,杜邦线接上,又凌乱了
文件系统也有了,打开目录搜索一下文件
res = f_opendir(&dir, path);
if(res == FR_OK)
{
for(;;)
{
res = f_readdir(&dir, &fno);
if(res != FR_OK || fno.fname[0] == 0) break;
if(fno.fattrib & AM_DIR) // 是目录
{
;
}
else // 是文件
{
// 文件处理
}
}
}
处理长文件名,通过串口打印,并显示到 LCD 屏
p = pt;
pth = *fno.lfname ? fno.lfname : fno.fname;
while(*pth != 0)
{
ct = ff_convert(*pth, 0);
if(ct > 255)
{
*p = (u8)(ct>>8);
p++;
*p = (u8)ct;
p++;
}
else
{
*p = (u8)ct;
p++;
}
pth++;
}
*p = 0;
p = pt;
printf("%s\r\n", p);
GUI_Str(p);
GUI_SetX(20);
GUI_MoveY(13);
读取 mp3 并发送到 vs1003 进行解码播放
pth = *fno.lfname ? fno.lfname : fno.fname; // 文件名
Str_AsciiToUni("0:/", path1); // 文件目录
Str_UniCat(path1, pth); // UNICODE 字符串拼接
res_sd = f_open(&mp3, path1, FA_READ); // 打开文件
while(1)
{
res_sd = f_read(&mp3, Buff, 8192, &cout); // 读取文件
if(cout==0) break;
for(i=0; i<cout; i+=32)
{
while( VS1003_CheckBusy() == 0 );
VS1003_WriteData( Buff + i ); // 播放mp3音乐数据
}
}
到此基本功能就实现了,搜索根目录下的 mp3 文件,读取并发送到 vs1003 解码并播放
这里是把 mp3 整个文件都发送到 vs1003 解码,包括 ID3v1、v2 标签等文件信息,这里就不再深入,也支持 WMA、WAV、MIDI 格式音频
|