基于51单片机的简易“视频播放器”

前言

大概10年前,我在咱们EEWORLD论坛看到有人分享了用单片机在液晶屏上播放bad apple视频,当时觉得很有趣,但是奈何当时刚入门单片机,很多都不太懂,自己想做却不会做,只能作罢。如今,工作也好几年了,也不做嵌入式这一行。前段时间,趁着周末,工作也不太忙,突然想起这个事情了,于是从 上买了元器件,自己动手再实现这个功能,以弥补自己当年的遗憾,哈哈。

介绍

最终的效果如下:

播放bad apple视频:

播放数码宝贝的视频:

使用到的主要元器件如下:

  • 国产51单片机:STC15F2K60S2
  • OLED显示屏:SSD1306,分辨率为128*64
  • 无源蜂鸣器,8550三极管等
  • 原理图如下:

    具体方案

    由于视频文件比较大(MB级别),而51单片机的flash一般都比较小(KB级别),因此把视频文件直接存储在单片机内部显然是不行的。可以把视频文件存储在SD卡里面,然后单片机读取SD卡里面的内容;或者视频文件直接存储在电脑上,然后电脑通过串口实时发送视频数据给单片机,单片机实时显示视频画面。文本采用后者的方案。

    OLED12864绘图

    我们购买OLED12864(SSD1306)显示屏时,一般卖家都会提供51单片机的示例代码,或者 上也能找到很多相关的代码。

    使用这些代码在整个屏幕上绘图时,发现刷新率比较低,在11.0592M时钟频率的情况下,实测大概只有8.6fps。测试方法如下:

    
    

    oled_drawbmp为卖家提供的绘图的函数,每次屏幕刷新一次,p27 IO口翻转一次。使用逻辑分析仪测试p27的电平变化如下,可以看到频率约为4.3Hz,那么屏幕的刷新率大概为8.6Hz(fps)。

    因为我们的目的是使用单片机在这款显示屏上播放视频,而一般视频的帧率需要大于25fps,帧率过低就会有卡顿的感觉。显然,上面提到屏幕8.6Hz的刷新率是比较低的,因此我们需要做一些优化。

    比较直观且容易的优化方式之一,就是提高时钟频率,把11.0592M提高到24M或者27M的时钟频率。

    第二个优化方法就是优化绘图函数。先来看看iic的开始信 和结束信 的代码:

    
    

    可以看到,里面有一些延时5微妙(delay_5us),其实这个不是必须的,去掉这个延时,iic同样可以正常通信。因此,去掉这个延时,可以加快显示屏的刷新速率。

    其次,我们再看看卖家提供绘图部分的函数:

    
    

    而iic_writedata的实现如下:

    
    

    可以看到,每写一次图像数据bmp[j],都会有一次iic开始与结束动作,也都会先发送两个控制指令(0x78, 0x40),这其实没有必要,优化后的函数如下:

    
    

    可以看到,上面的函数减少了启动iic、结束iic,减少了写控制命令(0x78, 0x40)。使用跟之前同样的测试方法,经过上述的优化,最终屏幕的刷新率如下:

    上述的结果为,使用27M时钟频率,加上上面提到的几点优化,可以看出最终屏幕的刷新率约为34.5*2=69Hz(fps),这已经满足我们播放视频所需的屏幕刷新率了。

    另外,再提一点,其实还可以进一步优化,使得屏幕刷新率达到100fps以上,测试结果如下。

    视频转码成十六进制格式

    单片机播放视频,我们需要将视频转码为单片机可以读取的十六进制数据。

    首先我们需要将视频分解为一帧一帧的图像,然后可以用如下的取模软件获得图像的十六进制字模。

    但是,由于视频的帧数比较多,我们一帧一帧手动的使用取模软件获取字模,显然是一个比较累的活。因此,我们可以写个python代码,批量生成每帧画面的十六进制数据。python代码如下:

    
    

    代码比较简单,其中会调用OpenCV的库,用来读取视频以及视频画面对应的像素值。

    串口发送

    视频数据准备好之后,我们需要把视频数据通过串口发送给单片机,单片机接收到完整的一帧数据(一帧画面)之后,就可以开始显示画面。我们同样可以写个python代码来将视频数据发送给单片机,代码如下:

    
    

    代码比较简单,其中会调用串口相关的serial库,然后每次循环发送一帧数据,直至全部发送完成。

    小结

    最后,总结一下 在51单片机播放视频的大致流程:

    1. 视频解码成一帧帧的图像,然后再转码成显示屏可以显示的十六进制格式(这一步可以提前完成)
    2. 电脑通过串口把十六进制格式的视频数据发送给单片机
    3. 单片机接收到完整的一帧数据(一幅图像)后,显示屏开始显示画面
    4. 同时,蜂鸣器播放音乐(可选)。

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2022年6月2日
    下一篇 2022年6月2日

    相关推荐