最近在搞"有屏幕的地方就有badapple", Badapple驱动起来没什么问题,整体的思路就是SD(硬件SPI)+Fatfs+OLED(模拟SPI)。。。。
在OLED屏幕播放badapple的过程其实就是在给OLED不断的刷图。。
给OLED刷图的方法其实就是刷bin文件。我用Img2LCD这个软件,把BMP图像转化为二进制文件。
这个软件是很好用,每一帧的画面是128*64,一共是128*64=8192个位(像素点)=1024字节,每一帧就是一个画面,一个画面就是一个bin文件,这个软件转换出来的。
OK,问题来了,假如我播放的视频,一共有1万帧,那么岂不是有1万个bin文件,Oh my god...
我参考了别人的做法,是把这些bin文件合拼成一个大的bin文件,然后通过读,读完之后文件指针向后移动1024个字节,直到bin文件播放完毕。
好阿,那么我怎么才能把这1万个文件合并呢。有一个工具叫做Ubin...但是我下了一个版本,最多只能放100个bin文件、、、、
还有另外的大神做法是用Qt,Visual C,C++等在电脑编写一个程序,或者脚本之类的,把这些文件合并,可是我不会呀。。。不会就真的是没有办法了吗??
不要忘了还有Fatfs,其实做法也就是打开目录,新建文件,打开文件,写文件
那么我就直接上吧
#define filepath03 "0:/bad300"
#define filepath08 "0:/bad300/NEW.bin"
void Myscan_files_and_bin_to_bin(const char *path)//遍历文件,顺便把目录下的文件全部合并
{
FRESULT res; //定义通用结果对象
DIR dir; //定义目录对象
FILINFO fno;//定义一个文件状态的结构体
FIL fil,fnew;//定义一个文件结构体,用于等一下打开读取文件。,fnew是准备写入的文件
u32 bww,bwn;
u16 file_counter=0;
unsigned char data_buff[1024];
if(f_opendir(&dir,path) == FR_OK) //打开目录
{
printf("->%s\n",path);
res=f_chdir(path); //把文件夹指针移动至"path"目录下,这个我就不太明白,我看别人的不需要移动,但是我必须得移动文件夹指针才能访问目录,要不然路径不对!!! //#define _FS_RPATH 需要被定义为1的时候才能使用
if(f_open(&fnew,filepath08,FA_WRITE|FA_CREATE_ALWAYS) == FR_OK) //创建要写入的bin文件
{
printf("Create new.bin sucessed\n");
}
else printf("Create new.bin fail\n");
}
else printf("Open path err!\n");
while(f_readdir(&dir,&fno) == FR_OK) //自动遍历所有文件
{
if(!fno.fname[0]) break; //读到文件末端,退出
if(fno.fattrib == AM_ARC)//如果文件只有存到属性,那么这个是文件
{
file_counter++;
printf("%d: %s \n",file_counter,fno.fname); //输出这个文件名
if(f_open(&fil,fno.fname,FA_READ) == FR_OK) //如果打开文件成功
{
f_read(&fil,data_buff,1024,&bww); //把这个文件读取到data_buff中
if(f_write(&fnew,data_buff,1024,&bwn) == FR_OK)
{
printf("write OK num:%d\n",file_counter);
}
f_close(&fil);
}
}
}
f_close(&fnew); //全部完成,关闭新建立的文件,如果在合并bin文件的过程中断电,这时候SD卡会出错,需要重新格式化SD卡
printf("write Done\n");
}
串口终端显示。。完成
但是有个问题,这样子来的话,看下第一个文件
12296.bin,,程序在把这个文件当做第一帧给写进去NEW.bin了,后面的顺序全部都正确。(我只合并了2297帧,第一个文件名是1000.bin)
我用的是这个函数 f_readdir,参考到别人做的遍历也是这样子做,所以对于排序的问题上,还是不够严谨。。。
然后来第二个问题,一开始在做合并的时候速度比较快,1秒可以合并20个文件,这样,可是,到后面,速度越来越慢了,到第2000个文件的时候,估计1秒只能合并1个文件了,
这个问题的话,目前我搞不懂,不知道是不是频繁的遍历文档,导致SD卡速度变慢了。。。