本帖最后由 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 格式音频
|