音视频技术学习
直播中

刘恩彤

7年用户 201经验值
私信 关注
[问答]

VS1053播放出现杂音怎么改进

原子哥,是这样子的。我仿照你们的音乐播放器例程写了个程序,但是我是把音乐文件下载到W25Q128里面,然后没有用FATS,而是直接从W25Q128里面读取音乐文件发送到VS1053的。音乐可以播放,但是就是播放MP3时中间会不间断常出现GUGU或JIOJIO的声音,每次出现的地方和声音都一样,不是随机的。播放WAV就更惨了,好多收音机收不到台那种沙沙的背景声音。这个跟VS1053的设置有没有关系呀,还是说程序上需要有什么改进的呀?下面是我播放音乐的代码,原子哥根据经验帮我分析下可能是什么原因呀?
int audio_play(uint8_t num)
{
        uint8_t         *databuf;
        uint8_t         temp,i;
        uint32_t         datacount,datasize;
        
        //分配一个缓冲区
        databuf=(uint8_t*)malloc(4096*sizeof(uint8_t));
        if(databuf==NULL) return -1;
        
        //检测指定文件是否存在(一个文件占用1M空间)
        W25QXX_Read(&temp,SOUNDSTART+num*16*0x10000,1);
        if(temp!=0xaa) return -2;
        //读出文件大小信息(4个字节的空间保存文件大小)
        datasize=0;
        for(i=0;i<4;i++)
        {
                W25QXX_Read(&temp,SOUNDSTART+num*16*0x10000+i+1,1);
                datasize<<=8;
                datasize|=temp;
        }
        
        //进行复位
        VS_HD_Reset();
        VS_Soft_Reset();
        //重启播放
        VS_Restart_Play();
        
        //设置音量等信息
        VS_Set_All();
        //复位解码时间
        VS_Reset_Decodetime();
        //设置VS1053高速发送数据
        VS_SPI_SpeedHigh();
        //关闭功放
        VS_SPK_Set(0);
        
        //将文件按照4096字节大小复制到缓冲区中
        datacount=0;
        while(1)
        {
                //如果剩余文件超过4096字节,则复制4096字节的音频数据出来
                if((datasize-datacount)>=4096)
                {
                        memset(databuf,0,4096);
                        W25QXX_Read(databuf,SOUNDSTART+num*16*0x10000+5+datacount,4096);
                        datacount+=4096;
                        //播放音频数据流
                        for(i=0;i<128;i++)//播放4096字节的音频数据
                        {                        
                                VS_Send_MusicData(databuf+i*32);
                        }
                        continue;
                }
                else
                {
                        memset(databuf,0,4096);
                        W25QXX_Read(databuf,SOUNDSTART+num*16*0x10000+5+datacount,datasize-datacount);
                        //发送最后一包音频文件
                        temp=(datasize-datacount)/32+1;
                        datacount=datasize;
                        for(i=0;i                         break;
                }
        }
        //释放内存空间
        free(databuf);
        databuf=NULL;
        
        return 0;
}

回帖(5)

张喆

2019-3-6 10:21:29
也有可能你写入W25Q的数据就已经错了
举报

李芳

2019-3-6 10:36:54
VS_Send_MusicData的发送,要等待DREQ才能发哦
举报

施敏

2019-3-6 10:45:38
VS_Send_MusicData函数用的是你们的例程,里面有等待DREQ。会不会是读W25Q128的时候数据断流,但是每次都是同样的地方,感觉好奇怪,像是文件本身的问题,电脑上播放又没有问题。
举报

李龙

2019-3-6 11:01:12
我是用XMODEM协议将文件写入W25Q128的,用同样的方式下载过字库也没有问题。都是同样的发送音频文件数据给1053,怎么WAV完全没法播放,全是一片嚓嚓的噪声,MP3虽然中间会有点间断,但是播放完全没有问题呢。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分