OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7658|回复: 15

歌词显示思路,上次一直没写出来。

[复制链接]

27

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2011-11-2
在线时间
11 小时
发表于 2012-1-3 16:22:04 | 显示全部楼层 |阅读模式

这个用来读取歌词文件。就是把所有有时间标签的文件地址偏移位储存起来。到时候只要对比时间通过读取文件偏移位置来显示歌词就可以了。
//读取512个字节
//FileInfo:要读取的文件
//buf     :数据缓存区
//返回值 :0,操作失败,1,操作成功
unsigned char F_Readd(FileInfoStruct *FileInfo,u8 *buf)
{
DWORD sector;
unsigned long lopo=0;    
sector=fatClustToSect(FileInfo->F_CurClust);//得到当前簇号对应的扇区号      
if(SD_ReadSingleBlock(sector+FileInfo->F_Offset,buf))return 0;//读数错误
while(*buf!=0)
{
if(*buf=='['&&(*(buf+1)=='0')&&(*(buf+3)==':'))
{
buf++;
buf++;
lopo++;
lopo++;

lrc_yy[lrc__i][0]=(*buf-'0')*60+(*(buf+2)-'0')*10+(*(buf+3)-'0');
lrc_yy[lrc__i][1]=(sector+FileInfo->F_Offset);
lrc_yy[lrc__i][2]=lopo;
lrc__i++;
}
lopo++;  
buf++;
}
FileInfo->F_Offset++;
if(FileInfo->F_Offset==SectorsPerClust) //簇的尽头,换簇
{
FileInfo->F_Offset=0;    
FileInfo->F_CurClust=FAT_NextCluster(FileInfo->F_CurClust);//读取下一个簇号
if((FAT32_Enable==0&&FileInfo->F_CurClust==0xffff) \
||FileInfo->F_CurClust==0x0ffffff8||FileInfo->F_CurClust == 0x0fffffff)return 0;//error    
return 1;//读取成功



下面是对比时间显示歌词
//显示播放时间,比特率 等事信息 
void MP3_Msg_Show(u32 lenth,u16 index,u16 total,u8 yesno,u8 popo)
{
FileInfoStruct tempp; 
static u16 playtime=0;//播放时间标记     
  u16 time=0;// 时间变量
u16 temp=0;
u8 lrc_buf[70];
u16 i=0,ii;
if(!yesno) 
{
if(f_kbps==0xffff)//未更新过
{
playtime=0;
f_kbps=GetHeadInfo();   //获得比特率
}  
time=GetDecodeTime(); //得到解码时间
     
if(time!=playtime)//1s时间到,更新显示数据
{
playtime=time;//更新时间    
temp=GetHeadInfo(); //获得比特率    
if(temp!=f_kbps)
{
f_kbps=temp;//更新KBPS
time=((float)lenth/f_kbps)/125;//更新时间  
}
for(i=0;i<100;i++)//一般歌词都会在100句以内这句话判断这个时间点对应的歌词偏移位置
{
if(time==lrc_yy[0])
lrc__i=i;
}
i=0;
if(time==lrc_yy[lrc__i][0])//时间与播放时间吻合  显示歌词
{
SD_Read_Bytes(lrc_yy[lrc__i][1],lrc_buf,lrc_yy[lrc__i][2],50);//读取歌词偏移位置
lrc__i++;
while(i<51)
{
if(lrc_buf=='\n'||lrc_buf=='\r'){ lrc_buf=0;break;}
if(lrc_buf==']'&&lrc_buf!='[')ii=i+1;
 i++ ;
}
tempp.F_Type=T_BMP;
tempp.F_StartCluster=sys_icoo[0];
if(popo==2)       
AI_LoadPicFile(&tempp,0,40,241,60);
else
LCD_Fill(0,40,240,58,BLACK);
POINT_COLOR=MAGENTA;
Show_Str(0,40,&lrc_buf[ii],16,popo);
POINT_COLOR=YELLOW;
}

 
//显示播放时间
//Read_Temp_Color(60,110,150,130);//先读出之前的颜色值
//Reshow_Temp_Color(60,110,150,130);  
LCD_Show2Num(60,110,time/60,2,16,0);   //分钟
LCD_ShowChar(60+16,110,':',16,0);
LCD_Show2Num(60+24,110,time%60,2,16,0);//秒钟
LCD_ShowChar(60+40,110,'/',16,0);    
//显示总时间
if(f_kbps)time=(lenth/f_kbps)/125;//得到秒钟数   (文件长度(字节)/(1000/8)/比特率=持续秒钟数      
else time=0;//非法位率    
  LCD_Show2Num(60+48,110,time/60,2,16,0);//分钟
LCD_ShowChar(60+64,110,':',16,0);
LCD_Show2Num(60+72,110,time%60,2,16,0);//秒钟    
//显示当前曲目的索引,及总曲目数
  LCD_Show2Num(60+0,130,index,3,16,1);  //索引
LCD_ShowChar(60+24,130,'/',16,1);
  LCD_Show2Num(60+32,130,total,3,16,1); //总曲目  
//显示位率   
  //LCD_ShowNumm(60+60,130,f_kbps,3,16);//显示位率
//LCD_ShowString(60+84,130,"Kbps");   
//LCD_ShowChar(60+84,130,"Kbps",16,1);    
}    
}





MP3歌词.zip

30.64 MB, 下载次数: 2334

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

27

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2011-11-2
在线时间
11 小时
 楼主| 发表于 2012-1-3 22:49:50 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
播放320K时候我如果再刷个小图片 或者干点其他事确实会小卡,  如果就单纯的显示歌词 可以做到不顿。
那时候我就想把歌词放到SRAM发现溢出了所以才想这样的方法。应该还有更好的办法。只是觉得这样比较简单实现。
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-1-3 20:28:43 | 显示全部楼层
回复【楼主位】zenghi:
---------------------------------
思路是可以的.
不过即便做出来,也很有可能出现打盹的现象.就是在更新歌词的时候,音乐会停顿一会.
最好是把歌词都读出来放到sram里面.不过这样要求你sram比较多才行.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 0 反对 1

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-1-4 08:33:38 | 显示全部楼层
回复【3楼】zenghi:
---------------------------------
如果sram不够多,也就只能这样了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2012-1-4 12:38:21 | 显示全部楼层
可以共享flash那4ksram,这4k只是在写flash的时候才用到,大部分时间用不到的,放在那显得浪费了,所以我一般共享flash的4k内存,另外发现,昨晚换了一个8m的w25q64,发现了写入速度比2m的w25q16快10倍。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-1-4 13:38:43 | 显示全部楼层
说明工艺进步了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2012-1-4 15:00:50 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
呵呵,是啊~
昨晚刚换上被吓一跳呢,还以为芯片写不进去,下载一个16字体的字库,包含ui显示,耗时还不到1分钟,以前w25q16最快也得要3分钟。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-1-4 16:13:41 | 显示全部楼层
回复【7楼】Tardis:
---------------------------------
不过全新IC的更新是很快的,第二次就慢了.
你测试一下重新更新试试.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2012-1-5 14:15:38 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
是的,第二次更新慢了一分但还是比16的快,第二次更新慢是有原因的,因为第二次有擦除操作,这里要耗时间呢。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

6

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2012-11-8
在线时间
19 小时
发表于 2013-2-24 17:28:51 | 显示全部楼层
回复【楼主位】zenghi:
---------------------------------
楼主 ,你好   我在搞MP3,想把lrc歌词放到点阵上,希望看一下你的全套程序,这上面的程序拷进去了,有些问题。希望你把你的程序发给我看一下。QQ910876301
回复 支持 反对

使用道具 举报

27

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2011-11-2
在线时间
11 小时
 楼主| 发表于 2013-2-24 22:12:21 | 显示全部楼层
回复【10楼】qq910876301:
---------------------------------
嗯您好,元宵节快乐。这程序有一年了不知道扔哪里了,明天抽空找一下,一定发出来,不过一年前写的代码比较杂乱希望见谅。
回复 支持 反对

使用道具 举报

6

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2012-11-8
在线时间
19 小时
发表于 2013-4-2 14:27:26 | 显示全部楼层
回复【11楼】zenghi:
---------------------------------
战舰上有MP3显示歌词的程序,但是很难看懂,觉得你的好看懂一点,只是你上面的例子我也看了N多天了,弱弱的问你一下  lrc__i  是干什么的?【if(time==lrc_yy[lrc__i][0])//时间与播放时间吻合  显示歌词】是不是歌词歌词的数组。怎么来定义它?我感觉
for(i=0;i<100;i++)//一般歌词都会在100句以内这句话判断这个时间点对应的歌词偏移位置
{
if(time==lrc_yy[0])
lrc__i=i;
}     
lrc__i 中的i是不是也要变,还是lrc__i是一个定值?
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2013-4-2 15:07:54 | 显示全部楼层
TKS,學習了
回复 支持 反对

使用道具 举报

27

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2011-11-2
在线时间
11 小时
 楼主| 发表于 2013-4-4 14:35:52 | 显示全部楼层
回复【12楼】qq910876301:
---------------------------------
呵呵,实在抱歉之前代码比较乱,我自己也稍微想了想。。
 lrc__i  是干什么的?
一句歌词对应lrc__i 的一个值,之前已经把歌词文件的一句一句按照时间顺序排列下来。

【if(time==lrc_yy[lrc__i][0])//时间与播放时间吻合  显示歌词】是不是歌词歌词的数组。怎么来定义它?

lrc_yy[lrc__i][0]=(*buf-'0')*60+(*(buf+2)-'0')*10+(*(buf+3)-'0');//第一个变量是时间
lrc_yy[lrc__i][1]=(sector+FileInfo->F_Offset); //SD偏移
lrc_yy[lrc__i][2]=lopo;//抱歉,这个我也忘记了

for(i=0;i<100;i++)//一般歌词都会在100句以内这句话判断这个时间点对应的歌词偏移位置 

if(time==lrc_yy[0]) 
lrc__i=i; 
}      
lrc__i 中的i是不是也要变,还是lrc__i是一个定值?

这里对之前处理的歌词时间遍历查找,如果时间到了执行下一句歌词。


如果现在再有精力再整理,应该会动态申请内存,以及建立个结构体,不会再是100,而是直到strlen结束。以及许多的小功能函数构成。

2年就匆匆过去了,清明快乐!
回复 支持 反对

使用道具 举报

6

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2012-11-8
在线时间
19 小时
发表于 2013-4-4 20:19:10 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我也是和楼主一样,没有申请内存。弱弱的问一句:用ucos2 一个任务读MP3文件并播放,另外一个任务读歌词文件并显示。这种思路能行不??
回复 支持 反对

使用道具 举报

27

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2011-11-2
在线时间
11 小时
 楼主| 发表于 2013-4-4 22:32:57 | 显示全部楼层
回复【15楼】qq910876301:
---------------------------------
没问题吧!但是打开歌词文件最好先对数据进行处理,以便后面快速读出。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-23 18:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表