【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡
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 帧/秒
【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡
【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 = 1// 帧缓冲区数量
};
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;
}
// 写入视频文件
videoFile.write(fb->buf, fb->len);// 写入图像数据
Serial.printf("写入帧 %d, 大小: %d 字节\n", frameNumber++, fb->len);
// 释放帧缓冲区
esp_camera_fb_return(fb);
delay(100);// 控制帧率
}
videoFile.close();
Serial.println("视频录制完成");
delay(10000);// 等待10秒后再次录制
}
【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡
实验串口返回情况【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡
打开SD卡,发现里面是13帧图片,不是视频格式【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡
修改后【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 = 1// 帧缓冲区数量
};
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帧标记
videoFile.write((const uint8_t*)"--frame\r\nContent-Type: image/jpeg\r\n\r\n", 36);
// 写入视频文件
videoFile.write(fb->buf, fb->len);// 写入图像数据
videoFile.write((const uint8_t*)"\r\n", 2);// 写入帧结束标记
Serial.printf("写入帧 %d, 大小: %d 字节\n", frameNumber++, fb->len);
// 释放帧缓冲区
esp_camera_fb_return(fb);
delay(100);// 控制帧率
}
videoFile.close();
Serial.println("视频录制完成");
delay(10000);// 等待10秒后再次录制
}
【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡
实验串口返回情况【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡
在电脑上打开SD卡,里面只有一个文件“video.mjpeg” ,大小只有116K,估计是无效文件.........【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡
修改代码【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秒后再次录制
}
【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡
实验串口返回情况录入的文件只有191K,仍是无效的
【花雕学编程】Arduino动手做(230)---拍摄3秒视频并存卡
{:6_202:}看来,需要再了解与测试,本实验待续..........这个实验最终成功了吗?我也在尝试视频录制保存SD卡,一直没有结果。 三清 发表于 2024-10-7 01:01
这个实验最终成功了吗?我也在尝试视频录制保存SD卡,一直没有结果。
{:6_202:}后面去研究别的板子了,呵呵,还没动
页:
[1]