OpenEdv-开源电子网

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

关于Vs1003解码板播放WAV文件的问题

[复制链接]

4

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
452
金钱
452
注册时间
2019-5-31
在线时间
159 小时
发表于 2024-4-23 20:17:36 | 显示全部楼层 |阅读模式
1金钱
这些天在移植MP3播放器(代码来自战舰资料的扩展例程),
用的是AT32F403ARC的芯片;
LCD是SPI串口屏(1.5寸的7789 IPS屏),(SPI2)
FLASH是25Q64(SPI2),两者都接SPI2,仅片选不同。
TFcard接的是SDIO口。
网购的1003解码板.
播放MP3/WMA格式时正常.
发现2个问题:

1:播放WAV时,解码时间不对
2:播放flac 要么无声,要么杂乱的噪声。。

搞了好久,还是不行。。
求大神们伸出友爱之手,拉我一把。。




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

使用道具 举报

4

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
452
金钱
452
注册时间
2019-5-31
在线时间
159 小时
 楼主| 发表于 2024-4-23 20:35:35 | 显示全部楼层
1713875229557.jpg
这个图是1053的信息
1713875534072.jpg
这个图是软件解析的


回复

使用道具 举报

4

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
452
金钱
452
注册时间
2019-5-31
在线时间
159 小时
 楼主| 发表于 2024-4-23 20:50:14 | 显示全部楼层
本帖最后由 zhuls12 于 2024-4-23 21:01 编辑
  1. void mp3_msg_show(u32 lenth)
  2. {        
  3.         static u16 playtime=0;//播放时间标记            
  4.          u16 time=0;// 时间变量
  5.         u16 temp=0;         
  6.         if(f_kbps==0xffff)//未更新过
  7.         {
  8.                 playtime=0;
  9.                 f_kbps=VS_Get_HeadInfo();           //获得比特率
  10.         }                  
  11.         time=VS_Get_DecodeTime(); //得到解码时间
  12.         if(playtime==0)playtime=time;
  13.         else if((time!=playtime)&&(time!=0))//1s时间到,更新显示数据
  14.         {
  15.                 playtime=time;//更新时间                                             
  16.                 temp=VS_Get_HeadInfo(); //获得比特率                                            
  17.                 if(temp!=f_kbps)
  18.                 {
  19.                         f_kbps=temp;//更新KBPS                                               
  20.                 }                        
  21.                 //显示播放时间                        
  22.                 LCD_ShowIntNum(30,150,time/60,2,WHITE,BLUE,16);//分钟
  23.                 LCD_ShowChar(30+16,150,':',WHITE,BLUE,16,0);
  24.                 LCD_ShowIntNum(30+24,150,time%60,2,WHITE,BLUE,16);//秒钟
  25.                 LCD_ShowChar(30+40,150,'/',WHITE,BLUE,16,0);
  26.                
  27.                 //显示总时间
  28.                 if(f_kbps)time=(lenth/f_kbps)/125;//得到秒钟数   (文件长度(字节)/(1000/8)/比特率=持续秒钟数              
  29.                 else time=0;//非法位率         
  30.                 LCD_ShowIntNum(30+48,150,time/60,2,WHITE,BLUE,16);//分钟
  31.                 LCD_ShowChar(30+64,150,':',WHITE,BLUE,16,0);
  32.                 LCD_ShowIntNum(30+72,150,time%60,2,WHITE,BLUE,16);//秒钟
  33.                
  34.                 //显示位率                           
  35.                 LCD_ShowIntNum(30+110,150,f_kbps,3,WHITE,BLUE,16);        //显示位率        
  36.                 LCD_ShowString(30+134,150,"Kbps",WHITE,BLUE,16,0);
  37.         }                    
  38. }                                          
复制代码
这是代码块,是哪里计算出错了吗?
if(f_kbps)time=(lenth/f_kbps)/125;//得到秒钟数   (文件长度(字节)/(1000/8)/比特率=持续秒钟数  

在这里,lenth=0x0277B750,f_kbs=0x00f4
公式貌似不对啊。



回复

使用道具 举报

13

主题

166

帖子

0

精华

高级会员

Rank: 4

积分
791
金钱
791
注册时间
2018-12-19
在线时间
163 小时
发表于 2024-4-24 09:07:53 | 显示全部楼层
你可以自己从wav文件获取RIFF信息,得到解码时间
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2024-4-24 22:58:20 | 显示全部楼层
你这个采样率都显示错了,计算的时间自然是错误的. flac的话,要加载一个patch才可以,而且不是所有的flac都可以,得16位,采样率不要太高的才行
回复

使用道具 举报

4

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
452
金钱
452
注册时间
2019-5-31
在线时间
159 小时
 楼主| 发表于 2024-4-25 07:51:33 | 显示全部楼层
#4、#5: 确实如此,这两天查了一下资料,wav格式时(16bit双通道),HEAD0、HEAD1是固定值,以此值为基准算出来的时间就是错的。
WAV时间错,但不影响播放。
FLAC有加载补丁,奈何就是不出声。。

获取时间:

  1. u16 VS_Get_HeadInfo(void)
  2. {
  3.         unsigned int HEAD0;
  4.         unsigned int HEAD1;  
  5.           HEAD0=VS_RD_Reg(SPI_HDAT0);
  6.     HEAD1=VS_RD_Reg(SPI_HDAT1);
  7.           //printf("(H0,H1):%x,%x\n",HEAD0,HEAD1);
  8.     switch(HEAD1)
  9.     {        
  10.     case 0x7665://WAV格式
  11. //                {
  12. //                 return
  13. //                }
  14.     case 0X4D54://MIDI格式
  15.                 case 0X4154://AAC_ADTS
  16.                 case 0X4144://AAC_ADIF
  17.                 case 0X4D34://AAC_MP4/M4A
  18.                 case 0X4F67://OGG
  19.     case 0X574D://WMA格式
  20.                 case 0X664C://FLAC格式//0000?
  21.         {
  22.                         ////printf("HEAD0:%d\n",HEAD0);
  23.             HEAD1=HEAD0*2/25;//相当于*8/100
  24.             if((HEAD1%10)>5)return HEAD1/10+1;//对小数点第一位四舍五入
  25.             else return HEAD1/10;
  26.         }
  27.         default://MP3格式,仅做了阶层III的表//FFFB
  28.         {
  29.             HEAD1>>=3;
  30.             HEAD1=HEAD1&0x03;
  31.             if(HEAD1==3)HEAD1=1;
  32.             else HEAD1=0;
  33.             return bitrate[HEAD1][HEAD0>>12];
  34.         }
  35.     }  
  36. }
复制代码
FLAC加载补丁,但就是不出声,真有可能是速率配不了,待搞个低速率的试试
  1.         res=f_typetell(pname);                                          //得到文件后缀                                                                                             
  2.                 if(res==0x4c)//如果是flac,加载patch
  3.                 {       
  4.                         VS_Load_Patch((u16*)vs1053b_patch,VS1053B_PATCHLEN);
  5.                 }                                                                                                                         
复制代码
  插入代码,从4096中截取前44个字节做为文件信息分析,但这样写法老报错,不能用,要如何改?
  1. if(res==0x4c)//如果是flac,加载patch
  2.                 {       
  3.                         VS_Load_Patch((u16*)vs1053b_patch,VS1053B_PATCHLEN);
  4.                 }                                                                                                                         
  5.                 res=f_open(fmp3,(const TCHAR*)pname,FA_READ);//打开文件         
  6.                 if(res==0)//打开成功.
  7.                 {
  8.                         VS_SPI_SpeedHigh();        //高速                                                  
  9.                         while(rval==0)
  10.                         {
  11.                                 res=f_read(fmp3,databuf,4096,(UINT*)&br);//读出4096个字节 *****
  12.                                
  13.                                 //在此插入代码,从4096中截取前44个字节做为文件信息分析
  14.                                 //已定义u8 cc[]
  15.         //for(my_cc=0;my_cc<44;my_cc++) myHEAD[my_cc]=databuf[my_cc];//此行不可用
  16.                                 //要如何写?
  17.                                
  18.                                 i=0;
  19.                                 do//主播放循环
  20.                             {         
  21.                                         if(VS_Send_MusicData(databuf+i)==0)//给VS10XX发送音频数据
  22.                                         {
复制代码
初中毕业,难啊。。
晚上回家,再整一下。。



回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 23:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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