Skip to content

ESP32摄像头延时摄影

延时摄影是将一系列按固定间隔拍摄的照片合成为视频的技术,常用来展示肉眼难以察觉的变化或自然环境的动态过程。本文将尝试使用ESP32-CAM(Ai-Thinker)开发板来制作延时摄影作品。

若希望通过编程实现定时拍摄并将照片保存到SD卡,需要具备一定的ESP32编程基础。可以参考入门教程:使用Arduino IDE开发ESP32摄像头

这里,我们选择一种不需要编程的简便方法——使用 Node-Camera 固件(在线安装)。Node-Camera使用说明 详解介绍了固件功能。

通过固件实现定时拍摄,只需要以下几步简单设置:

  1. 在系统设置界面的 Feature 标签中启用SD卡支持。

  2. Capture 标签中启用定时抓拍(Timing Trigger),设置间隔(例如5秒),并启用 Save to SD Card 选项。

  3. 保存并重启使设置生效。然后进入设置界面,在 Tools 标签中打开 Timing,固件即以设置的间隔拍照并保存到SD卡中。要停止拍摄时,关闭 Timing 即可。拍摄的照片可以在SD卡界面查看。

完成拍摄后,需要将照片合成为视频。最直接的方式是取出SD卡,将照片复制到电脑上,用视频编辑软件进行合成。网上有许多类似教程可供参考。

我们将使用一种看似稍微复杂,实际上更高效的方法——借助脚本自动完成以下两步:

  1. 通过Wi-Fi网络从SD卡下载所有照片(无需取出SD卡)。
  2. 将下载的照片合成为视频。

脚本是一种简洁实用的自动化方式,其本身不实现复杂功能,但脚本可以调用外部程序,并将这些程序的功能串联起来完成特定任务。

在这里,我们的脚本会调用两个外部程序:

  • curl - 用于下载照片。
  • ffmpeg - 用于合成视频。

这两个程序都不需要安装,将下载的zip文件解压到指定目录即可。

假设将curl解压到D:\curl,ffmpeg解压到D:\ffmpeg,目录结构如下:

为了让脚本能够调用这些程序,需要将程序的可执行文件路径添加到Windows环境变量Path中。

完成以上步骤之后,打开命令行窗口执行:curl -Vffmpeg -version,若正确显示版本信息,说明配置成功。

最终脚本可以在 这里下载。建议将其解压到单独目录(例如D:\lapse)。其中包含三个脚本文件:

  • lapse.cmd – 下载照片并合成视频。
  • download.cmd – 仅下载照片到指定目录。
  • order.cmd – 将照片按拍摄顺序重命名为连续编号。ffmpeg要求合成视频的照片文件名序号必须连续,而我们可能会剔除一些不需要的照片,使得序号不连续。该脚本可重新整理文件名为符合ffmpeg要求的序列。

执行脚本前,请根据实际情况修改脚本中的变量,包括Node-Camera的IP地址、保存下载照片的目录和输出视频文件名。

lapse.cmd
bat
@echo off
setlocal enabledelayedexpansion

:: 替换IP为Node-Camera的实际IP
set "host=http://192.168.1.100"

:: 保存下载照片的本地目录
set "localpath=photos"

:: 输出视频文件名
set "output=out.mp4"
...

脚本可以通过命令行执行,也可双击运行。

若不需要对照片做进一步处理,直接执行lapse.cmd即可自动下载照片并合成视频。以下视频由5秒间隔拍摄的250张照片合成。

  • 为保持合成视频的色彩与明暗连贯,建议在Node-Camera摄像头设置中关闭自动白平衡(AWB)或选择固定模式,同时关闭自动曝光(AEC),根据环境亮度手动设置曝光量(Exposure)。
  • 在启动拍摄之前,建议在设置界面的 Tools 标签中重置文件名序列号(Reset SEQ),让照片从IMG_0000.JPG开始顺序命名,方便后续处理。

也可以先执行download.cmd将SD卡中的照片下载到本地目录,对照片做进一步处理后,再执行order.cmd重新编号,然后通过命令行使用ffmpeg合成视频:

ffmpeg -framerate 24 -i "photos\IMG_%04d.JPG" -c:v libx264 -pix_fmt yuv420p out.mp4

最后,脚本文件带有详细的注释,或许你想要扩展一下。