修改代码
【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秒后再次录制
- }
复制代码
|