玩玩 STM32F103+lvgl+Fatfs+SD 视频播放

1 篇文章 0 订阅

最近偶然看到B站bad apple的视频, 是基于stm32单片机的,心血来潮自己也来弄了一个车模小视频,哈哈。。。

stm32f103_lvgl_sd_video_bin

 

和bad apple的播放原理一样,视频其实就是一张张小图片,保存为.bin二进制文件格式,放在SDcard里面,通过stm单片机读取SD的bin文件,再显示在TFT上面。

第一步,截取视频图片。

截取视频图片的方法很多,这里选择通过KMPlayer播放截取一段视频。

右键视频,打开提取窗口.

 

 因为用的是160*80的16位TFT屏,想要视频播放速度正常,我选择Every Frame,虽然图片的数量增加了很多,但是保存在SD里,谁在乎大小(哈)。 Prefix是图片名+4位数字。点击Start就可以截取大小160*80的bmp图片了。

第二步,合成bin文件。

先把每张小图片转换成单独的bin文件。 这里使用牛人写的小软件Lvgl_image_convert_tool-master。 是的,没错,我的stm32程序使用了lvgl, 通过lvgl来播放我们的图片。

通过上面的设置转换就可以。 输出格式这里选择了 Bin_565_swap. 因为TFT是16bit, RGB565格式,lvgl的SPI是每次发送8bit, 所以定义了swap,分2次发。 

如何把这些小bin文件合并成一个文件呢? 使用windows cmd命令就可以。win+r 打开run窗口,输入cmd. 假设我bin文件放在F盘batch文件夹下面,输入命令

pushd f:\batch 切换到batch文件夹, 再输入 copy /b *.bin f:\backtest.bin 就可以生成最后合并的文件。(so easy)

第三步,同过lvgl显示合并后的bin文件。

因为只是要连续播放图片数据,所以这里我把每张图片当做一个背景图片来显示(应该还有其他方法,懒得想,嘿)。 移植好lvgl + fatfs后,在需要显示的插入下面代码就OK了。 lvgl版本用的是6.0.0.

	uint32_t offset = 0 ;
	uint32_t br;	

    lv_fs_file_t lv_file;
    lv_fs_res_t  lv_res;	

	lv_res = lv_fs_open( &lv_file, "S:/backtest.bin", LV_FS_MODE_RD );
  	if ( lv_res != LV_FS_RES_OK ) {
    	printf( "LVGL FS open error. (%d)\r\n", lv_res );
  	} else 
  		printf( "LVGL FS open Ok\r\n" );
	  
		
	lv_res = lv_fs_size(&lv_file,&file_size);
	if ( lv_res != LV_FS_RES_OK ) {
        printf( "lv_fs_size error. (%d)\r\n", lv_res );
  	} else 
  		printf( "lv_fs_size Ok\r\n" );
			
		
	lv_obj_t * imgBg = lv_img_create(lv_scr_act(), NULL);
		
		
 lv_img_dsc_t testimg = {
  .header.always_zero = 0,
  .header.w = 160,
  .header.h = 80,
  .data_size = 12800 * 3,
  .header.cf = LV_IMG_CF_TRUE_COLOR_ALPHA,

};
	 
    offset += 4; //从offset=4 读取图片数据,为什么? 因为转换后的bin图片文件加了4个字节的数据
	lv_fs_seek(&lv_file, offset);
		
    //计算bin文件里一共包含多少张图片,然后不断的给tft进行显示
    for(int i = 0 ; i < file_size / 38404 ; i++)
    {
        //读取一张图片,图片数据的大小是38400,将读取出来的图片存放到缓存区framebuffer数组里*/
			
	   lv_res = lv_fs_read(&lv_file, framebuffer, 38400,&br);
			
	   testimg.data = framebuffer;
	   lv_img_set_src(imgBg, &testimg);
       lv_obj_align(imgBg, NULL, LV_ALIGN_CENTER, 0, 0);
	   lv_task_handler();
		
        /*7.将偏移往后加38404,就到了下一张图片*/
        offset += 38404;
		
		lv_res = lv_fs_seek(&lv_file, offset);

    }
		
		lv_fs_close(&lv_file);

  • 12
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
首先,需要明确的是,STM32和W25Q64是完全不同的产品,它们分别是微控制器和闪存存储器。而FATFS是一个用于嵌入式系统的文件系统。因此,题目中的"STM32 W25Q64 FATFS速度慢"可能涉及到两个方面的问题,即STM32的操作速度与W25Q64芯片的读写速度,以及FATFS文件系统的读写性能。以下我将就这两个方面进行回答。 首先,STM32的速度问题可能与控制器的硬件和软件设计有关。可能是使用了低速的系统时钟频率或者是编写的代码存在效率上的问题。解决这个问题的方法是重新评估系统的时钟配置,以获得更高的处理速度,并且可以通过优化代码来提高程序的执行效率。 其次,W25Q64芯片的读写速度取决于其本身的性能和连接方式。要确保读写速度最大化,首先要确保正确选择了合适的SPI总线时钟,并进行合适的SPI通信设置。其次,在读写数据时需要考虑到W25Q64芯片的数据传输速率以及是否使用了缓存等功能。最后,检查硬件电路的设计与布线是否符合要求,并根据需要进行优化。 最后,FATFS文件系统的读写性能可能与文件系统的配置有关。在初始化FATFS时,需要选择合适的参数来优化文件系统的性能。例如,可以选择合适的簇大小和对齐方式,以减少磁盘片段和提高读写速度。此外,可以根据实际需求进行文件缓存的大小调整,以提高磁盘访问效率。 总结而言,如果STM32的速度慢、W25Q64芯片的读写速度慢或者FATFS的读写性能慢,需要综合考虑硬件和软件层面的因素,并根据具体问题进行适当的优化和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值