ESP32-CAM视频流
3.ESP32-CAM 简介
ESP32-CAM是一个非常小的摄像头模块,带有ESP32-S芯片,成本不到10美元。您可以阅读 ESP32-CAM 入门指南,了解如何使用视频流和人脸识别示例。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6SgdKenO-1644497165666)(https://i1.wp.com/randomnerdtutorials.com/wp-content/uploads/2019/03/ESP32-CAM-camera.jpg?resize=750%2C421&quality=100&strip=all&ssl=1)]
视频流服务器
按照以下步骤,使用 ESP32-CAM 构建视频流 Web 服务器,您可以在本地网络上访问该服务器。
1. 安装 ESP32 附加组件
在这个例子中,我们使用 Arduino IDE 对 ESP32-CAM 开发板进行编程。因此,您需要安装 Arduino IDE 以及 ESP32 附加组件。请按照以下教程之一安装 ESP32 附加组件(如果尚未安装):
- 在 Arduino IDE 中安装 ESP32 开发板(Windows 指令)
- 在 Arduino IDE 中安装 ESP32 开发板(Mac 和 Linux 说明)
2. 视频流网络服务器代码
之后,将以下代码复制到您的Arduino IDE。
/*********Rui SantosComplete project details at https://RandomNerdTutorials.com/esp32-cam-video-streaming-web-server-camera-home-assistant/IMPORTANT!!! - Select Board "AI Thinker ESP32-CAM"- GPIO 0 must be connected to GND to upload a sketch- After connecting GPIO 0 to GND, press the ESP32-CAM on-board RESET button to put your board in flashing modePermission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files.The above copyright notice and this permission notice shall be included in allcopies or substantial portions of the Software.
*********/#include "esp_camera.h"
#include <WiFi.h>
#include "esp_timer.h"
#include "img_converters.h"
#include "Arduino.h"
#include "fb_gfx.h"
#include "soc/soc.h" //disable brownout problems
#include "soc/rtc_cntl_reg.h" //disable brownout problems
#include "esp_http_server.h"//Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";#define PART_BOUNDARY "123456789000000000000987654321"// This project was tested with the AI Thinker Model, M5STACK PSRAM Model and M5STACK WITHOUT PSRAM
#define CAMERA_MODEL_AI_THINKER
//#define CAMERA_MODEL_M5STACK_PSRAM
//#define CAMERA_MODEL_M5STACK_WITHOUT_PSRAM// Not tested with this model
//#define CAMERA_MODEL_WROVER_KIT#if defined(CAMERA_MODEL_WROVER_KIT)#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 39#define Y6_GPIO_NUM 36#define Y5_GPIO_NUM 19#define Y4_GPIO_NUM 18#define Y3_GPIO_NUM 5#define Y2_GPIO_NUM 4#define VSYNC_GPIO_NUM 25#define HREF_GPIO_NUM 23#define PCLK_GPIO_NUM 22#elif defined(CAMERA_MODEL_M5STACK_PSRAM)#define PWDN_GPIO_NUM -1#define RESET_GPIO_NUM 15#define XCLK_GPIO_NUM 27#define SIOD_GPIO_NUM 25#define SIOC_GPIO_NUM 23#define Y9_GPIO_NUM 19#define Y8_GPIO_NUM 36#define Y7_GPIO_NUM 18#define Y6_GPIO_NUM 39#define Y5_GPIO_NUM 5#define Y4_GPIO_NUM 34#define Y3_GPIO_NUM 35#define Y2_GPIO_NUM 32#define VSYNC_GPIO_NUM 22#define HREF_GPIO_NUM 26#define PCLK_GPIO_NUM 21#elif defined(CAMERA_MODEL_M5STACK_WITHOUT_PSRAM)#define PWDN_GPIO_NUM -1#define RESET_GPIO_NUM 15#define XCLK_GPIO_NUM 27#define SIOD_GPIO_NUM 25#define SIOC_GPIO_NUM 23#define Y9_GPIO_NUM 19#define Y8_GPIO_NUM 36#define Y7_GPIO_NUM 18#define Y6_GPIO_NUM 39#define Y5_GPIO_NUM 5#define Y4_GPIO_NUM 34#define Y3_GPIO_NUM 35#define Y2_GPIO_NUM 17#define VSYNC_GPIO_NUM 22#define HREF_GPIO_NUM 26#define PCLK_GPIO_NUM 21#elif defined(CAMERA_MODEL_AI_THINKER)#define PWDN_GPIO_NUM 32#define RESET_GPIO_NUM -1#define XCLK_GPIO_NUM 0#define SIOD_GPIO_NUM 26#define SIOC_GPIO_NUM 27#define Y9_GPIO_NUM 35#define Y8_GPIO_NUM 34#define Y7_GPIO_NUM 39#define Y6_GPIO_NUM 36#define Y5_GPIO_NUM 21#define Y4_GPIO_NUM 19#define Y3_GPIO_NUM 18#define Y2_GPIO_NUM 5#define VSYNC_GPIO_NUM 25#define HREF_GPIO_NUM 23#define PCLK_GPIO_NUM 22
#else#error "Camera model not selected"
#endifstatic const char* _STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY;
static const char* _STREAM_BOUNDARY = "\r\n--" PART_BOUNDARY "\r\n";
static const char* _STREAM_PART = "Content-Type: image/jpeg\r\nContent-Length: %u\r\n\r\n";httpd_handle_t stream_httpd = NULL;static esp_err_t stream_handler(httpd_req_t *req){camera_fb_t * fb = NULL;esp_err_t res = ESP_OK;size_t _jpg_buf_len = 0;uint8_t * _jpg_buf = NULL;char * part_buf[64];res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE);if(res != ESP_OK){return res;}while(true){fb = esp_camera_fb_get();if (!fb) {Serial.println("Camera capture failed");res = ESP_FAIL;} else {if(fb->width > 400){if(fb->format != PIXFORMAT_JPEG){bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len);esp_camera_fb_return(fb);fb = NULL;if(!jpeg_converted){Serial.println("JPEG compression failed");res = ESP_FAIL;}} else {_jpg_buf_len = fb->len;_jpg_buf = fb->buf;}}}if(res == ESP_OK){size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len);res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen);}if(res == ESP_OK){res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len);}if(res == ESP_OK){res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY));}if(fb){esp_camera_fb_return(fb);fb = NULL;_jpg_buf = NULL;} else if(_jpg_buf){free(_jpg_buf);_jpg_buf = NULL;}if(res != ESP_OK){break;}//Serial.printf("MJPG: %uB\n",(uint32_t)(_jpg_buf_len));}return res;
}void startCameraServer(){httpd_config_t config = HTTPD_DEFAULT_CONFIG();config.server_port = 80;httpd_uri_t index_uri = {.uri = "/",.method = HTTP_GET,.handler = stream_handler,.user_ctx = NULL};//Serial.printf("Starting web server on port: '%d'\n", config.server_port);if (httpd_start(&stream_httpd, &config) == ESP_OK) {httpd_register_uri_handler(stream_httpd, &index_uri);}
}void setup() {WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detectorSerial.begin(115200);Serial.setDebugOutput(false);camera_config_t config;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_vsync = VSYNC_GPIO_NUM;config.pin_href = HREF_GPIO_NUM;config.pin_sscb_sda = SIOD_GPIO_NUM;config.pin_sscb_scl = SIOC_GPIO_NUM;config.pin_pwdn = PWDN_GPIO_NUM;config.pin_reset = RESET_GPIO_NUM;config.xclk_freq_hz = 20000000;config.pixel_format = PIXFORMAT_JPEG; if(psramFound()){config.frame_size = FRAMESIZE_UXGA;config.jpeg_quality = 10;config.fb_count = 2;} else {config.frame_size = FRAMESIZE_SVGA;config.jpeg_quality = 12;config.fb_count = 1;}// Camera initesp_err_t err = esp_camera_init(&config);if (err != ESP_OK) {Serial.printf("Camera init failed with error 0x%x", err);return;}// Wi-Fi connectionWiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("");Serial.println("WiFi connected");Serial.print("Camera Stream Ready! Go to: http://");Serial.print(WiFi.localIP());// Start streaming web serverstartCameraServer();
}void loop() {delay(1);
}
查看原始代码
在上传代码之前,您需要在以下变量中插入您的网络凭据:
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
然后,确保选择正确的相机模块。在这种情况下,我们使用的是AI-THINKER模型。
如果您使用相同的相机模块,则无需更改代码上的任何内容。
#define CAMERA_MODEL_AI_THINKER
现在,您可以将代码上传到 ESP32-CAM 开发板。
3. 上传代码
使用 FTDI 编程器将 ESP32-CAM 板连接到计算机。按照下一个逻辑示意图进行操作:
许多FTDI编程器都有一个跳线,允许您选择3.3V或5V。确保跳线位于正确的位置以选择5V。
重要: GPIO 0 要连接 GND 才能上传代码
ESP32-CAM | FTDI Programmer |
---|---|
GND | GND |
5V | VCC (5V) |
U0R | TX |
U0T | RX |
GPIO 0 | GND |
要上传代码,请按照以下步骤操作:
1) 转到工具>板,然后选择 AI-Thinker ESP32-CAM。
2) 转到**“工具”**>端口",然后选择 ESP32 连接到的 COM 端口。
3)然后,单击上传按钮以上传代码。
4) 当您开始在调试窗口中看到这些点(如下所示)时,请按 ESP32-CAM 板载 RST 按钮。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8pqloSI0-1644497165672)(https://i0.wp.com/randomnerdtutorials.com/wp-content/uploads/2019/12/dots-uploading-code.png?resize=828%2C75&quality=100&strip=all&ssl=1)]
几秒钟后,代码应成功上传到您的开发板。
获取 IP 地址
上传代码后,断开连接GPIO 0从加拿大国民民主盾.以波特率为115200打开串行显示器。按 ESP32-CAM 板载复位按钮。
ESP32 IP 地址应打印在串行监视器中。
访问视频流服务器
现在,您可以在本地网络上访问摄像机流服务器。打开浏览器并输入 ESP32-CAM IP 地址。应加载包含当前视频流的页面。
在浏览器中输入IP即可访问
ESP32-CAM视频流相关推荐
- esp32 cam 配网 实现视频传输
esp32 cam 1.实现配网 1.1.WiFiManager使用 2.视频传输 2.1 .修改代码 2.2 .配网操作 2.3 .查看视频 实现功能首先默认连接代码里面写入的WiFi信息,如果 ...
- esp32 cam工作电流_我如何在家工作:Cam的生产力之痛
esp32 cam工作电流 Telecommuting is becoming more and more common these days, with many tech writers (mys ...
- ESP32 CAM与服务器(python)UDP视频传输
ESP32 CAM Arduino代码 #include "esp_camera.h" #include <WiFi.h> #include "AsyncUD ...
- esp32 cam 从安装、烧录到成为webcam详细教程
前言:本教程仅适用于ESP32-CAM开发板且带下载主板的这种情况. 一.安装arduino 1.arduino下载地址: ''' https://www.arduino.cc/en/Main/Sof ...
- esp32 cam接入homekit苹果家庭app
mac平台esp32 cam接入homekit苹果家庭app 一.准备: 1.esp32-cam模块,串口工具 2.brew 二.开始吧 1.安装一些工具 sudo easy_install pip ...
- esp32 cam 1.44寸TFT彩屏 ST7735S驱动 TFT_eSPI库驱动
ESP32 CAM引脚与TFT1.44(ST7735S)引脚接线 ESP32 CAM TFT 1.44 5V VCC GND GND GND NC NC 5V BLC D14 SCL D15 SDA ...
- ESP32 CAM下载程序踩过的吭
最近几天想玩一下ESP32 CAM,做个简单的摄像头,今天终于不再报错了,特别记录一下,方便自己也方便他人. 说明一下cam自闪光灯是4号IO口,高电平亮 digitalWrite(4, HIGH); ...
- 基于ESP32 CAM的人脸识别考勤系统
概述:使用 ESP32 CAM 的人脸识别考勤系统 本教程介绍了使用ESP32 CAM 模组的人脸识别考勤系统.我们将为此应用程序使用OpenCV和Visual Studio .OpenCV 是一个开 ...
- 自行编译micropython固件刷入ESP32 cam,并测试拍照及图传
一.环境准备 1.Ubuntu20.04LTS 2.ESP-IDF 3.micropython 操作步骤 1.安装基于Windows的linux子系统 适用于 Linux 的 Windows 子系统安 ...
- stm32/esp32/cam智能安防系统远程视频监控物联网远程传输视频图像GSM短信报警
系统实现了智能安防报警系统设计,人体感应报警,烟雾报警,GSM短信报警,同时支持远程视频监控功能,安卓端app端远程查看视频流.实物展示视频 基于stm32单片机ESP32智能安防系统远程 ...
最新文章
- python画柱状图代码-python绘制双柱形图代码实例
- 如何使用echo.js实现图片的懒加载(整理)
- 【计算理论】计算复杂性 ( 非确定性图灵机的时间复杂度 | 非确定性图灵机 与 确定性图灵机 的时间复杂度 之间的关系 )
- 2018年中国研究生数学建模竞赛C题 二等奖 赛题论文
- Django(part32)--一对一映射
- Android应用开发—FragmentManager如何管理fragments
- Codeforces 436D Pudding Monsters
- 数据科学包12-实例1:股票数据分析
- hdu 1251(字典树)
- 在iPhone任何界面截图完整图文教程
- 移动网站建设应注意哪些问题?
- 【ONE·Linux || 权限 】
- SpringBoot 与 Kotlin 完美交融
- mysql触发器——NEW与OLD aes_encrypt AES_DECRYPT
- 目标检测yolo, voc, coco的BBox格式转换
- 微服务-高并发-思路
- 我是云南的云南怒江的是什么梗 我是云南的云南怒江的梗出处
- 微信小程序与后端Java接口交互-图书搜索实现
- 红米4手机(其它小米应该一样)adb 调试(usb ,tcp)
- css template download