如何高效使用Micropython看你喜欢看的视频?【下】(生成图片帧和WIFI传输播放)

上一篇教程,我们谈到本项目还有两个重要的问题没有解决:一个是没有TF卡的话,应该如何播放视频,另一个就是如何高效生成视频帧,这篇教程我们就要好好聊聊。

0x02 如何把视频帧进行WIFI传输

我额外多加这一步,其实是为了方便没有TF卡的小伙伴进行实验。因为我发现:当我使用ESP32去读取我自己制作的PBM文件时,我遇到了读取速度慢的问题(当然这是一个伏笔,我们后面会提到),我怀疑这是因为ESP32的性能不足导致的,因此萌生了一个想法:

先在电脑端编写好python脚本,然后读取准备好的视频帧,再发送给ESP32!

那怎么样才能发送数据给ESP32呢?当然是通过WIFI了。

很久之前,我就研究过,只要电脑和ESP32接入了同一个WIFI环境,就可以让电脑创建一个Socket服务端,ESP32作为客户端进行数据交换,我用这个方法制作了很多项目,所以这次我也打算用Socket。

不过这里,我遇到了第一个疑难问题,也一直没有解决。

当我使用【ESP32作为服务端电脑作为客户端】的时候,只要电脑发送数据给ESP32,32就会卡死,报错内容如下:don’t call tcp_recved for listen-pcbs

我在网上查阅资料时,看到DF-ROBOT的一篇关于掌控板的博客,里面竟然使用ESP32作为服务端成功播放了视频,而我使用他们的代码还是出现了上述问题,处理了很久都没有解决,所以我还是换回来,使用【电脑作为服务端,ESP32作为客户端】进行接收,并且成功看到了视频!

这里是电脑端的脚本:

import socket,times = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname(socket.gethostname())
print(host)
port = 8080s.bind((host,port))
s.listen(5)print('等待客户端连接中…')client,client_address = s.accept()
print('新连接')
print('IP:'+str(client_address[0]))
client_IP = str(client_address[0])
print('Port:' + str(client_address[1]))
client_port = str(client_address[1])for i in range(0,355,5):#这里大家可以根据自己生成的图片编号、数量、帧率进行调节,第一个数字是第一帧的文件名,第二个是最后一个的文件名,第三个是每一个文件名之间相隔多少,如果使用我提供的脚本生成图片,第三个数就是帧率。dirt = 'after/' + str(i) + '.pbm'#各位自行根据自己帧保存的位置来修改with open(dirt,'rb') as f:f.readline()f.readline()data= f.read()client.send(data)print(i)time.sleep(0.19)#5帧极限了,这个帧率不需要修改了

这里是ESP32的脚本

import socket,framebuf,time,machine
from machine import I2C,Pin
from ssd1306 import SSD1306_I2Ci2c = I2C(scl = Pin(23),sda = Pin(22))
display = SSD1306_I2C(128,64,i2c)
host = '192.168.137.1'
port = 8080s = socket.socket()
addr = (host,port)
s.connect(addr)i = 0while True:data = s.recv(1024)if data != 0:#其实这个要不要无所谓,没影响fbuf = framebuf.FrameBuffer(bytearray(data),88,64,framebuf.MONO_HLSB)#这个参数不能换display.fill(0)display.blit(fbuf,19,0)display.show()del data

至此,我们已经成功可以在OLED上用Micropython看Bad Apple了,可以装逼了!

0x03 如何高效生成帧文件?

刚刚提到,我读取自己生成的PBM文件时,遇到了读取慢的问题,就算是用电脑读取,速度也很慢,在OLED屏幕上显示也是花屏,所以我怀疑是我生成的PBM文件有问题。

当我查看我生成的文件属性时,发现了问题所在:文件太大了!


可以发现,我制作的PBM文件比正常的文件整整大了几十倍!也怪不得读取这么慢了,那究竟是我制作时哪一步出了问题?

我制作PBM文件时,我是使用PR先把视频素材进行预剪辑,剪辑出自己需要的一部分,然后导出为几千个BPM图片帧,这一步没有问题。

