电子产业一站式赋能平台

PCB联盟网

搜索
查看: 26|回复: 0
收起左侧

手把手教你在STM32上实现OLED视频播放(很简单也很硬很肝!)

[复制链接]

208

主题

208

帖子

1635

积分

三级会员

Rank: 3Rank: 3

积分
1635
发表于 2021-3-22 21:55:00 | 显示全部楼层 |阅读模式
点击上方「嵌入式实验基地」,选择「置顶公众号」第一时间查看嵌入式笔记!

spydkbzm5d564047054846.png

spydkbzm5d564047054846.png


之前发了一个视频,今天就来告诉大家怎么来实现:
小熊派刷儿子骑摩的的抖音视频,流畅度666666
我们这一代的年轻人基本上都很喜欢逛B站,大部分老人都认为我们这些年轻人上B站是为了看动漫、看游戏等等,谁跟你B站是用来看这些的,B站是用来学习的!

ay4wwpo4rhe64047054946.png

ay4wwpo4rhe64047054946.png






g0mrrwvm3f064047055046.png

g0mrrwvm3f064047055046.png

前一段时间就刷到一个视频,某B站Up主利用小熊派开发板制作了一个Bad apple的视频,如下:
https://www.bilibili.com/video/BV18t4y1X7jT?from=search&seid=9128578257339532185
并且Up主也公开了他的代码和他制作的视频文件。

34swnyzrl3d64047055147.png

34swnyzrl3d64047055147.png


原理很简单,就是用一个视频截图软件,将播放的视频的图片一张张截下来,利用工具将图片转换成bin文件,然后将bin文件拷贝到SD卡里,最后使用小熊派驱动读取SD卡里对应的bin文件,然后将每一帧图像读出来显示到LCD上即可,那么如何实现呢?大佬用小熊派显示bad apple,我偏不,我就拿它来放别的视频,举一反三

es1qxx1qwnf64047055247.png

es1qxx1qwnf64047055247.png

,接下来我们直接上干货,下面都是我自己闲时制作的作品:
1、利用KMplayer对视频进行截图下载地址:https://www.onlinedown.net/soft/38003.htm
(1)拖放视频到KMPlayer
这个是我小孩骑摩的玩耍的视频,直接拿来做效果了。

gpcmohld40d64047055347.png

gpcmohld40d64047055347.png

(3)鼠标右键点击,选择高级捕获

bn5yno234kw64047055448.png

bn5yno234kw64047055448.png

(4)设置捕获参数并捕获帧

kgs1xgw2xgb64047055548.png

kgs1xgw2xgb64047055548.png

由于小熊派的屏幕的分辨率是240*240,一张RGB565的图片需要占用115200字节的缓存,所以是无法在Keil上编译通过的,为了能够完成我的作品,所以我用了另外一个128*128的OLED屏,这样一张RGB565的图片仅需要32768字节的缓存,完全可以满足我的设计需求,接下来设置参数完毕后选择点击开始,然后点击播放视频三角符号,开始捕获帧。
(5)接下来视频开始播放,会看到捕获到的目录下有很多图片产生

jnspksl1g2o64047055649.png

jnspksl1g2o64047055649.png

2、利用Image2Lcd v3.2批量生成bin文件(1)图片全部捕获完成后,使用Image2Lcd将bmp批量转换成bin文件

dyt0qanef4v64047055749.png

dyt0qanef4v64047055749.png


cuukx14mmwm64047055849.png

cuukx14mmwm64047055849.png


ae1s24krian64047055949.png

ae1s24krian64047055949.png

接下来在捕获目录下会自动生成一个batch目录,目录下就是生成的bin文件,每个bin文件对应的就是上一级目录的每一张图片。
3、利用Linux下的Cat命令合并所有bin文件将所有bin文件拷贝到Linux下能识别的区域,然后利用Linux下的Cat命令将所有的bin文件合并成一个文件,如下图所示:

0keychyeeyh64047056050.png

0keychyeeyh64047056050.png

