ESP32-CAM_MJPEG2SD
ESP32 / ESP32S3与OV2640 / OV5640摄像头的应用程序,可将JPEG图像记录到SD卡上的AVI文件中,并以MJPEG流的形式回放到浏览器。AVI格式允许录像以正确的帧率在媒体播放器上播放。如果安装了麦克风,还会创建WAV文件并存储在AVI文件中。
该应用程序支持:
- 通过摄像头或PIR / 雷达传感器进行运动检测
- 延时录像
- 从I2S或PDM麦克风进行音频录制
- 摄像头平移/倾斜舵机和灯光控制
- 摄像头录制期间的遥测记录
- 摄像头安装车辆的远程控制
- 使用Telegram或电子邮件的警报通知
- 同时向网页浏览器和远程NVR流式传输
- 使用FTP、HTTPS、WebDAV传输录像,或从浏览器下载
- MQTT控制
- 外部心跳支持
- 支持外围设备:SG90舵机、MX1508 H桥、HW-504摇杆、BMP280、MPU9250、WS2812 LED
- 机器学习支持接口
- 摄像头集线器功能,可访问其他ESP32-CAM_MJPEG2SD设备
- 摄像测量功能,可捕获用于3D成像的照片
ESP32无法支持所有功能,因为它会耗尽堆空间。为了获得更好的功能和性能,请使用新的ESP32S3摄像头板之一,例如Freenove ESP32S3 Cam、ESP32S3 XIAO Sense。
这是一个复杂的应用程序,一些用户在应用程序报告警告时提出问题,但这是应用程序通知用户他们的设置存在问题,只有用户才能解决。请注意,一些克隆板的规格与原版不同,例如PSRAM大小。请只针对实际错误(ERR消息、未处理的库错误或崩溃)提出问题,或建议改进或增强功能。谢谢。
版本9.9.3的变更:
- 现在支持最新的MCPWM库(如果使用arduino core v3.x编译)
目的
该应用程序可以进行运动检测或延时录像。应用示例包括安全摄像头、野生动物监测、火箭飞行监测、FPV车辆控制。Max Imagination的这个教程展示了如何使用该代码的早期版本构建WiFi安全摄像头,以及后续关于如何安装和使用该应用程序的视频。
将一组JPEG保存为单个文件比保存为单独文件更快,也更易于管理,特别是对于小图像尺寸。实际速率取决于SD卡的质量和大小以及图像的复杂度和质量。一个标称为Class 6的无名4GB SDHC卡比真正的Sandisk 4GB SDHC Class 2卡慢3倍。以下录制速率是在AI Thinker OV2640板上使用新格式化的Sandisk 4GB SDHC Class 2卡,设置为最高JPEG质量和最高时钟速率下实现的。
[录制速率表格]
ESP32S3(使用搭载ESP32S3 N8R8模块的Freenove ESP32S3 Cam板)运行该应用程序的速度约为ESP32的两倍,主要是由于PSRAM速度更快。除UXGA(最大10fps)外,它可以以OV2640的最大帧率录制所有帧大小,包括音频。
设计
ESP32 Cam模块有4MB的PSRAM(ESP32S3上为8MB),用于缓冲摄像头帧和构建AVI文件,以最小化SD文件写入次数,并通过与SD卡扇区大小对齐来优化写入。回放时,AVI从SD读入多个扇区大小的缓冲区,并作为定时的单个帧发送到浏览器。SD卡使用MMC 1线模式,因为这几乎与MMC 4线模式一样快,并释放了引脚4(连接到板载灯)和引脚12,后者可用于例如PIR。
AVI文件使用日期时间格式YYYYMMDD_HHMMSS命名,并添加帧大小、FPS录制速率、持续时间(秒),例如20200130_201015_VGA_15_60.avi,存储在每日文件夹YYYYMMDD中。如果包含音频,文件名以_S结尾。如果有遥测数据,文件名以_M结尾。 ESP32时间从NTP服务器或连接的浏览器客户端设置。
安装
将github文件下载到Arduino IDE草图文件夹,去掉应用程序文件夹名称中的-master
。
如果使用arduino core v3.x编译,请至少使用v3.0.3,其中包含网络修复。
除非使用默认设置之一,否则使用appGlobals.h
中的CAMERA_MODEL_
选择所需的ESP-CAM板:
- ESP32 Cam板 -
CAMERA_MODEL_AI_THINKER
- Freenove ESP32S3 Cam板 -
CAMERA_MODEL_ESP32S3_EYE
选择ESP32或ESP32S3 Dev Module板,并启用PSRAM编译,使用以下分区方案:
- ESP32 -
Minimal SPIFFS (...)
- ESP32S3 -
8M with spiffs (...)
注意:如果遇到编译错误,需要使用Boards Manager在IDE中更新arduino-esp32
核心库到最新的v2.x或v3.x版本
注意:如果遇到错误:Startup Failure: Check SD card inserted
或Camera init error 0x105
,通常是摄像头板选择问题
注意:如果遇到错误:Camera init error 0xffffffff
,是因为一些摄像头板只有2MB PSRAM,不足以运行此应用程序。
首次安装时,应用程序将以WiFi AP模式启动 - 连接到SSID:ESP-CAM_MJPEG_...,以允许通过192.168.4.1
上的网页输入路由器和密码详细信息。配置数据文件(除密码外)将自动创建,当有互联网连接时,应用程序网页将自动从GitHub下载到SD卡的**/data**文件夹。
后续对应用程序或**/data文件夹文件的更新可以使用OTA Upload选项卡进行。也可以使用Edit Config选项卡上的Reload /data按钮或使用WebDAV客户端从GitHub重新加载/data**文件夹。 @ldijkman 描述了一种替代安装过程,详见此处。
浏览器功能仅在 Chrome 上进行了全面测试。
主要功能
录像可以通过摄像头自身检测到的动作触发,或者通过将特定引脚保持高电平(松开时由内部下拉电阻保持低电平)来触发,例如使用有源高电平的运动传感器,如 PIR 或 RCWL-0516 微波雷达。 此外,还可以使用网页上的开始录像按钮手动请求录像。
要回放录像,使用回放和文件传输侧边栏按钮选择日期文件夹,然后选择所需的 AVI 文件。 选择 AVI 文件后,按开始回放按钮回放录像。 开始串流按钮只显示摄像头的实时视频流。
然后可以将录像上传到 FTP 或 HTTPS 服务器,或下载到浏览器中,在媒体应用程序(如 VLC)中回放。
还提供了延时摄影功能,可以与动作捕捉同时进行。延时文件的格式为 20200130_201015_VGA_15_60_T.avi
其他功能和配置
可以通过使用主网页动态修改应用程序的操作,大部分应该是不言自明的。
连接:
- FTP / HTTPS、WiFi、SMTP 和时区参数可以在访问设置侧边栏按钮中定义。
- 对于时区,使用下拉菜单,或从此处的第二列粘贴值
- 要使更改永久生效,请按保存按钮
- mdns 名称服务,以便使用
http://[主机名]
而不是 IP 地址。
要更改录像参数:
分辨率
是每帧的像素大小帧率
是所需的每秒帧数质量
是 JPEG 压缩的级别,影响图像大小。
SD 存储管理:
- 可以通过从下拉列表中选择所需的文件或文件夹,然后按删除按钮并确认来删除文件夹或文件夹内的文件。
- 可以通过从下拉列表中选择所需的文件或文件夹,然后按文件上传按钮,通过 FTP / HTTPS 将文件夹或文件夹内的文件上传到远程服务器。可以以 AVI 格式上传。
- 使用下载按钮将选定的 AVI 文件从 SD 卡下载到浏览器。
- 当卡上可用空间不足时,删除或上传并删除最旧的文件夹。
通过网页查看应用程序日志,使用显示日志选项卡显示:
- 选择要显示的日志类型:
- RTC RAM:保存在 RTC RAM 中的循环 7KB 日志(默认)
- Websocket:通过 websocket 动态输出的日志
- SD 卡:保存到 SD 卡的无限大小日志
- 使用滑块启用 SD 日志记录,但可能会降低录像速度
- 使用按钮刷新或清除选定的日志
配置网页
通过编辑配置选项卡访问更多配置详情,该选项卡显示以下按钮:
WiFi: 其他 WiFi 和网络服务器设置。
运动: 参见摄像头运动检测部分。
外围设备,例如:
- 选择是否使用 PIR 或雷达传感器(也可以与摄像头运动检测并行使用)。
- 夜间 PIR 检测时自动开启灯。
- 控制摄像头的平移/倾斜支架。
- 连接 PDM 或 I2S 麦克风。
- 连接 DS18B20 温度传感器。
- 在 ADC 引脚上监控电池电源电压。
- 夜间深度睡眠后通过光敏电阻唤醒。
请注意,ESP32 摄像头模块上没有足够的空闲引脚来允许使用所有外部传感器。可以使用的引脚(有一些限制)是:3、4、12、13、33。
- 引脚 3:标记为 U0R。仅用作输入引脚,因为也用于刷写。
- 引脚 4:也用于板载灯。可以通过移除其限流电阻来禁用灯。
- 引脚 12:仅用作输出引脚。
- 引脚 13:弱上拉。
- 引脚 33:由板载红色 LED 使用。未引出,但可以通过移除其相邻的标记为 3V3 的电阻和红色 LED 的限流电阻,然后在 VCC 引脚和红色 LED 电阻焊接片之间连接一根线来重新利用原本无用的 VCC 引脚。
还可以使用 ESP32-IO_Extender 存储库。
ESP32S3 Freenove 板可以通过其空闲引脚支持上述所有外围设备。 ESP32S3 XIAO Sense 板的空闲引脚较少,但比 ESP32 多。
板载 LED:
- ESP32:灯 4,信号 33。
- ESP32S3:
- Freenove:灯 48,信号 2。
- XIAO:灯 不适用,信号 21。
其他: SD、电子邮件、电报等管理。
当启用或禁用某个功能时,应使用保存按钮使更改永久生效,并使用重启 ESP按钮重启 ESP。
摄像头运动检测
可以通过摄像头自身使用 motionDetect.cpp
文件检测运动来生成 AVI 录像。
从摄像头获取任意大小的 JPEG 图像,并对 N 张图像中的 1 张进行实时采样,将其解码为非常小的灰度位图图像,与前一个样本进行比较以检测运动。小尺寸提供平滑处理以去除伪影并减少处理时间。
对于运动检测,使用 1/2 的高采样率。当检测到运动时,检查运动停止的频率降低到 1/10,以便可以以较小的开销捕获 JPEG。检测时间毫秒表显示了从 OV2640 摄像头检索帧并进行解码和分析的典型时间(以毫秒为单位)。
默认启用摄像头运动检测,要禁用请在运动检测和录像侧边栏按钮中取消勾选启用运动检测。
摄像头索引页面提供了其他选项,其中:
运动灵敏度
设置运动检测的阈值,越高越敏感。显示运动
如果启用并按下开始串流按钮,将显示运动检测的图像以进行校准。显示灰度图像,红色像素表示运动。最小帧数
是要捕获的最小帧数,如果少于此数量,文件将被删除。
音频录制
ESP32 和 ESP32S3 都支持 I2S 麦克风,如 INMP441。PDM 麦克风(如 MP34DT01)仅在 ESP32S3 上支持。音频录制在 ESP32S3 上运行良好,但在 ESP32 上不可行,因为它会显著降低帧率。
音频格式为 16 位单声道 PCM,采样率为 16kHz。I2S 麦克风需要 3 个空闲引脚,PDM 麦克风需要 2 个空闲引脚(I2S SCK 引脚必须设置为 -1)。引脚值(XIAO Sense 预定义)和使用麦克风选择器在配置网页的外围设备按钮下设置。
网页上有一个麦克风增益滑块。值越高,增益越高。选择0取消麦克风。
OV5640
OV5640 的引脚排列与为 OV2640 设计的板子兼容,但电源电压对内部 1.5V 稳压器来说太高,因此除非使用散热器,否则摄像头会过热。
出于录像目的,OV5640 应仅与 ESP32S3 板一起使用。由于内存限制,FHD
以上的帧大小应仅用于静态图像。
OV5460 在 ESP32S3 上最高帧大小的可录制帧率为:
帧大小 | FPS |
---|---|
QXSGA | 4 |
WQXGA | 5 |
QXGA | 5 |
QHD | 6 |
FHD | 6 |
P_FHD | 6 |
OV3660尚未经过测试。
MQTT
要启用MQTT,在编辑配置->其他选项卡下,填写以下字段:
要连接的MQTT服务器IP
MQTT主题路径前缀
- 可选填写
MQTT用户名
和MQTT用户密码
- 然后设置
启用MQTT
如果配置不为空且ping成功,MQTT将自动连接。
它会在/status频道向MQTT代理发送消息,如录制开启/关闭、移动检测开启/关闭等。
主题:homeassistant/sensor/ESP-CAM_MJPEG_904CAAF23A08/status -> {"MOTION":"ON", "TIME":"10:07:47.560"}
您还可以在/cmd频道发布控制命令来控制摄像头。
主题:homeassistant/sensor/ESP-CAM_MJPEG_904CAAF23A08/cmd -> dbgVerbose=1;framesize=7;fps=1
外部心跳
由@alojzjakob贡献,另见https://github.com/alojzjakob/EspSee
允许通过路由器端口转发,在单个动态IP下访问多个摄像头。另一个限制是避免使用DDNS,因为在给定的路由器上很难或不可能设置。 您将能够轻松构建包含JSON发送到服务器/网站的数据的摄像头列表。
要启用外部心跳,在编辑配置->其他选项卡下,填写以下字段:
心跳接收器域名或IP
(例如www.espsee.com)心跳接收器URI
(例如/heartbeat/)心跳接收器端口
(ssl用443,非ssl用80,或您的自定义端口)- 可选填写
心跳接收器认证令牌
(如果您使用EspSee,它将为您的用户帐户提供认证令牌) - 然后设置
启用外部心跳服务器
心跳将每30秒(默认)发送一次。它会向定义的域名/URI(例如www.mydomain.com/my-esp32cam-hub/index.php)发送POST请求,包含JSON正文,其中包含您可能需要的特定应用程序的有用信息。
如果您使用EspSee,它会向定义的域名/URI(例如https://www.espsee.com/heartbeat/?token=[your_token])发送POST请求,包含JSON正文,其中包含有关您的摄像头的有用信息,允许该网站将其连接到您的用户帐户并提供一种轻松访问您的摄像头的方式,无需DDNS。
如果您想从同一外部IP(路由器后)访问多个摄像头,可能需要进行端口转发并相应设置EspSee摄像头条目的端口。
端口转发
要通过互联网远程访问应用程序,请在路由器上为HTTP端口的浏览器设置端口转发,例如:
在远程设备上,输入URL:your_router_external_ip:10880
要获取your_router_external_ip
值,可以使用:https://api.ipify.org
为ESP摄像头设备设置静态IP地址。
为了安全起见,应在访问设置侧边栏按钮中定义认证设置。
遥测记录
由于ESP32的性能和内存限制,此功能在ESP32S3摄像头板上使用效果更好。
在摄像头录制期间可以捕获环境和运动数据等遥测数据(例如来自GY-91板上的BMP280和MPU9250)。它存储在单独的CSV文件中,以便在电子表格中呈现。CSV文件以相应的AVI文件命名。还会创建一个与相应AVI文件同名的字幕(SRT)文件。CSV和SRT文件会随相应的AVI文件一起上传或删除。下载时,AVI、CSV和SRT文件会打包成一个zip文件。如果SRT文件与AVI文件在同一文件夹中,媒体播放器将显示遥测数据字幕。
用户需要在telemetry.cpp
文件中添加所需传感器的代码。包含GY-91板的简单示例。
要开启遥测记录,请在外围设备按钮下选择使用遥测记录
选项。数据收集频率由遥测收集间隔(秒)
设置。
注意:如果使用Adafruit传感器库,esp-camera库存在冲突。
Telegram机器人
只启用Telegram或SMTP电子邮件中的一个。
使用IDBot获取您的聊天ID。
使用BotFather创建Telegram机器人并获取机器人令牌。
在编辑配置页面的其他选项卡下,粘贴Telegram聊天标识符
和Telegram机器人令牌
,然后选择使用Telegram机器人
。
您可能希望将机器人设为私密。
请注意,由于TLS,此功能会使用大量堆空间。
Telegram机器人现在将接收来自应用程序的移动警报,显示录制的帧,并带有包含相关录制(最大50MB)命令链接的标题,可以下载和播放。
远程控制
提供安装摄像头的设备的远程控制,例如用于FPV等的遥控车辆。 最好与ESP32-S3一起使用,以获得更好的帧率和控制响应。
要启用,在编辑配置页面的外围设备下,选择启用远程控制
。
这将显示一个额外的配置按钮RC配置。
按下RC配置按钮可以定义以下引脚:
- SG90型转向舵机
- H桥电机控制(已测试MX1508)
- 开/关灯
- 车辆控制的其他参数
转向可以通过舵机控制提供,也可以通过单独控制左右侧电机的履带转向提供。
流媒体视图现在左上角会有一个红色按钮。按下此按钮可显示/隐藏叠加的转向和电机控制。可以使用摄像头视图按钮切换到全屏。有线车辆也可以通过HW-504型操纵杆控制。可以记录摄像头视图(如果启用了麦克风和遥测,也可以记录)。 事先应禁用移动检测。
仅在您熟悉编码和电子学,并且能够自行解决问题时才使用此功能
机器学习
机器学习AI可用于进一步判断是否在发生移动检测时保存录制,方法是分类帧中的对象是否感兴趣,例如人类、动物类型、车辆等。
由于内存使用和内置AI加速支持,仅在ESP32S3上可行。
仅在您熟悉机器学习时才使用此功能
该接口设计为与Edge Impulse AI平台打包为Arduino库的用户模型一起工作。
更多详情请参见motionDetect.cpp
。
使用96x96灰度或RGB图像,并使用以下传输学习神经网络设置训练模型:
摄像头集线器
此选项卡允许访问其他ESP32-CAM_MJPEG2SD摄像头设备的Web界面。要显示此选项卡,在编辑配置页面的其他下,选择显示摄像头集线器选项卡
。
在选项卡中,输入另一台摄像头的IP地址并按下添加IP按钮,将显示一个显示该摄像头图像的屏幕,并在图像上叠加其IP地址。对每个需要监控的摄像头重复此操作。点击图像可打开该摄像头的网页。
按图像上的X图标可删除该IP地址。按全部删除按钮可删除所有IP地址。按刷新按钮可用每个摄像头的最新图像更新每个屏幕。
IP地址存储在浏览器本地存储中,而不是应用程序本身。
流式传输到NVR
由于ESP32的性能和内存限制,此功能在ESP32S3摄像头板上使用效果更佳。
远程NVR可以捕获独立于网页浏览器的流。要启用这些流,在编辑配置->运动选项卡下,选择:
在/sustain?video=1启用视频流
用于MJPEG流在/sustain?audio=1启用音频流
用于WAV流(需要事先设置麦克风)。在/sustain?srt=1启用字幕流
用于SRT流(需要事先设置遥测,否则只会输出时间戳)。
然后保存并重启。
如果启用了多个流,需要使用中间工具进行同步处理,例如go2rtc(但它暂时?不处理字幕)。有关go2rtc配置示例,请参见ESP32-CAM_Audio。如果在流式传输期间发生录制,录制将优先进行,流可能会出现卡顿。
WebDAV
包含了一个简单的WebDAV服务器。可以使用WebDAV客户端(如Windows文件资源管理器)访问和管理SD卡内容。在文件夹的地址栏中输入<ip地址>/webdav
,例如192.168.1.132/webdav
对于Android、MacOS、Linux,请参见webDav.cpp
文件。
摄影测量
ESP可用于捕获小物体的一系列照片,控制步进电机驱动的转盘,使用ESP摄像头拍摄低分辨率图像,或使用ESP远程控制的DSLR相机拍摄高分辨率图像。捕获的图像可用于生成3D模型。
要启用此功能,在编辑配置页面的外围设备下,选择启用摄影测量
。
这将显示一个额外的配置按钮PG配置。按下此按钮将显示控制摄影测量过程的选项。
有关更多信息,请参见photogram.cpp
。