资讯动态

基于 esp32-camera 与 avi_video_process 组件的 AVI 视频录制器实现指南(ESP32 / ESP32-S3)

发布时间:2026/9/19 19:34:34 来源:尧图企业网站定制
物联网嵌入式驱动开发硬件开发【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址https://gitcode.com/GitHub_Trending/es/esp-iot-solution点击查看免费下载本文以 esp-iot-solution 仓库中的 video_recorder 示例 为骨架系统讲解如何在 ESP32 / ESP32-S3 开发板上使用 esp32-camera 驱动采集 JPEG 图像帧、写入 SD 卡并封装成 AVI 视频文件的完整链路同时覆盖 SDMMC/SPI 两种存储接口选型、menuconfig 配置、HTTP 文件服务器下载视频以及底层 AVI 封装原理。读完本文你将能够复现一个可录制、可回看、可下载的嵌入式视频录制器并理解其核心实现。示例概述一条摄像头帧 → SD 卡 → AVI 文件的完整链路video_recorder 是一个演示型示例核心目标是把摄像头拍摄的画面以 AVI 容器格式录制到 SD 卡中。其整体工作流为初始化 esp32-camera 驱动以 JPEG 像素格式、VGA 分辨率640×480采集帧缓冲挂载 SD 卡默认使用 SDMMC 外设FAT32 文件系统通过avi_recorder_start()启动录制任务循环取帧并把每帧 JPEG 数据按 AVI 容器格式写入 SD 卡录制结束后若开启了文件服务器配置会自动启动 HTTP 服务器用户可通过浏览器下载录制的 AVI 文件。示例源码结构如下对应 examples/camera/video_recorder 目录main/app_main.c主程序完成摄像头初始化、帧率测试、SD 卡挂载、录制启动main/file_manager.cSD 卡挂载/卸载封装支持 SDMMC 与 SPI 两种模式main/file_server.c基于 esp_http_server 的 HTTP 文件服务器支持下载、上传、删除main/Kconfig.projbuild全部例程配置项WiFi、SD 卡、文件服务器components/avi_video_process/avi_recorder.cAVI 录制器核心实现components/avi_video_process/avi_def.hAVI 容器格式的数据结构定义。关于 esp32-camera 驱动的整体工作流程可以参考上层 camera 示例目录 README摄像头传感器通过 DVP 并口把数据传输给 ESP 芯片初始化时分配若干frame_buffer应用通过esp_camera_fb_get()获取图像数据处理完毕后调用esp_camera_fb_return()归还帧缓冲以便复用——这正是本示例取帧回调的基础。硬件准备根据原文档说明运行本示例需要以下硬件一块带摄像头模块和 SD 卡槽的开发板如 ESP32-CAM、ESP32-S3-EYE 等一根用于供电与烧录的 USB 线一张 SD 卡插入开发板卡槽。需要注意不同开发板摄像头引脚不同需要在配置阶段指定芯片目标与摄像头型号见下文 menuconfig 配置。SD 卡接口与文件系统SDMMC / SPI、FAT32 与分配单元原文档对 SD 卡使用给出了三条关键注意事项示例源码与之严格对应Note 1SDMMC 与 SPI 双接口支持。默认使用 SDMMC Host 驱动初始化 SD 卡。SD 卡既可以在所有 ESP 芯片上通过 SPI 接口使用也可以在 ESP32 / ESP32-S3 上通过 SDMMC 接口使用。通过 menuconfig 中的CONFIG_EXAMPLE_USE_SDMMC_HOST选项切换启用该选项走 SDMMC禁用则走 SPI。从 file_manager.c 的源码可见宏定义与CONFIG_IDF_TARGET_ESP32S2等目标判断共同决定最终使用哪个驱动ESP32-S2 没有 SD Host 外设始终强制使用 SPI 模式。SPI 模式下的默认引脚映射在 file_manager.c 中定义MISOGPIO2、MOSIGPIO15、CLKGPIO14、CSGPIO13。Note 2仅支持 FAT32 文件系统。示例只能挂载 FAT32 格式化的卡片。如果卡片是 exFAT 或其他文件系统可以启用CONFIG_EXAMPLE_FORMAT_IF_MOUNT_FAILEDFormat the card if mount failed选项让代码在挂载失败时自动格式化。该选项对应 Kconfig.projbuild 中的EXAMPLE_FORMAT_IF_MOUNT_SDCARD_FAILED并最终映射到 file_manager.c 中挂载配置的format_if_mount_failed字段。Note 3推荐 4 线 SD 模式与较大分配单元。4 线模式能显著提升存储速率同时建议用较大的分配单元allocation unit size格式化卡片——大分配单元对读写性能更高但存储小文件时开销也更大。示例在 file_manager.c 中对非 S3-EYE 开发板默认配置了 4 线模式slot_config.width 4并明确标注了 MMC4/MMC1 两种接线对应的 ESP32 引脚以及 10kΩ 外部上拉的要求ESP32-S3-EYE 则使用 1 线模式。挂载配置中的allocation_unit_size默认设置为 32KB见 file_manager.c。注意一旦卡片在 SPI 模式下完成初始化不重新上电就无法直接在 SD 模式下重新初始化源码注释中明确提示了这一点切换接口模式前应先给设备断电。配置项目三步 menuconfig原文档给出了三个配置步骤step 1选择目标芯片并配置摄像头引脚。idf.py menuconfig - Camera Pin Configurationstep 2配置摄像头参数。idf.py menuconfig - component config - Camera Configuration这里需要按实际开发板选择摄像头型号如 AI-Thinker、WROVER-KIT、ESP-S3-EYE 等。示例的默认配置在 sdkconfig.defaults 中默认启用 OV2640 支持并选择 AI-Thinker 摄像头模块同时开启 PSRAM 支持——JPEG 帧缓冲放在 PSRAM 中才能支撑高分辨率连续采集CONFIG_OV2640_SUPPORTy CONFIG_CAMERA_MODEL_AI_THINKERy CONFIG_SPIRAM_SUPPORTy针对 ESP32-S3另有 sdkconfig.defaults.esp32s3 追加配置选择 ESP-S3-EYE 模块并开启 Octal PSRAM。step 3按需启用 HTTP 文件服务器等例程选项。idf.py menuconfig - Example ConfigurationExample Configuration菜单由 Kconfig.projbuild 定义包含三组选项配置项类型/默认值说明ESP_WIFI_SSIDstring默认空WiFi STA 的 SSID为空则关闭 STA 模式ESP_WIFI_PASSWORDstring默认空WiFi STA 密码WEP/WPA/WPA2ESP_WIFI_AP_SSIDstring默认ESP32-Camera创建的 AP 名称为空则关闭 AP 模式ESP_WIFI_AP_PASSWORDstring默认空AP 密码WPA2为空则为开放网络MAX_STA_CONNint默认 1AP 模式最大接入 STA 数ESP_WIFI_AP_CHANNELstring默认空AP 信道SERVER_IPstring默认192.168.4.1AP 接口 IP烧录后可用它访问摄像头ESP_MAXIMUM_RETRYint默认 5STA 重连最大重试次数EXAMPLE_HTTPD_CONN_CLOSE_HEADERbool默认 y发送Connection: close头及时释放服务器 socketEXAMPLE_FORMAT_IF_MOUNT_SDCARD_FAILEDbool默认 n挂载失败时自动格式化 SD 卡EXAMPLE_USE_SDMMC_HOSTbool默认 y仅 ESP32/ESP32-S3使用 SDMMC 挂载 SD 卡否则使用 SPIEXAMPLE_FILE_SERVER_ENABLEDbool默认 n录制结束后自动启动文件服务器供下载视频其中 WiFi 相关配置在 app_wifi.c 中生效若同时配置了 AP 与 STA 的 SSID 则进入 APSTA 模式仅配置其一则分别进入 AP 或 STA 模式均未配置则关闭 WiFi。文件服务器依赖 WiFi 连接其启动逻辑见 app_main.c先app_wifi_main()完成 WiFi 初始化再以 SD 卡挂载点为根目录启动 HTTP 服务器。构建、烧录与运行按原文档构建并烧录、打开串口监视器idf.py -p PORT flash monitor按Ctrl-]退出串口监视器。原文档给出了一个典型串口输出其中 16GB SDHC 卡连接、并启用了EXAMPLE_FILE_SERVER_ENABLEDI (855) ov2640: Set PLL: clk_2x: 0, clk_div: 0, pclk_auto: 0, pclk_div: 8 I (935) video_recorder: satrt to test fps I (1693) video_recorder: fps25.010317, image_average_size22142 I (1693) file manager: Initializing SD card I (1693) file manager: Using SDMMC peripheral I (1693) gpio: GPIO[39]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 I (1693) gpio: GPIO[38]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 I (1695) gpio: GPIO[40]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 Name: SC16G Type: SDHC/SDXC Speed: 20 MHz Size: 15193MB I (1755) avi recorder: Starting an avi [/sdcard/recorde.avi] I (21775) avi recorder: video info: width640 | height480 | fps25 I (21785) avi recorder: frame number502, size9482KB I (21849) avi recorder: avi recording completed这段日志的解读要点fps25.010317, image_average_size22142来自 app_main.c 中的camera_test_fps()——录制前先连续取 16 帧测试帧率与平均图像大小用于评估采集能力Using SDMMC peripheral表明启用了 SDMMC 模式对应源码 file_manager.cStarting an avi [/sdcard/recorde.avi]表示录制开始录制时长由avi_recorder_start()的第 6 个参数决定——示例代码传入10 * 220 秒见 app_main.c结束后打印视频信息width640、height480、fps25、总帧数与文件大小最终avi recording completed。通过浏览器下载视频录制完成后从串口日志记下设备获取的 IP原文档示例I (5424) example_connect: - IPv4 address: 192.168.1.100 I (5424) example_connect: - IPv6 address: fe80:0000:0000:0000:86f7:03ff:fec0:1620, type: ESP_IP6_ADDR_IS假设 IP 为 192.168.1.100若使用 AP 模式则访问 AP 接口 IP默认 192.168.4.1。在浏览器打开http://192.168.1.100/或http://192.168.1.100/index.html即可看到一个列出服务器上文件的 HTML 页面默认端口 80点击即可下载录制好的recorde.avi。文件服务器由 file_server.c 实现通过通配 URI 注册了三个处理接口GET /*下载或列目录、POST /upload/*上传、POST /delete/*删除下载时按扩展名设置 Content-Typefile_server.c并以 8KB scratch 缓冲区分段发送。深入源码AVI 录制器的封装原理AVI 录制器位于 components/avi_video_process/avi_recorder.c对外只暴露两个 API声明见 avi_recorder.hesp_err_t avi_recorder_start(const char *fname, int (*get_frame)(void **buf, size_t *len), int (*return_frame)(void *buf), uint16_t image_width, uint16_t image_high, uint32_t rec_time, bool block); void avi_recorder_stop(void);参数含义fname为视频文件名get_frame/return_frame是帧获取与归还回调image_width/image_high为图像宽高rec_time为录制时长秒block为真时阻塞等待录制完成。示例在 app_main.c 中实现了一对回调_get_frame调用esp_camera_fb_get()取出相机帧_return_frame通过__containerof还原帧指针并调用esp_camera_fb_return()归还。AVI 容器格式RIFF 结构、movi 块与 idx1 索引avi_def.h 完整定义了 AVI 容器所需的数据结构包括AVI_CHUNK_HEAD/AVI_LIST_HEADchunk 与 list 通用块头FourCC 长度AVI_AVIH_CHUNKavih主头记录每帧微秒间隔us_per_frame、总帧数、流数量、宽高等AVI_STRH_CHUNKstrh流头声明流类型vids视频流、编码器MJPG、帧率rate / scale fpsAVI_VIDS_STRF_CHUNKstrf格式块声明图像宽高、位深24 bit、压缩格式MJPGAVI_IDX1idx1索引条目记录每帧在文件中的偏移与长度。录制流程jpeg2avi_*系列函数分三个阶段jpeg2avi_start创建.avi文件和一个临时的.idx文件用于暂存每帧大小在内部 DRAM 申请16KB chunk 头的写入缓冲avi_recorder.c并把文件指针 lseek 到 movi 数据区起始位置随后 JPEG 帧从该位置向后追加写入jpeg2avi_add_frame为每帧构造00dc压缩视频数据chunk 头把帧数据按 4 字节对齐并以 16KB 为粒度批量写盘每帧把对齐后的大小追加写入.idx文件avi_recorder.c。以固定大小的块批量写入是为了减少小粒度write()的损耗、提升 SD 卡写入效率jpeg2avi_end把缓冲中残余数据写完读取.idx回填idx1索引块再回卷文件头写入 RIFF 头、hdrl列表与movi列表头最后删除临时.idx文件avi_recorder.c。录制任务运行在独立 FreeRTOS 任务中固定在 core 1优先级configMAX_PRIORITIES - 2见 avi_recorder.c循环取帧→写盘→归还直到达到rec_time或收到avi_recorder_stop()的强制结束信号。录制结束后还会依据nframes与实际耗时回算实际 fps 并写入 AVI 头。源码中还保留了一个USE_MULTI_FRAMES宏路径可一次性批量取多帧后再统一写盘用于进一步摊薄 SD 卡写入开销默认未启用。摄像头初始化与帧率评估摄像头初始化在 app_main.c 的camera_init()中完成关键参数包括xclk_freq_hz 20MHzOV2640 可用 10MHz 获得双倍帧率属实验性选项pixel_format PIXFORMAT_JPEG直接由摄像头硬件输出 JPEG省去软件压缩frame_size FRAMESIZE_VGA640×480jpeg_quality 90-63数值越低画质越高fb_count 88 个帧缓冲多于 1 个时 I2S 进入连续模式仅 JPEG 可用fb_location CAMERA_FB_IN_PSRAM帧缓冲放在 PSRAM。初始化完成后还会按传感器型号微调镜像/色彩参数app_main.c。原文档 Note 3 强调目前仅支持 JPEG 编码格式因此选用支持硬件 JPEG 编码的摄像头如 OV2640对获得流畅视频至关重要——这正是pixel_format直接设为PIXFORMAT_JPEG的原因。优化建议与注意事项综合原文档提示与源码实现在实际使用时值得注意以下几点优先 4 线 SD 模式4 线 SDMMC 模式带宽更高能匹配 25fps 量级的 VGA JPEG 写入需求若使用 1 线模式或 SPI 模式帧率或分辨率可能需要降低。合理选择分配单元大小FAT32 分配单元越大大块连续写入性能越好但对小文件如每帧 JPEG的额外开销也越大建议结合实际平均帧大小权衡。确保 SD 卡走线有上拉电阻file_manager.c 在挂载失败时会提示检查 SD 卡信号线上拉——4 线模式需要的 GPIO 15/2/4/12/13 应外接 10kΩ 上拉内部上拉仅够演示用途。帧缓冲放 PSRAMCAMERA_FB_IN_PSRAM配合多帧缓冲才能支撑连续采集未开启 PSRAM 时内存可能不足以支撑 8 个 VGA JPEG 帧缓冲。录制文件名与时长录制文件固定为/sdcard/recorde.aviapp_main.c如需修改文件名和录制时长直接调整app_main()中的文件路径与avi_recorder_start()的rec_time参数即可录制完成后通过文件服务器的 Delete 按钮也可清理 SD 卡上的历史视频。文件服务器上传限制服务器内置上传大小上限为 200KBfile_server.c主要用于页面脚本资源管理不影响通过浏览器下载大体积 AVI 文件。如需进一步了解摄像头驱动的初始化与帧缓冲工作流程、以及其他摄像头示例拍照、帧率测试、视频流服务器可参考 camera 示例目录 README 中给出的esp_camera_init、esp_camera_fb_get、esp_camera_fb_return等 API 说明与各个子示例的定位。赞分享物联网嵌入式驱动开发硬件开发【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址https://gitcode.com/GitHub_Trending/es/esp-iot-solution点击查看免费下载相关推荐xiaozhi-esp32 面包板 WiFi LCD Camera 板型实战基于 ESP32-S3 CAM 的 OV2640 视觉接入与编译指南xiaozhi esp32 面包板 WiFi LCD Camera 板型实战基于 ESP32 S3 CAM 的 OV2640 视觉接入与编译指南 本文人工智能大模型语音交互助手嵌入式物联网智能硬件MCP 服务Waveshare ESP32-S3-Touch-AMOLED-1.43C 开发板接入指南基于 xiaozhi-esp32 的编译、烧录与板级实现解析Waveshare ESP32 S3 Touch AMOLED 1.43C 开发板接入指南基于 xiaozhi esp32 的编译、烧录与板级实现解析 本文以人工智能大模型语音交互助手嵌入式物联网智能硬件MCP 服务xiaozhi-esp32 实战在 M5Stack AtomEchoS3R 上构建基于 ESP32-S3 的语音聊天机器人固件xiaozhi esp32 实战在 M5Stack AtomEchoS3R 上构建基于 ESP32 S3 的语音聊天机器人固件 本文以 xiaozhi esp人工智能大模型语音交互助手嵌入式物联网智能硬件MCP 服务创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价