618浏览
查看: 618|回复: 2

[ESP8266/ESP32] ESP32 S3 虚拟摄像头播放 SPIFFS 内容

[复制链接]
这次带来一个好玩的ESP32 项目:虚拟摄像头,就是将ESP32S3 的板子烧录之后,系统中会出现一个USB摄像头,打开Camera后能够看到播放出来的视频。
下面介绍具体的实现方式。
目前Arduino ESP32 尚不支持 USBCamera,因此,这次的项目是基于IDF来完成的。特别注意:对于硬件有如下要求:
1.必须是ESP32 S2或者 S3,其他型号的ESP32目前不支持原生USB编程,所以只能使用 S2 或者 S3
2.必须带有PSRAM,因为这个项目是根据Demo修改而来,Demo要求带有PSRAM。我对编译环境不熟悉,这部分没有修改,理论上移除对于 Camera 的支持即可在没有 PSRAM 的板子上使用;
3.必须是 16MB ESP32 模块,如果想在更小容量的板子上使用,可以删除项目中的JPEG素材缩减体积,同时修改项目配置为 4MB 或者8MB.
如果你对ESP32IDF环境比较熟悉,可以修改去掉上面提到的2的限制;同样的,可以删除部分图片使得4MBESP32 也可以支持。如果你无法做到这两点,可以像我一样使用ESP32 S3 EYS 兼容版。

先介绍一下如何使用我的代码:
1.安装 ESP32IDF 编译环境
2.下载安装esp-iot-solution,解压后放在c:根目录下
3.尝试编译C:\esp-iot-solution\examples\usb\device\usb_webcam确保编译环境无误
4.基本的命令有
               a. 编译命令 idf.py build (特别注意编译时需要联网)
b.烧录 idf.py -p COM端口 flash
c.串口监视器 idf.py -p COM端口 monitor
d.上述指令可以放在一起,例如:
                               idf.py -p com6 build flash monitor
e.监视器可以使用 ctrl+] 退出
f.项目配置 idf.py menuconfig ()
5.usb_webcam1解压到C:\esp-iot-solution\examples\usb\device目录下
使用idf.py -p com6 build flash monitor 编译后会自动烧录然后打开串口监视器。
6.打开系统自带的相机程序,切换到ESP32摄像头即可看到播放内容
上面介绍了如何直接使用代码,接下来介绍一下项目基本实现原理。
1.     esp-iot-solution 提供了一个USB摄像头的例子。它将自己报告为一个USB相投设备,从板载的摄像头读取数据,然后从USB端口输出;
2.     我代码的修改是在上报数据中使用SPIFFS存放的数进行替换了摄像头的数据
3.     下面介绍一下 SPIFFS中存放的内容是如何制作的
a.     使用 Easy2Convert GIF to JPG 工具将GIF 每一帧转化为 JPG 格式

ESP32 S3  虚拟摄像头播放 SPIFFS 内容图1

b.     使用 XnView 处理上面的 JPG 文件。需要将所有的图片名为为 0000、0001…..0XXX这种名称;同样使用这个软件将所有的图片都修改为 320*240 大小。

ESP32 S3  虚拟摄像头播放 SPIFFS 内容图2

1.      4. 修改的代码主要部分在动作就是按照孙旭检查 SPIFFS 中,storage下面是否有XXXX.jpg这样的文件,如果有就读取出来作为摄像头数据上报,如果XXXX.JPG不存在,那么就说明读取完毕,再从 0000开始。
  1. static uvc_fb_t* camera_fb_get_cb(void *cb_ctx)
  2. {
  3.         s_fb.uvc_fb.timestamp.tv_usec++;
  4.        
  5.         char buffer[64];
  6.         struct stat file_stat;
  7.         int  filesize;
  8.         FILE *fd = NULL;
  9.         sprintf(buffer,"/storage/%04d.jpg",PicIndex);
  10.         ESP_LOGI(TAG, "p1 %s %d",buffer,PicIndex);
  11.                
  12.         if (stat(buffer, &file_stat) == -1) {
  13.                 PicIndex=0;
  14.                 ESP_LOGI(TAG, "ZivHer2");
  15.                 sprintf(buffer,"/storage/%04d.jpg",PicIndex);
  16.         } else {PicIndex++;}
  17.         fd = fopen(buffer, "rb");
  18.         ESP_LOGI(TAG, "ZivHer3");
  19.     fseek(fd, 0, SEEK_END);  
  20.     filesize = ftell(fd);  
  21.     rewind(fd);
  22.         ESP_LOGI(TAG, "send %d",filesize);
  23.         fread(&PicBuffer, 1, filesize, fd);
  24.         s_fb.uvc_fb.buf = PicBuffer;
  25.         s_fb.uvc_fb.len=filesize;
  26.         fclose(fd);
  27.         vTaskDelay(pdMS_TO_TICKS(100));
  28.     return &s_fb.uvc_fb;
  29. }
复制代码


zoologist  高级技匠
 楼主|

发表于 2023-11-2 09:10:29

工作的测试视频

回复

使用道具 举报

zoologist  高级技匠
 楼主|

发表于 2023-11-3 06:58:40

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail