wzwhahaha 2026-03-13 16:17 采纳率: 0%
浏览 2

ESP32 CAM录制视频保存问题

第一次接触ESP32,弄了个ESP32 CAM开发板,配了个OV5640摄像头,先测试的WIFI传输视频流,手机端查看实时的视频没有问题,就是分辨率不能太高,后来想用来录制视频并保存至SD卡,反复测试不是文件打不开就是有图像但卡住不动,但是拍照片保存都没问题,想问下是硬件本身配置不行吗,哪位同学了解或遇到过类似问题,能否帮解答一下,谢谢!!

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-03-13 16:18
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    你遇到的问题是关于 ESP32 CAM 录制视频并保存到 SD卡 时出现的文件无法打开、画面卡住等现象。这类问题在嵌入式开发中较为常见,可能涉及多个方面:硬件配置、驱动支持、文件系统、代码逻辑、存储介质稳定性 等。


    ✅ 一、问题分析

    1. 硬件限制

    • ESP32 CAM 的 主频和内存有限,处理高分辨率视频(如 640x480 或更高)可能会导致 CPU 负载过高
    • OV5640 摄像头模块 对 ESP32 的数据传输速度有一定要求,如果配置不当,可能导致帧率下降或丢帧。
    • SD 卡读写速度不足 也可能导致录制过程中出现卡顿或文件损坏。

    2. 软件/驱动问题

    • FFmpeg 或 OpenCV 支持不完整:ESP32 上通常没有完整的 FFmpeg 支持,视频编码需手动实现。
    • 文件系统格式不兼容:例如使用了 FAT32,但 SD 卡实际为 exFAT,会导致文件无法识别。
    • 文件写入方式错误:未正确关闭文件或未及时刷新缓存,可能导致文件损坏。

    3. 代码逻辑问题

    • 未正确初始化 SD 卡:比如未挂载文件系统或未检查 SD 卡是否就绪。
    • 视频流处理逻辑有误:例如未正确分帧、未设置合适的缓冲区大小。
    • 未正确释放资源:如未关闭文件或未释放内存,导致后续操作失败。

    ✅ 二、解决方案

    1. 确认硬件配置

    • 降低视频分辨率:尝试使用 320x240 或更低分辨率,减轻 CPU 压力。
    • 确保 SD 卡兼容性
      • 使用 高速 SD 卡(Class 10 或 U1)
      • 格式化为 FAT32,避免 exFAT。
    • 检查 SPI 接口连接:确保 SD 卡与 ESP32 的 SPI 引脚连接稳定。

    2. 优化视频录制代码

    ✅ 示例代码(基于 Arduino IDE)

    #include <FS.h>
    #include <SD.h>
    #include <WiFi.h>
    #include <esp_camera.h>
    
    // 定义摄像头参数
    #define PWDN_GPIO_NUM -1
    #define RESET_GPIO_NUM -1
    #define XCLK_GPIO_NUM 21
    #define SIOD_GPIO_NUM 26
    #define SIOC_GPIO_NUM 27
    #define Y9_GPIO_NUM 35
    #define Y8_GPIO_NUM 34
    #define Y7_GPIO_NUM 33
    #define Y6_GPIO_NUM 32
    #define Y5_GPIO_NUM 39
    #define Y4_GPIO_NUM 36
    #define Y3_GPIO_NUM 19
    #define Y2_GPIO_NUM 18
    #define Y1_GPIO_NUM 5
    #define Y0_GPIO_NUM 4
    #define HREF_GPIO_NUM 23
    #define PCLK_GPIO_NUM 22
    #define VSYNC_GPIO_NUM 25
    
    camera_config_t config;
    bool start_recording = false;
    
    void setup() {
      Serial.begin(115200);
    
      // 初始化摄像头
      config.ledc_channel = LEDC_CHANNEL_0;
      config.ledc_timer = LEDC_TIMER_0;
      config.pin_d0 = Y2_GPIO_NUM;
      config.pin_d1 = Y3_GPIO_NUM;
      config.pin_d2 = Y4_GPIO_NUM;
      config.pin_d3 = Y5_GPIO_NUM;
      config.pin_d4 = Y6_GPIO_NUM;
      config.pin_d5 = Y7_GPIO_NUM;
      config.pin_d6 = Y8_GPIO_NUM;
      config.pin_d7 = Y9_GPIO_NUM;
      config.pin_xclk = XCLK_GPIO_NUM;
      config.pin_pclk = PCLK_GPIO_NUM;
      config.pin_sscb_sda = SIOD_GPIO_NUM;
      config.pin_sscb_scl = SIOC_GPIO_NUM;
      config.pin_href = HREF_GPIO_NUM;
      config.pin_vsync = VSYNC_GPIO_NUM;
      config.pin_reset = RESET_GPIO_NUM;
      config.pin_pwdn = PWDN_GPIO_NUM;
    
      esp_err_t err = esp_camera_init(&config);
      if (err != ESP_OK) {
        Serial.printf("Camera init failed with error 0x%x", err);
        return;
      }
    
      // 初始化 SD 卡
      if (!SD.begin()) {
        Serial.println("SD card failed, or not present");
        return;
      }
      Serial.println("SD card initialized");
    
      // 开始录制
      start_recording = true;
    }
    
    void loop() {
      if (start_recording) {
        camera_fb_t *fb = NULL;
        fb = esp_camera_fb_get();
        if (!fb) {
          Serial.println("Camera capture failed");
          return;
        }
    
        File file = SD.open("/video.mp4", FILE_WRITE);
        if (!file) {
          Serial.println("Failed to open video file");
          return;
        }
    
        file.write(fb->buf, fb->len);  // 写入图像数据
        file.close();
    
        esp_camera_fb_return(fb);
        delay(100);  // 控制帧率
      }
    }
    

    ⚠️ 注意:以上代码仅为演示,不能直接用于视频录制,因为它只写入了图像数据,没有进行视频编码(如 H.264),导致生成的文件无法播放。


    3. 使用视频编码库(推荐)

    • 使用 ESP32-CAM Video Recorder 这样的开源项目,可以更方便地录制视频。
    • 或者使用 FFmpeg 的 C 语言版本(如 libavcodec)进行视频编码,但需要较高的开发能力。

    4. 调试建议

    • 查看串口输出:通过 Serial.println() 打印关键状态信息,判断录制过程是否出错。
    • 测试 SD 卡写入性能:使用简单的 SD.write() 测试写入速度,判断是否是 SD 卡问题。
    • 尝试小文件测试:先录制几帧图像,确认能否正常保存,再逐步增加数据量。

    ✅ 三、总结

    | 问题 | 解决方案 | |------|----------| | 视频文件无法打开 | 使用标准视频格式(如 MP4)并进行编码;使用开源库如 esp32-cam-video-recorder | | 图像卡住不动 | 降低分辨率、控制帧率、优化内存管理 | | SD 卡写入失败 | 检查 SD 卡兼容性、格式化为 FAT32、确保 SPI 接口稳定 | | 仅拍照正常 | 可能是视频编码或文件系统逻辑错误,需检查代码逻辑 |


    ✅ 四、推荐工具和库

    • ESP32-CAM Video Recorder: GitHub 项目地址
    • Arduino IDE + ESP32 Core: 提供基础开发环境
    • FFmpeg C 库(libavcodec): 用于视频编码(进阶)

    如果你能提供具体的代码片段或错误日志,我可以帮你进一步排查具体原因。希望这些建议对你有所帮助!

    评论

报告相同问题?

问题事件

  • 创建了问题 3月13日