OLED12864播放视频

最近看了B站up@会飞的阿卡林做的一个主板小屏幕,可以在一块0.96寸的12864上播放视频,觉得十分不错,up还附上了上位机软件和NodeMCU单片机的代码。不过上位机代码我好像没找到,所以心血来潮自己写了一个。但是我也是临时学的C#,代码写得不太好,勉强能用,等后面学了界面再来改进。先附上这个up的视频地址 视频地址

上位机代码

​ 我们不可能把整个视频放到NodeMCU里,所以要通过串口把一张张分辨率128x64的图片通过串口发到单片机里让它驱动屏幕显示出来。其实之前也试过用WIFI来发,不过不知道为啥贼慢。上位机里要做的就是读取图片、转换成oled12864能用的字节数组再通过串口发送而已。

using System;
using System.IO.Ports;
using System.Threading;
using System.IO;
using System.Drawing;
using System.Collections;namespace ConsoleApp10
{class Program{public class Comparer : IComparer  //图片序列按照文件名给出的的时间进行比较,确保播放顺序正确{public int Compare(Object x, Object y){string s1 = (string)x;string s2 = (string)y;string name1 = s1.Substring(0, s1.Length - 4);string name2 = s2.Substring(0, s1.Length - 4);return Convert.ToDouble(name1) > Convert.ToDouble(name2) ? 1 : -1;}}static bool PicToByte(string path,ref Byte[] temp)  //将图片转换为单片机可用的字节数组{try{string bits = "";int count = 0;int byteCount = 0;Bitmap bitmap = new Bitmap(path);for (int i = 0; i < bitmap.Height; ++i){for (int j = 0; j < bitmap.Width; ++j){Color c = bitmap.GetPixel(j,i);int rgb= (int)(c.R * .3 + c.G * .59 + c.B * .11)  ;//灰度公式bits += rgb > 100 ? '1' : '0';                        ++count;                        if (count%8 == 0){temp[byteCount++] = Convert.ToByte(bits, 2);bits = "";}}}}catch (Exception e){Console.WriteLine(e.Message);return false;}Array.Reverse(temp); //切换大小端return true;}static void Main(string[] args){try{string[] ports = SerialPort.GetPortNames();if (ports.Length == 0){Console.WriteLine("No Avaliable Serial Port...");return;}SerialPort port = new SerialPort(ports[0], 1000000, Parity.None, 8);//端口的初始化设置port.StopBits = StopBits.One;port.Open();Byte[] test = new byte[1024];string path = "F:\\截取";DirectoryInfo dInfo = new DirectoryInfo(path);FileInfo[] fInfo = dInfo.GetFiles();Console.Clear();string[] fileName = new string[fInfo.Length];int count = 0;foreach (FileInfo f in fInfo){fileName[count++] = f.Name;}Array.Sort(fileName, new Comparer());//按照时间对所有文件名排序Console.WriteLine("Pree Any Key to Start");Console.ReadKey();Console.WriteLine("Playing...");int p = 0;for (; ; ){PicToByte(path + @"\" + fileName[p], ref test);p += 2; //每4张图片播放一张,配合下面的sleep可以达到稍微能看的播放速度if (p >= fileName.Length){p = 0;  //播放完从头播放}port.Write(test, 0, 1024);Thread.Sleep(45);}} catch (Exception e){Console.WriteLine(e.Message);return;}}}
}

NodeMCU程序

​ 单片机的程序只需要接收发来的图片数组就行。一张图片为128x24=8192bit=1024byte,也就是这个图片数组将有1024个元素。可能是单片机缓冲区的问题还是啥这么多数据不能一次接收完得分多次才行。接收之后直接调用u8g2库的显示图片函数就完成了:

#include <Arduino.h>
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endifU8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);unsigned char col[1024] = {};//储存图片数据的数组
unsigned int n = 0;void setup(void) {u8g2.begin();u8g2.clearBuffer();Serial.begin(1000000);  while (Serial.available() > 0)Serial.read();printStr("Running");
}void loop(void) {if (Serial.available() > 0 && n < 1024) { while (Serial.available() > 0) {col[n++] = Serial.read();}if (n < 1024) { //没有读取1024个数据将进入下一循环继续读取return;}//读取了一整个图片数据,可以显示在屏幕上了u8g2.clearBuffer();u8g2.drawXBM(0, 0, 128, 64, col);u8g2.sendBuffer();n = 0;  //重置计数以读取下一帧的数据}
}void printStr(char* str) {u8g2.clearBuffer();          // clear the internal memoryu8g2.setFont(u8g2_font_ncenB08_tr); // choose a suitable fontu8g2.drawStr(10, 10, str); // write something to the internal memoryu8g2.sendBuffer();
}

关于图片的获取

可以使用PotPlayer的截图功能,根据视频的时长和想要的帧数采集一定数量的图片。注意这些图片尺寸设置为128x64,格式可以是BMP和PNG,用播放的时间命名文件就OK。另外再改一下上位机程序里的图片路径到截图路径。

效果如下

OLED12864播放视频相关推荐

  1. Android三种播放视频的方式

     分类: Android多媒体(12)  Android应用层(93)  版权声明:本文为博主原创文章,未经博主允许不得转载. 在Android中,我们有三种方式来实现视频的播放: 1.使用其自带的播 ...

  2. OpenCV播放视频-----滚动条随着视频播放移动代码

    学习OpenCV,使用highGUI工具包实现视频的播放控制,使滚动条随着视频播放移动 代码如下: #include "highgui.h" #include "dire ...

  3. win10html5无法播放,win10系统中网页中无法播放视频怎么办

    近日有win10系统用户要通过浏览器来打开网页观看视频的时候,却发现在网页中打开视频的时却无法播放,这是怎么回事呢,经过分析是由于Adobe Flash Player ActiveX插件未安装.版本过 ...

  4. 【Ubuntu】VirtualBox显卡驱动VBoxVGA、VBoxSVGA、VMSVGA +3D对播放视频的影响

    一.VBOXVGA.VMSVGA.VBOXSVGA简述 VBOXVGA和VBOXSVGA是vbox自己的,SVGA比VGA先进一点, VBoxSVGA: 使用Linux或者 Windows 7或者更高 ...

  5. ue4蓝图节点手册中文_在UE4中播放视频

    简介: 在日常使用UE4做项目时,会遇到在UE4里播放视频文件的需求,在UE4中可以使用媒体框架(Media Framework)来实现这一功能.这里介绍两种简单的方法来使用这一功能,分别是在场景里播 ...

  6. 小程序给视频加默认图片封面,点击播放视频并停止播放上一个视频

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 实现的功能: 微信小程序视频组件添加图片封面, 点击图片播放视频, 点击下一个视频的封面图自动停止播放当前视频 ...

  7. 【播放器SDK】Android如何实现固定竖屏播放视频

    安卓的固定竖屏播放并不受手机是否开启旋转的限制,需要用户设置Activity为固定竖屏.目前带皮肤的播放器内部对竖屏播放视频做了一定的支持.用户使用相对比较简单. 带皮肤播放器 参考Demo代码Fix ...

  8. 【WPF】使用控件MediaElement播放视频

    需求是点击按钮后,弹出弹窗播放视频.按钮的点击事件如下. public void ShowVideo() {Window window = new Window();window.Width = 80 ...

  9. 播放视频android学习笔记---44_在线视频播放器,网络视频解析器,SurfaceView 控件使用方法...

    最近用使开辟的过程中涌现了一个小题问,顺便录记一下因原和法方--播放视频 44_在线视频播放器 ------------------------- 1.注意这里,在模拟器中,android2.2和an ...

最新文章

  1. 办公电脑选购方案指南
  2. 【Java调试】通过SqlSessionFactory类对象获取mapper文件内的动态SQL在执行时的完整SQL及参数(2种使用方法+测试Demo及结果)
  3. gc()两分钟了解JDK8默认垃圾收集器(附英文)
  4. DDNS For RHEL5
  5. Python教程:Python中的for 语句
  6. 第一个c++泛型函数(即模板)
  7. 文档处理工具库——Apache POI的使用
  8. Docker 比较好的新入门教程
  9. error: passing ‘const AppJniCommand’ as ‘this’ argument discards qualifiers [-fpermissive]
  10. 基于ENVI的Landsat 7影像处理与多种大气校正方法对比
  11. 夜神模拟器使用命令行直接运行指定的模拟器
  12. 基于socket(TCP)和opencv的实时视频传输
  13. 插入法、选择法、冒泡法(C++实现)
  14. 【APPInventor\腾讯云】使用APPInventor开发连接腾讯云的安卓物联网遥控APP
  15. php thinkadmin自定义一个弹出弹窗批量操作功能
  16. 深度 | 巨头都在追逐的眼球追踪技术,究竟能带来什么?
  17. 《Python绝技:运用Python成为顶级黑客》python3实践记录
  18. 拜托,使用 Three.js 让二维图片具有 3D 效果超酷的
  19. 计算机中的正负数表示
  20. 多目标优化拥挤距离计算

热门文章

  1. Design and Implementation of a Highly Efficient DGEMM for 64-bit ARMv8 Multi-Core Processors
  2. javascript 异步编程二(转载 from 司徒正美)
  3. 计算机淡蓝色ppt背景,计算机图表蓝色边框PPT模板.ppt
  4. 怎么查计算机网络硬件配置,怎么样查看电脑配置?5种方法查看电脑硬件配置好坏图文详解...
  5. Linux系统中的kill -0有什么作用?
  6. SQL进阶教程—自链接的用法
  7. 自己写一个RTOS系统
  8. bzoj 4864: [BeiJing 2017 Wc]神秘物质 splay
  9. FPGA基础入门【12】开发板USB鼠标控制
  10. [学习笔记]《零基础做出高逼格PPT》