当然如果你有更好的合并文件的方法也可以,不一定要在Linux下使用Cat命令合并,这里我只是图方便而已,合并完毕后将这个bin文件拷贝到SD卡的根目录下。
4、编写MCU程序之前已经写过很多现成的demo了,所以这里就不重新再写了,如果有兴趣的话请到我的码云clone这个项目,我们只关心执行bin文件的接口怎么写就可以了,bin文件执行接口实现如下:
/*一张RGB565图片占用的缓存大小*/
#define PIC_SIZE 32768
/*在LCD的X坐标*/
#define DISPLAY_START_X 0
/*在LCD的Y坐标*/
#define DISPLAY_START_Y 0
/*LCD宽度分辨率*/
#define OLED_WIDTH   128
/*LCD高度分辨率*/
#define OLED_HEIGHT  128
/*用于显示的缓存区*/
uint8_t framebuffer[PIC_SIZE] = {1};
int sd_show_picture_bin(const char *path)
{
    UINT br;
    FIL fil ;
    int offset = 0 ;
    int file_size ;
    FRESULT res ;
    /*1.打开传进来的Fatfs文件路径: path*/
    res = f_open(&fil, path, FA_READ);
    if(FR_OK != res)
        return -1;
    /*2.计算这个文件的大小*/
    file_size = f_size(&fil);
    /*3.初始化偏移变量为0*/
    offset = 0 ;
    /*4.计算bin文件里一共包含多少张图片,然后不断的给LCD进行显示*/
    for(int i = 0 ; i if(FR_OK != res)
            return -2;
        /*6.将整个数组赋值给显示接口,显示图片*/
        ST7735_DrawImage(DISPLAY_START_X, DISPLAY_START_Y, OLED_WIDTH, OLED_HEIGHT, (uint16_t *)framebuffer);
        /*7.将偏移往后加PIC_SIZE,就到了下一张图片*/
        offset += PIC_SIZE;
        res = f_lseek(&fil, offset);
        if(FR_OK != res)
            return -3;
    }
    /*8.关闭文件描述符*/
    res = f_close(&fil);
    if(FR_OK != res)
        return -4;
    return 0 ;
}
这里要重点说一下,如果你是用别的分辨率的LCD,或者仅仅只需要在屏的某个位置显示视频,那么需要更改对应的宏定义,配置成你自己需要的参数即可,然后还需要更改LCD的显示接口,将如上所示的ST7735_DrawImage函数替换成你自己显示器上的函数,不出意外,这个函数是通用的,在任意的彩屏OLED上都可以使用。然后,在默认SD卡挂载且LCD驱动正常的情况下,在while(1)循环里调用:
while (1)
{
   sd_show_picture_bin("0:/boy.bin");
}
这样就可以实现视频的循环播放了!就是这么简单,小伙伴们赶紧制作起来了!来看下效果:
5、项目开源地址本节代码已同步到码云的代码仓库中,获取方法如下:

sw4sotpwyw364047056150.png

sw4sotpwyw364047056150.png

码云仓库:
https://gitee.com/morixinguan/personal-open-source-project/tree/master/8.video_demo
获取项目方法:
git clone https://gitee.com/morixinguan/personal-open-source-project.git
我还将之前做的一些项目以及练习例程在近期内全部上传完毕,与大家一起分享交流,如果有任何问题或者对该项目感兴趣,欢迎加我微信:morixinguan一起交流学习。

1hu4lrpvxhx64047056250.png

1hu4lrpvxhx64047056250.png

如果要在小熊派自己的LCD上显示,则将下载后的SD卡资源拷贝到SD卡的根目录下,然后将第一个例程编译并烧写到开发板上即可,如果需要在ST7735上全屏显示,则需自己去采购一个ST7735的屏。

本次的介绍就到这里啦,后面有更精彩的内容,欢迎大家持续关注嵌入式实验基地!
??如果你觉得对自己有帮助的话,给个赞,点个关注,点个在看,感谢前进的道路上有你的陪伴!

1qcuxmg5pcs64047056351.png

1qcuxmg5pcs64047056351.png


推荐阅读
?开源电路のSTM32最小系统设计
?一种你值得拥有的简单易实现的开关电路
?无线通讯之红外通讯
?DIY一个离线语音控制器
?HAL库us延时的3种实现方式?逻辑分析仪的简单使用介绍(附带iic,uart,spi数据波形分析)
?ART-PI重力感应无线智能小车第一弹----ART-PI扩展板设计?ART-PI重力感应无线智能小车第二弹----Onenet+wifi+L298N电机驱动?ART-PI重力感应无线智能小车第三弹----RT-Studio+MPU6050+MQTT发布订阅?STM32 DAC音频输出
?pcb设计基础?OLED+ESP8266网络小时钟
回复

使用道具 举报

发表回复

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

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表