树莓派PICO-OLED图片和视频

树莓派PICO-oled图片和视频

一.思路

我们在使用micropython来控制oled时,使用到了ssd1306的库,通过ssd1306引入的framebuf我们可以实现将一帧图片数据写入帧缓冲区,然后oled可以显示一帧图片,通过连续写入帧,就可以让oled显示一段视频

然而oled12864属于黑白显示的一类,那么我们就需要对帧数据进行预处理:我们将一段视频.mp4或者动画.gif按照一定的码率剪切为单独的帧图片,将所有的帧图片转化为128x64的二值化图片,然后让单片机逐一播放,以达到我们想要的效果。

注:本案例将采用oled12864+micropython+raspberry pico完成,案例对于其他使用micropython编程的单片机比如:ESP32同样适用

本案例将用到的软件下载:Hrilug/CSDN (github.com)

二.实现数据预处理


       首先,对于视频文件,我们需要转换为.gif文件,你可以通过网络在线转化器Online File Converter (cdkm.com)。这里你需要设置.gif的帧数,这直接决定你后来oled的刷新率和你的文件大小了,但是oled12864的刷新率也是有极限的,我这里直接推荐你的使用1-10帧提取视频文件到gif。      

树莓派PICO-OLED图片和视频_第1张图片


       现在你已经有了GIF文件,但是oled12864不能直接播放GIF动画而是一帧一帧的图片,所以我们把GIF文件拆开,这里我们需要使用软件gitsplitter,这是个软件以及类似软件很多,大家自行查找。然后得到一帧一帧的BMP格式的图片。

树莓派PICO-OLED图片和视频_第2张图片树莓派PICO-OLED图片和视频_第3张图片


       然而,这还并不是我们想要的帧图片,我们需要将帧图片调整大小为128x64像素,我们可以使用批量图片处理软件图片转化器。

树莓派PICO-OLED图片和视频_第4张图片

      

        最后,我们将BMP帧图片转换为PBM二值图片类型。我在这里先引入一个文件类型:PBM。对于.pbm的图片文件可以存储二值化的图片,并且占用内存小,同样也方便我们操作。使用PBM文件存储单独的帧,然后让单片机读取让oled显示,也是目前比较主流的oled视频播放的方法了,相对于一帧一帧地提取图片色值并把数组写进txt方便得多。我们使用python脚本实现转换。

       注:将BMP帧放在python脚本同一个文件夹下,PIL库下载pip3 install pillow

from PIL import Image
import time

for i in range(1,122):
    print(i)
    file=str(i)+'.bmp'
    im=Image.open(file)
    im=im.convert('1')
    im.save(str(i)+'.pbm')
    time.sleep(0.1)

三.实现


       我们将ssd1306.py库文件、main.py主程序、还有含有我们预处理好的PBM文件的PBM文件夹上载到PICO开发板。

树莓派PICO-OLED图片和视频_第5张图片

       Main.py参考来自博主YunTianMingg

from ssd1306 import SSD1306_I2C
from machine import I2C,Pin
import time,machine,framebuf

i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=2000000)
display = SSD1306_I2C(128,64,i2c)

def show(dirt):
    with open(dirt,'rb') as f :
        f.readline()
        data = bytearray(f.read())
        fbuf = framebuf.FrameBuffer(data,128,64,framebuf.MONO_HLSB)
        display.fill(0)
        display.blit(fbuf,0,0)#如果不居中,可以修改中间的参数
        display.show()
        del fbuf#清理内存

for i in range(1,122):
    dirt = 'pbm/'+ str(i) + '.pbm' #文件地址
    show(dirt)
    time.sleep(0.2)#这个延时的长度取决于各自的帧率

参考:

 如何高效使用Micropython看你喜欢看的视频_YunTianMingg丶的博客

 ESP32 Python 用OLED播放Bad Apple_scott_xiao的博客

你可能感兴趣的:(python,单片机)