IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 玩玩 STM32F103+lvgl+Fatfs+SD 视频播放 -> 正文阅读

[嵌入式]玩玩 STM32F103+lvgl+Fatfs+SD 视频播放

最近偶然看到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);

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-11 16:46:50  更:2021-07-11 16:48:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/5 2:54:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码