[RISC-V MCU 创新应用比赛] 沁恒 CH32V103 mp3播放器雏形

[复制链接]
 楼主| gtbestom 发表于 2021-8-24 11:51 | 显示全部楼层 |阅读模式
本帖最后由 gtbestom 于 2021-8-24 16:38 编辑

#申请原创#   @21小跑堂
  上回说了 bmp 格式图片解码并显示,这篇换个格式,解码 mp3 文件
  先说效果,流畅解码 320kbps 及以下 mp3 文件,320kbps 以上码率未测试,找不到高码率 mp3 文件
  播放效果感觉比 10 年前的 mp3 随身播放器好很多,当然如果要更高音质,推荐 vs1053 解码芯片


  mp3 格式相对复杂,而且进行了压缩和变换,如果使用软解,无疑耗费资源,效果也有待考证
  想想 64K 的 Flash 空间已经快用完了,默默放弃软解
88645612466cea4094.png

  硬解码 mp3,就需要外接解码芯片,从库存里翻出一片 vs1003 解码模块,杜邦线接上,又凌乱了

   9228612467e27359c.png

  文件系统也有了,打开目录搜索一下文件
  1. res = f_opendir(&dir, path);
  2. if(res == FR_OK)
  3. {
  4.     for(;;)
  5.     {
  6.         res = f_readdir(&dir, &fno);
  7.         if(res != FR_OK || fno.fname[0] == 0) break;
  8.         if(fno.fattrib & AM_DIR)    // 是目录
  9.         {
  10.             ;
  11.         }
  12.         else                        // 是文件
  13.         {
  14.             // 文件处理
  15.         }
  16.     }
  17. }
复制代码
  处理长文件名,通过串口打印,并显示到 LCD 屏
  1.             p = pt;
  2.             pth = *fno.lfname ? fno.lfname : fno.fname;
  3.             while(*pth != 0)
  4.             {
  5.                 ct = ff_convert(*pth, 0);

  6.                 if(ct > 255)
  7.                 {
  8.                     *p = (u8)(ct>>8);
  9.                     p++;
  10.                     *p = (u8)ct;
  11.                     p++;
  12.                 }
  13.                 else
  14.                 {
  15.                     *p = (u8)ct;
  16.                     p++;
  17.                 }
  18.                 pth++;
  19.             }
  20.             *p = 0;

  21.             p = pt;
  22.             printf("%s\r\n", p);
  23.             GUI_Str(p);
  24.             GUI_SetX(20);
  25.             GUI_MoveY(13);
复制代码
  读取 mp3 并发送到 vs1003 进行解码播放
  1.             pth = *fno.lfname ? fno.lfname : fno.fname;     // 文件名
  2.             Str_AsciiToUni("0:/", path1);                   // 文件目录
  3.             Str_UniCat(path1, pth);                         // UNICODE 字符串拼接
  4.             res_sd = f_open(&mp3, path1, FA_READ);          // 打开文件
  5.             while(1)
  6.             {
  7.                res_sd = f_read(&mp3, Buff, 8192, &cout);    // 读取文件
  8.                if(cout==0) break;
  9.                for(i=0; i<cout; i+=32)
  10.                {
  11.                    while(  VS1003_CheckBusy() == 0 );
  12.                    VS1003_WriteData( Buff + i );            // 播放mp3音乐数据
  13.                }
  14.             }
复制代码
2102061246cbb9d91f.png

  到此基本功能就实现了,搜索根目录下的 mp3 文件,读取并发送到 vs1003 解码并播放
  这里是把 mp3 整个文件都发送到 vs1003 解码,包括 ID3v1、v2 标签等文件信息,这里就不再深入,也支持 WMA、WAV、MIDI 格式音频



您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

114

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部