桌面小电视新思路,ESP32-S3 + 12864 OLED 串流视频

之前搞了个小电脑使用 ESP32-S3 + OLED 显示视频(见 3 步从 nana banana AI 生成的复古小电脑到真实桌面小玩具),但是受制于 Flash 空间有限,只放了 10 秒。

后来就想到是不是可以 ESP32-S3 只作为一个播放设备,视频数据从电脑上串流过去,而且在 ESP32-S3 支持这样串流的能力之后,理论上可以显示任意想要显示的信息,例如作为电脑的小副屏。

说干就干~

先看看效果

串流完整流程

因为屏幕使用的是 OLED,分辨率是 128x64,颜色是单色, 单帧数据只需要 128x64/8 =1,024 字节,即使串流 30 FPS 也只有 30 KB/s 的流量,因此在电脑端直接发送完整屏幕数据是完全可以接受的。

并且大部分图像处理工作都在电脑端处理完成了,ESP32-S3 的固件在实现渲染时压力就会小很多,只需要 接收数据->写入 OLED 显存 即可。

通信协议为了省事,直接使用 WebSocket 了,这样直接一个消息就是一帧数据,不用额外设计一个 Socket 通信协议。

完整的串流流程如下图所示:

esp32-oled-streaming-2

电脑端脚本

在电脑端,主要是使用 ffmpeg 库,将视频解析为独立的帧,并且将每一帧处理为目标格式,在 OLED 的场景下完整的步骤为:

缩放到目标尺寸(128x64)-> 灰度化 -> 二值化 -> 编码为 OLED 数据格式

代码直接用 Node.js + fluent-ffmpeg 库编写。

ffmpeg 处理代码

esp32-oled-streaming-3

执行推流脚本

esp32-oled-streaming-4

ESP32-S3 固件实现

在固件侧就比较简单了,直接使用 WebSockets 库创建一个 WebSocket Server,然后监听在 81 端口,接收到 Binary 类型的消息时,直接作为完整的一帧屏幕数据发送到渲染队列进行显示。

这里额外设置了一个渲染队列任务,充分利用一下 ESP32-S3 的双核能力 😃。

将 WS Binary 消息数据发送到渲染队列

esp32-oled-streaming-5

渲染队列中直接将数据显示到 OLED

esp32-oled-streaming-6

小结

在目标屏幕是 OLED 的情况下,从电脑直接推流到 ESP32-S3 + OLED 显示还是挺方便的,效果也还不错,后面试试看搞个彩色 LCD,看看推流 + 解码 + 渲染的情况下,ESP32-S3 能达到什么样的效果。

发表评论?

0 条评论。

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>