接着,我用PS对所有图片进行批处理:二值化、保存为PBM。我猜测就是这一步出了问题。

于是邪门的事情发生了:明明我的图片和BAD APPLE里的图片所包含的像素是一样多的,为什么它就是700B,我是16K呢?难道说不能使用PS来操作?

索性的,我决定自己临时查看OPENCV - python的文档,学习如何进行视频帧处理、二值化、反相、裁剪、导出帧文件,争取在一个脚本中集成所有功能。最后还真的让我捣鼓出来了!上代码:

import cv2 as cv
import numpy as npvc = cv.VideoCapture('1.avi')#打开视频
c = 0#累计帧数
timeF = 5#隔5帧截一次图,数字越小,播放越细腻def binary_image(image):#将图像处理为二值化的程序gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)  #把输入图像灰度化h, w =gray.shape[:2]m = np.reshape(gray, [1,w*h])mean = m.sum()/(w*h)print("mean:",mean)ret, binary =  cv.threshold(gray, mean, 255, cv.THRESH_BINARY)return binarydef save_binary(dirt):#保存二值化图像的程序,用字符串传入文件位置image = cv.imread(dirt)image = binary_image(image)#二值化image = cv.bitwise_not(image)#反相,根据视频内容来定需不需要反相image = cv.resize(image,(88,64))#调整尺寸cv.imwrite('1.pbm',image)#保存def access_pixels(image):#相反操作height, width, channels = image.shapeprint("width:%s,height:%s,channels:%s" % (width, height, channels))for row in range(height):for list in range(width):for c in range(channels):pv = image[row, list, c]image[row, list, c] = 255 - pvreturn image###########################################################
#此部分为循环导出视频帧if vc.isOpened():  # 判断是否正常打开rval, frame = vc.read()#返回一个元组,frame是帧对象
else:rval = False
print(rval)
while rval:  # 循环读取视频帧rval, frame = vc.read()if rval is True:if (c % timeF == 0):  # 每隔timeF帧进行存储操作frame = binary_image(frame)#二值化#frame = cv.bitwise_not(frame)#反相,根据视频内容来定需不需要反相frame = cv.resize(frame,(88,64))#调整尺寸cv.imwrite('after/' + str(c) + '.pbm',frame)#保存c = c + 1cv.waitKey(0)
##########################################################################

使用这个脚本有几个好处:

①如果你只是想显示图片,那么可以不执行下面的村换,直接调用我提供的save_binary(),即可保存二值化之后的图片;

②如果你想显示视频,视频也无需压缩和处理,直接执行循环即可导出可以使用的帧文件;

至此,本工程的进度也全部交代完毕,各位玩的开心~

0x04 后续更新方向

本项目其实还有几个地方可以改进,我也会慢慢跟进:

第一个是换用SPI接口的屏幕,或许可以加快屏幕的刷新速率,观看更流畅的视频!

第二个是直接把我处理帧文件的脚本和电脑发送帧的脚本直接结合在一起,处理完直接发送给ESP32,这样就能做成一个小电视了!

