426浏览
查看: 426|回复: 11

[项目] 【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡

[复制链接]
【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡图1

ESP32-Cam 是一款运行在 ESP32-S 芯片上并使用 OV2640 摄像头的小型摄像头模块。ESP32_Cam 也可以 OV7670 摄像头,但 OV2640 更好(更高的分辨率和内置的 JPEG 编码,这消除了 ESP32-S 的处理任务)。
ESP-32 Cam 规格ESP-32 系列
它支持 Wi-Fi (802.11b/g/n)
支持蓝牙 (4.2 带 BLE)
内置 LED 闪光灯
9 个 IO 端口
支持 UART、SPI、I2C 和 PWM
内置 micro SD 读卡器
输入电源:3.3V / 5V(据报道,5V 供电比 3.3V 更稳定)
OV2640 摄像头
2 百万像素
阵列尺寸:UXGA (1600 x 1200)
镜头尺寸:1/4 英寸(6.35 毫米)
最大图像传输速率:15 帧/秒

驴友花雕  中级技神
 楼主|

发表于 2024-9-7 08:22:40

【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡

  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百三十:ESP32 CAM开发板 带OV2640摄像头模块 WIFI+蓝牙模块
  项目实验之七:使用ESP32-CAM拍摄3秒的视频并将其保存到SD卡上

实验开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百三十:ESP32 CAM开发板 带OV2640摄像头模块 WIFI+蓝牙模块
  4.   项目实验之七:使用ESP32-CAM拍摄3秒的视频并将其保存到SD卡上
  5. */
  6. #include "esp_camera.h"  // 引入ESP32摄像头库
  7. #include "FS.h"  // 引入文件系统库
  8. #include "SD_MMC.h"  // 引入SD卡库
  9. // 摄像头引脚配置
  10. camera_config_t config = {
  11.   .pin_pwdn  = 32,  // 电源引脚
  12.   .pin_reset = -1,  // 复位引脚(未使用)
  13.   .pin_xclk = 0,  // XCLK引脚
  14.   .pin_sscb_sda = 26,  // SCCB SDA引脚
  15.   .pin_sscb_scl = 27,  // SCCB SCL引脚
  16.   .pin_d7 = 35,  // 数据引脚D7
  17.   .pin_d6 = 34,  // 数据引脚D6
  18.   .pin_d5 = 39,  // 数据引脚D5
  19.   .pin_d4 = 36,  // 数据引脚D4
  20.   .pin_d3 = 21,  // 数据引脚D3
  21.   .pin_d2 = 19,  // 数据引脚D2
  22.   .pin_d1 = 18,  // 数据引脚D1
  23.   .pin_d0 = 5,   // 数据引脚D0
  24.   .pin_vsync = 25,  // VSYNC引脚
  25.   .pin_href = 23,  // HREF引脚
  26.   .pin_pclk = 22,  // PCLK引脚
  27.   .xclk_freq_hz = 20000000,  // XCLK频率(20MHz)
  28.   .ledc_timer = LEDC_TIMER_0,  // LEDC定时器
  29.   .ledc_channel = LEDC_CHANNEL_0,  // LEDC通道
  30.   .pixel_format = PIXFORMAT_JPEG,  // 像素格式为JPEG
  31.   .frame_size = FRAMESIZE_QVGA,  // 帧大小为QVGA
  32.   .jpeg_quality = 12,  // JPEG质量
  33.   .fb_count = 1  // 帧缓冲区数量
  34. };
  35. void setup() {
  36.   Serial.begin(115200);  // 初始化串口通信,波特率为115200
  37.   Serial.println();
  38.   // 初始化摄像头
  39.   esp_err_t err = esp_camera_init(&config);
  40.   if (err != ESP_OK) {
  41.     Serial.printf("摄像头初始化失败,出现错误 0x%x", err);  // 输出初始化失败的错误信息
  42.     return;
  43.   }
  44.   Serial.println("摄像头初始化成功!");
  45.   // 初始化SD卡
  46.   if (!SD_MMC.begin()) {
  47.     Serial.println("SD卡挂载失败");
  48.     return;
  49.   }
  50.   Serial.println("SD卡已挂载完成!");
  51. }
  52. void loop() {
  53.   // 创建视频文件
  54.   File videoFile = SD_MMC.open("/video.mjpeg", FILE_WRITE);
  55.   if (!videoFile) {
  56.     Serial.println("无法创建视频文件");
  57.     return;
  58.   }
  59.   // 记录开始时间
  60.   unsigned long startTime = millis();
  61.   int frameNumber = 0;
  62.   while (millis() - startTime < 3000) {  // 录制3秒
  63.     // 获取摄像头的帧缓冲区
  64.     camera_fb_t * fb = esp_camera_fb_get();
  65.     if (!fb) {
  66.       Serial.println("摄像头捕捉失败");
  67.       videoFile.close();
  68.       return;
  69.     }
  70.     // 写入视频文件
  71.     videoFile.write(fb->buf, fb->len);  // 写入图像数据
  72.     Serial.printf("写入帧 %d, 大小: %d 字节\n", frameNumber++, fb->len);
  73.     // 释放帧缓冲区
  74.     esp_camera_fb_return(fb);
  75.     delay(100);  // 控制帧率
  76.   }
  77.   videoFile.close();
  78.   Serial.println("视频录制完成");
  79.   delay(10000);  // 等待10秒后再次录制
  80. }
复制代码



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-9-7 08:24:00

【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡

实验串口返回情况

【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-9-7 08:41:53

【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡

打开SD卡,发现里面是13帧图片,不是视频格式

【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-9-7 09:06:57

【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡

修改后
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百三十:ESP32 CAM开发板 带OV2640摄像头模块 WIFI+蓝牙模块
  项目实验之七:使用ESP32-CAM拍摄3秒的视频并将其保存到SD卡上(之二)

实验开源代码

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



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-9-7 09:08:43

【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡

实验串口返回情况

【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-9-7 09:12:22

【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡

在电脑上打开SD卡,里面只有一个文件“video.mjpeg” ,大小只有116K,估计是无效文件.........
【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-9-7 09:20:05

【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡

修改代码

  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百三十:ESP32 CAM开发板 带OV2640摄像头模块 WIFI+蓝牙模块
  项目实验之七:使用ESP32-CAM拍摄3秒的视频并将其保存到SD卡上(之三)

实验开源代码

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



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-9-7 09:23:30

【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡

实验串口返回情况

【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡图1

录入的文件只有191K,仍是无效的
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-9-7 09:53:30

【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡

看来,需要再了解与测试,本实验待续..........
回复

使用道具 举报

三清  学徒

发表于 2024-10-7 01:01:16

这个实验最终成功了吗?我也在尝试视频录制保存SD卡,一直没有结果。
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-10-7 11:48:43

三清 发表于 2024-10-7 01:01
这个实验最终成功了吗?我也在尝试视频录制保存SD卡,一直没有结果。

后面去研究别的板子了,呵呵,还没动
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail