修改代码 
 
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 
  实验二百三十:ESP32 CAM开发板 带OV2640摄像头模块 WIFI+蓝牙模块 
  项目实验之七:使用ESP32-CAM拍摄3秒的视频并将其保存到SD卡上(之三) 
 
实验开源代码 
 
- /*
 -   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
 -   实验二百三十:ESP32 CAM开发板 带OV2640摄像头模块 WIFI+蓝牙模块
 -   项目实验之七:使用ESP32-CAM拍摄3秒的视频并将其保存到SD卡上(之三)
 - */
 - 
 - #include "esp_camera.h"  // 引入ESP32摄像头库
 - #include "FS.h"  // 引入文件系统库
 - #include "SD_MMC.h"  // 引入SD卡库
 - 
 - // 摄像头引脚配置
 - camera_config_t config = {
 -   .pin_pwdn  = 32,  // 电源引脚
 -   .pin_reset = -1,  // 复位引脚(未使用)
 -   .pin_xclk = 0,  // XCLK引脚
 -   .pin_sscb_sda = 26,  // SCCB SDA引脚
 -   .pin_sscb_scl = 27,  // SCCB SCL引脚
 -   .pin_d7 = 35,  // 数据引脚D7
 -   .pin_d6 = 34,  // 数据引脚D6
 -   .pin_d5 = 39,  // 数据引脚D5
 -   .pin_d4 = 36,  // 数据引脚D4
 -   .pin_d3 = 21,  // 数据引脚D3
 -   .pin_d2 = 19,  // 数据引脚D2
 -   .pin_d1 = 18,  // 数据引脚D1
 -   .pin_d0 = 5,   // 数据引脚D0
 -   .pin_vsync = 25,  // VSYNC引脚
 -   .pin_href = 23,  // HREF引脚
 -   .pin_pclk = 22,  // PCLK引脚
 -   .xclk_freq_hz = 20000000,  // XCLK频率(20MHz)
 -   .ledc_timer = LEDC_TIMER_0,  // LEDC定时器
 -   .ledc_channel = LEDC_CHANNEL_0,  // LEDC通道
 -   .pixel_format = PIXFORMAT_JPEG,  // 像素格式为JPEG
 -   .frame_size = FRAMESIZE_QVGA,  // 帧大小为QVGA
 -   .jpeg_quality = 12,  // JPEG质量
 -   .fb_count = 2  // 帧缓冲区数量
 - };
 - 
 - void setup() {
 -   Serial.begin(115200);  // 初始化串口通信,波特率为115200
 -   Serial.println();
 - 
 -   // 初始化摄像头
 -   esp_err_t err = esp_camera_init(&config);
 -   if (err != ESP_OK) {
 -     Serial.printf("摄像头初始化失败,出现错误 0x%x", err);  // 输出初始化失败的错误信息
 -     return;
 -   }
 -   Serial.println("摄像头初始化成功!");
 - 
 -   // 初始化SD卡
 -   if (!SD_MMC.begin()) {
 -     Serial.println("SD卡挂载失败");
 -     return;
 -   }
 -   Serial.println("SD卡已挂载完成!");
 - }
 - 
 - void loop() {
 -   // 创建视频文件
 -   File videoFile = SD_MMC.open("/video.mjpeg", FILE_WRITE);
 -   if (!videoFile) {
 -     Serial.println("无法创建视频文件");
 -     return;
 -   }
 - 
 -   // 记录开始时间
 -   unsigned long startTime = millis();
 -   int frameNumber = 0;
 - 
 -   while (millis() - startTime < 3000) {  // 录制3秒
 -     // 获取摄像头的帧缓冲区
 -     camera_fb_t * fb = esp_camera_fb_get();
 -     if (!fb) {
 -       Serial.println("摄像头捕捉失败");
 -       videoFile.close();
 -       return;
 -     }
 - 
 -     // 写入MJPEG帧标记
 -     size_t written = videoFile.write((const uint8_t*)"--frame\r\nContent-Type: image/jpeg\r\n\r\n", 36);
 -     Serial.printf("写入帧标记,大小: %d 字节\n", written);
 -     // 写入视频文件
 -     written = videoFile.write(fb->buf, fb->len);  // 写入图像数据
 -     Serial.printf("写入图像数据,大小: %d 字节\n", written);
 -     written = videoFile.write((const uint8_t*)"\r\n", 2);  // 写入帧结束标记
 -     Serial.printf("写入帧结束标记,大小: %d 字节\n", written);
 -     Serial.printf("写入帧 %d, 大小: %d 字节\n", frameNumber++, fb->len);
 - 
 -     // 释放帧缓冲区
 -     esp_camera_fb_return(fb);
 - 
 -     delay(100);  // 控制帧率
 -   }
 - 
 -   videoFile.close();
 -   Serial.println("视频录制完成");
 -   delay(10000);  // 等待10秒后再次录制
 - }
 
  复制代码
  
 
 
 |