如何高效使用Micropython看你喜欢看的视频?【下】(生成图片帧和WIFI传输播放)相关推荐

  1. 为什么有的人喜欢看烧脑剧?

    # 为什么有的人喜欢看烧脑剧? ### 什么是"烧脑" 通常指影视作品悬念高深莫测,需要极高智商才能看通透,并且可以获得脑细胞燃烧的快感. ### 烧脑剧有什么? 烧脑剧常常伴有大 ...

  2. 怎样快速查看文档是否统一_开发到底喜欢看怎样的需求文档

    ​一份好的需求文档不仅能提高开发效率,还能避免需求误解导致的返工. 开发喜欢看怎样的需求文档?我总结了以下7点. 目录 需求文档必备的基本要素 分工要明细,避免多人看同一份文档 逻辑要清晰,避免口口相 ...

  3. 开发到底喜欢看怎样的需求文档?

    一份好的需求文档不仅能提高开发效率,还能避免需求误解导致的返工. 开发喜欢看怎样的需求文档?我总结了以下7点. -1- 需求文档必备的基本要素 需求迭代.需求优先级.需求产品负责人.需求开发人员.需求 ...

  4. excel记账本模板_原来这才是老板最喜欢看的财务报表!这些模板送你,录入自动生成...

    [原来这才是老板最喜欢看的财务报表!这些模板送你,录入自动生成] 都说财务报表做好,会计下班会很早!财务报表做的妙,升职加薪少不了! 会计每到下班拖后腿的就是要整理好各种报表然后发给领导,会计不是在做 ...

  5. 开发到底喜欢看怎样的需求文档

    一份好的需求文档不仅能提高开发效率,还能避免需求误解导致的返工. 开发喜欢看怎样的需求文档?我总结了以下7点. 目录 需求文档必备的基本要素 分工要明细,避免多人看同一份文档 逻辑要清晰,避免口口相传 ...

  6. python:就喜欢看你看不惯我又干不掉我的样子

    今天又是被python广告支配的一天. 小编最近怀疑自己得了病,病名就是"python恐惧症".每天一打开微信,朋友圈,公众号,到处都能看到python的广告,刷刷视频,也是pyt ...

  7. myknn() takes no arguments_遇见姻缘NO.313[上海相亲男]天津大学毕业,金融工程师,喜欢看书、爬山、吉他...

    导 语 "遇见姻缘"是一个佛系相亲交友平台,我们倡导单身青年抱团一起脱单.组织公众号:遇见姻缘,早点脱单.申请上墙请咨询微信号:yjyy230 个人基本信息 昵称:黄花梨 出生年月 ...

  8. OSChina 周二乱弹 —— 还是喜欢看西游记,有家的感觉

    2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2019)请戳(这里) [今日歌曲] @小鱼丁 :#今日歌曲推荐# 分享萧煌奇的单曲<过我的生活> ...

  9. Python应用 | 我喜欢看什么美剧(一)

    欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. <权利的游戏>.<天赋异禀>等耳熟能详 ...

最新文章

  1. oepnstack笔记
  2. php语言三个数从小到大排序,求教输入5个数,从小到大排序 的C语言程序?
  3. 16道嵌入式C语言面试题(转载)
  4. 如何不部署Keras / TensorFlow模型
  5. 为什么在Python代码中需要装饰器
  6. MySQL单机版Recycle Bin回收站功能
  7. 在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序
  8. Python中的字典数据结构
  9. 电子电路设计——multisum中快捷设置555定时器
  10. java新闻发布系统
  11. 数据结构算法之关键路径
  12. Python-XML文件读取/添加/修改方法记录(一)
  13. 微信小程序开发踩坑日志
  14. 2019-09-11想念艾青,想念《大堰河——我的保姆》
  15. python爬虫实战2:爬取近100期双色球开奖记录
  16. JAVA学习笔记_小写数字转换成大写且带单位_金额小写转大写
  17. Java笔记23反射,设计模式
  18. win10 mstsc 设置
  19. BGA封装扇出过孔-BGA芯片的布局布线技巧
  20. 电脑重装系统如何在 Win11查看显卡型号信息

热门文章

  1. 乌隆他尼皇家大学-静待绽放的“明珠”
  2. 2020年,这个算法团队都干了啥?
  3. 道路覆盖 (二分答案+状压DP)
  4. 格兰杰因果( Granger causality test)在神经科学中脑区功能连接上的应用
  5. 专升本英语——语法知识——高频语法——第六节 名词性从句(主语从句-表语从句-同位语从句-宾语从句)【学习笔记】
  6. Gradle 4.4 版本 百度云网盘地址(永久有效)
  7. log4j连接ekl
  8. 【SaaS考试认证】aPaaS_腾讯千帆神笔
  9. 私有化完成 360回归A股还有哪些障碍?
  10. 纵向数据中抑郁检测与预测的深度多任务学习