如何用 ESP32-CAM 做一个实时视频流服务器
文章目录
- ESP32-CAM 概述
- ESP32-S 处理器
- 内存
- Camera 模块
- MicroSD 卡槽
- 天线
- 板载 LED 和闪光灯
- 其他
- 数据手册和原理图
- ESP32-CAM 功耗
- ESP32-CAM 引脚参考
- 引脚排列
- GPIO 引脚
- 哪些 GPIO 可以安全使用?
- GPIO 0 引脚
- MicroSD 卡引脚
- ESP32-CAM 的烧录方式
- 使用 ESP32-CAM-MB 编程器(推荐)
- 使用 FTDI 适配器
- 基于 ESP32-CAM 实时视频流服务器
- 选择主板
- 测试开发板
- 实时视频流服务器
ESP32-CAM 是一款于 2019 年初上市的开发板,它的出现惊艳了一众嵌入式开发爱好者,不到 35 元的价格,就可以获得一台支持摄像头和 SD 卡的 ESP32。毫无疑问,ESP32-CAM 是一款功能强大的设备,唯一的缺点可能是,ESP32-CAM 的 IO 引脚较少,其中一些与 SD 卡共享,因此在插入 SD 卡时部分 IO 引脚无法使用,因此很难围绕它设计项目。
当然,这个模块非常简约小巧,无论是检测人脸、解码车牌,还是仅仅需要一个安全摄像头,都值得在 DIY 工具箱中拥有一席之地。

ESP32-CAM 概述
ESP32-CAM 的核心是安信可科技(Ai-Thinker)的 ESP32-S 系统级芯片。作为系统级芯片,ESP32-S 芯片在单个芯片上包含微处理器、RAM、存储和外围设备。虽然该芯片的功能令人印象深刻,但 ESP32-CAM 开发板增加了更多功能,下面我们逐一看一下每个组件。
ESP32-S 处理器
ESP32-CAM 搭载了安信可科技的 ESP32-S 表面贴装印刷电路板模块。它相当于乐鑫的 ESP-WROOM-32 模组(外形尺寸和通用规格相同)。

ESP32-S 包含一个 Tensilica Xtensa® LX6 微处理器,带有两个 32 位内核,运行频率高达 240 MHz,这就是 ESP32-S 适用于视频处理、面部识别甚至人工智能等密集型任务的原因。
内存
内存对于复杂任务至关重要,因此 ESP32-S 具有完整的 520 KB 内部 RAM,与芯片的其他组件位于同一芯片上。

520 KB RAM 可能不足以完成 RAM 密集型任务,因此 ESP32-CAM 包括 4 MB 的外部 PSRAM1(Pseudo Static Random Access Memory,伪静态随机存取存储器)来扩展内存容量,这个容量对于密集的音频或图形处理已经足够了。
为了有足够的存储空间来存储程序和数据,ESP32-S 芯片还包含 4 MB 的片上闪存(Flash Memory)。
Camera 模块
ESP32-CAM 上的 OV2640 摄像头传感器使其有别于其他 ESP32 开发板,非常适合用于视频门铃或保姆摄像头等视频项目。

OV2640 摄像机的分辨率为 200 万像素,相当于最大 1600×1200 像素,这对于许多监控应用来说已经足够了。
同时,ESP32-CAM 也兼容 esp32-camera 上列出的各种摄像头传感器。
MicroSD 卡槽
在 ESP32-CAM 上增加一个 microSD 卡插槽,可以用于数据记录器或图像捕获。

天线
ESP32-CAM 配有板载 PCB 走线天线以及用于连接外部天线的 u.FL 连接器。天线选择跳线是一个零欧电阻,默认是板载 PCB 走线天线,如果要切换成外部天线,需要用电烙铁把零欧电阻焊接在另一个焊盘上。

一般用 PCB 天线用于试验 ESP32-CAM ,尤其是靠近路由器时效果最好(安信可科技称 PCB 天线的增益为 2.1dBi)。但一些离离路由器较远的项目,可能会遇到视频流缓慢和其他连接问题。在这种情况下,可以使用带有 IPX 连接器的 2.4GHz 外部天线,需要更改天线跳线以启用 u.FL 连接器。

三个焊盘位于 u.FL 连接器旁边以及板载天线和 ESP32-S 的金属外壳之间,一个零欧电阻器连接顶部的两个焊盘,只需将零欧电阻取下并焊在下面焊盘即可。
板载 LED 和闪光灯
ESP32-CAM 有一个白色的方形 LED,是一个板载的相机闪光灯,也可用于一般照明,引脚为 GPIO 4,输出高电平点亮闪光灯。背面有一个小的红色 LED,可用作状态指示灯(可编程),引脚为 GPIO 33,输出低电平点亮 LED。

其他
数据手册和原理图
有关 ESP32-CAM 的更多信息,请参阅:
ESP32-CAM 原理图
OV2640 Camera 数据手册
[!CAUTION]
ESP32-CAM 的数据手册在线链接已经失效了(原链接:https://docs.ai-thinker.com/_media/esp32/docs/esp32-cam_product_specification_zh.pdf),希望安信可科技官方能尽快解决这个问题。
ESP32-CAM 功耗
ESP32-CAM 的功耗范围从不流式传输视频时的 80 mAh 到流式传输视频时的 100~160 mAh 左右,如果打开闪光灯后,功耗可以达到 270 mAh。
ESP32-CAM 引脚参考
引脚排列
ESP32-CAM 共有 16 个引脚。为方便起见,具有相似功能的 pin 被组合在一起。引脚分配如下:

GPIO 引脚
ESP32-S 芯片共有 32 个 GPIO 引脚,但由于其中许多引脚在内部用于摄像头和 PSRAM,因此 ESP32-CAM 只有 10 个 GPIO 引脚可用。通过对适当的寄存器进行编程,可以为这些引脚分配各种外设功能,例如 UART、SPI、ADC 和 Touch等。

哪些 GPIO 可以安全使用?
下表显示了哪些引脚可以安全使用,哪些引脚应谨慎使用:
[!IMPORTANT]
⭕️ – 可以放心使用的引脚;
❗️ – 需要谨慎使用的引脚;
❌ – 建议不使用的引脚。
| 标签 | GPIO | 使用建议 | 原因 |
|---|---|---|---|
| IO0 | 0 | ❗️ | 启动时必须为 HIGH,下载代码时必须为 LOW |
| U0T | 1 | ❌ | UART0 的发送引脚,用于烧录和调试 |
| IO2 | 2 | ❗️ | 开机时必须为 LOW,当有 microSD 卡时不能使用 |
| U0R | 3 | ❌ | UART0 的接受引脚,用于刷写和调试 |
| IO4 | 4 | ❗️ | 连接到板载闪光灯,当有 microSD 卡时无法使用 |
| IO12 | 12 | ❗️ | 开机时必须为 LOW,当有 microSD 卡时不能使用 |
| IO13 | 13 | ❗️ | 当有 microSD 卡时无法使用 |
| IO14 | 14 | ❗️ | 当有 microSD 卡时无法使用 |
| IO15 | 15 | ❗️ | 启动时必须为 HIGH,如果拉低则会阻止启动日志的输出,当有 microSD 卡时无法使用 |
| IO16 | 16 | ⭕️ | |
| 板载 LED | 33 | ⭕️ |
GPIO 0 引脚
GPIO 0 是最重要的引脚。它确定 ESP32 是否处于下载模式。
该 GPIO 在启动时必须为高电平,在下载模式时必须为低电平。该引脚在内部有一个 10KΩ 的电阻上拉。如果要下载程序到开发板上,需要把该引脚拉低,即短接到 GND,使开发板进入下载模式,即可烧录程序。烧录程序完成后,断开与 GND 的短接,引脚被拉回高电平,进而重启开发板。
MicroSD 卡引脚
以下引脚用于连接 MicroSD 卡,如果不使用 MicroSD 卡,可以将这些引脚用作常规输入和输出。

ESP32-CAM 的烧录方式
对 ESP32-CAM 进行编程可能会有点麻烦,因为它没有内置的 USB 端口,用户需要额外的硬件才能程序下载到开发板上。过程不复杂,但很不方便。
一般有两种下载方式,一种是用 ESP32-CAM-MB 编程器,另一种是 FTDI 适配器或者 USB-to-TTL 模块。
使用 ESP32-CAM-MB 编程器(推荐)
一般在购买 ESP32-CAM 的时候,卖家都会推荐再买一个 ESP32-CAM-MB 的小型附加子板,如下图:

这个编程器板载了一个 CH340G USB 转串口芯片,不仅可以烧写程序,还可以与电脑进行串口通信。此外,还有附带了 RESET 按钮(与 ESP32-CAM 的复位按钮并联)、BOOT 按钮(连接在 GPIO 0,按下时可将 GPIO 0 下拉到低电平)、电源指示灯 LED 和稳压器,可为 ESP32-CAM 提供充足的电力。
按下图的安装方式,把 ESP32-CAM 安装进 ESP32-CAM-MB,下载程序时,按住 ESP32-CAM-MB 上的 BOOT 按钮,直到程序下载完成再松开。

使用 FTDI 适配器
如果在购买 ESP32-CAM 时,没有附购 ESP32-CAM-MB,那么就需要用 FTDI 适配器下载程序了。接线方式如下:

许多 FTDI 编程器都有一个跳帽,可在 3.3V 和 5V 之间进行切换。由于 ESP32-CAM 供电为 5V,请确保跳线设置为 5V。
另外,下载程序时,需要将 GPIO 0 引脚短接在 GND,下载完成后,必须断开才能正常运行。
基于 ESP32-CAM 实时视频流服务器
选择主板
ESP32-CAM 开发板在 Arduino IDE 有单独的选项,如下图所示,选择 “AI Thinker ESP32-CAM” 即可。

Arduino IDE 2.0以上版本可以直接搜索设置,如下图:

测试开发板
先用一个点亮闪光灯的程序测试一下开发板,如下:
#define CAMERA_FLASH 4void setup()
{pinMode(CAMERA_FLASH, OUTPUT);
}void loop()
{digitalWrite(CAMERA_FLASH, HIGH);delay(1000);digitalWrite(CAMERA_FLASH, LOW);delay(2000);
}
把程序下载到开发板上运行,如果闪光灯按预设的亮一秒、熄灭两秒的规律运行,说明开发板正常。
实时视频流服务器
这个程序不需要我们亲自编写,如下图操作,乐鑫官方为用户提供了一个示例,就是实时视频流服务器的示例程序。

该例程使 ESP32-CAM 成为功能齐全的网络摄像头,具有人脸检测和大量自定义选项等功能。不过这个例程不能直接下载到 ESP32-CAM,需要做一些修改。Arduino IDE 的例程为只读文件,是不允许直接修改的,所以我们需要把例程另存为用户文档,直接操作另存为即可,这里不做演示。
因为 ESP32-CAM 使用的是 AI-Thinker 模型,所以要取消注释 CAMERA_MODEL_AI_THINKER 这个宏定义,并注释所有其他模型。

接下来,需要将 ESP32-CAM 连接到WiFi,把 WiFi 名称和密码都写在下面两个变量即可。

修改好即可编译上传到开发板,以波特率 115200 打开串行监视器,然后按 ESP32-CAM 上的重置按钮。稍等一会就可以在 Serial Monitor 中看到 IP 地址。

启动浏览器并输入串行监视器上显示的 IP 地址。确保 Web 浏览器与 ESP32-CAM 在同一网络上。ESP32-CAM 应显示一个网页。按下网页的 Start Stream 按钮,即可开始推送视频流。

可以在左侧窗格中尝试各种摄像机设置。例如,可以更改视频的分辨率和帧速率,以及其亮度、对比度、饱和度等。点击 Get Still 按钮拍照,图像会下载到计算机。
PSRAM 的全称是 Pseudo Static Random Access Memory(伪静态随机存取存储器)。它采用 1T1C(一个晶体管和一个电容器)的架构,类似于 DRAM,但外部接口与 SRAM 相同,提供类似 SRAM 的简单接口和驱动方式。PSRAM 结合了 SRAM 的高速和 DRAM 的高容量特性,适用于需要大容量存储且要求高速访问的场景。 ↩︎
相关文章:
如何用 ESP32-CAM 做一个实时视频流服务器
文章目录 ESP32-CAM 概述ESP32-S 处理器内存Camera 模块MicroSD 卡槽天线板载 LED 和闪光灯其他数据手册和原理图ESP32-CAM 功耗 ESP32-CAM 引脚参考引脚排列GPIO 引脚哪些 GPIO 可以安全使用?GPIO 0 引脚MicroSD 卡引脚 ESP32-CAM 的烧录方式使用 ESP32-CAM-MB 编程…...
Centos7 解决Maven scope=system依赖jar包没有打包到启动jar包中的问题(OpenCV-4.10)
最近项目中遇到问题,OpenCV的Jar包在程序打包后,找不到相关的类,比如MAT,这个时候怀疑OpenCV_4.10的Jar没有和应用程序一起打包,后面排查到确实是没有打包进去,特此记录,便于日后查阅。 <!-- 加载lib目录下的opencv包 --> <dependency><groupId>org…...
iOS实际开发中使用Alamofire实现多文件上传(以个人相册为例)
引言 在移动应用中,图片上传是一个常见的功能,尤其是在个人中心或社交平台场景中,用户经常需要上传图片到服务器,用以展示个人风采或记录美好瞬间。然而,实现多图片上传的过程中,如何设计高效的上传逻辑并…...
如何将分割的mask转为为分割标签
将分割的mask转换为分割标签通常涉及将每个像素的类别标识(在mask中以不同的灰度值或颜色表示)转换为整数标签。这些标签通常用于机器学习或深度学习模型的训练、验证和测试阶段。 使用方式,控制台或者命令行使用以下命令: pyth…...
【动手学电机驱动】STM32-MBD(5)Simulink 模型开发之 PWM 输出
STM32-MBD(1)安装 Simulink STM32 硬件支持包 STM32-MBD(2)Simulink 模型部署入门 STM32-MBD(3)Simulink 状态机模型的部署 STM32-MBD(4)Simulink 状态机实现按键控制 STM32-MBD&…...
MySQL进阶突击系列(05)突击MVCC核心原理 | 左右护法ReadView视图和undoLog版本链强强联合
2024小结:在写作分享上,这里特别感谢CSDN社区提供平台,支持大家持续学习分享交流,共同进步。社区诚意满满的干货,让大家收获满满。 对我而言,珍惜每一篇投稿分享,每一篇内容字数大概6000字左右&…...
vue2日历组件
这个代码可以直接运行,未防止有组件库没安装,将组件库的代码,转成文字了 vue页面 <template><div class"about"><div style"height: 450px; width: 400px"><div style"height: 100%; overflo…...
【PyQt】多行纯文本框
[toc]qt多行纯文本框 QPlainTextEdit QPlainTextEdit 是可以多行的纯文本编辑框 文本浏览框 内置了一个** QTextDocument **类型的对象 ,存放文档。 1.信号:文本被修改 当文本框中的内容被键盘编辑,被点击就会发出 textChanged 信号&…...
workerman5.0篇〡异步非阻塞协程HTTP客户端
概述 workerman/http-client 是一个异步http客户端组件。所有请求响应异步非阻塞,内置连接池,消息请求和响应符合PSR7规范。 Workerman 5.0 版本中的异步HTTP协程客户端组件是一个基于PHP协程的高性能HTTP客户端,它能够充分利用PHP的异步特…...
JavaScript 延迟加载的方法( 7种 )
JavaScript脚本的延迟加载(也称为懒加载)是指在网页的主要内容已经加载并显示给用户之后,再加载或执行额外的JavaScript代码。这样做可以加快页面的初始加载速度,改善用户体验,并减少服务器的压力。 以下是几种常见的延…...
python+pymysql
python操作mysql 一、python操作数据库 1、下载pymysql 库, 方法一:pip3 install pymysql 或pip install pymysql 方法二:在pycharm中setting下载pymysql 2、打开虚拟机上的数据库 3、pymysql连接 dbpymysql.Connection(host&qu…...
基于 Selenium 实现上海大学校园网自动登录
基于 Selenium 实现上海大学校园网自动登录 一、技术方案 核心工具: Selenium:一个用于自动化测试的工具,能够模拟用户在浏览器上的操作。Edge WebDriver:用于控制 Edge 浏览器的驱动程序。 功能设计: 检测网络状…...
啥!GitHub Copilot也免费使用了
文章目录 前言免费版直接修复代码多文件上下文Agent模式总结 前言 最近,GitHub 给开发者们带来了一个好消息:他们的 AI 编程助手 GitHub Copilot 现在可以免费使用了!以前,每个月要花 10 美元才能享受的服务,现在对所…...
Spring配置文件中:密码明文改为密文处理方式(通用方法)
目录 一、背景 二、思路 A) 普通方式 B) 适合bootstrap.properties方式 三、示例 A) 普通方式(连接Redis集群) A) 普通方式(连接RocketMQ) B) 适合bootstrap.properties方式 四、总结 一、背景 SpringBoot和Sprin…...
Linux下ext2文件系统
文章目录 一 :penguin:基本概述二 :star: ext2文件系统:star: 1. :star:Boot Block(引导块)位置与作用 三 Block Group(块组):star:1.:star: Super Block(超级块):star:2.:star: Group Descriptor(块组描述符):star:…...
BUUCTF:web刷题记录(1)
目录 [极客大挑战 2019]EasySQL1 [极客大挑战 2019]Havefun1 [极客大挑战 2019]EasySQL1 根据题目以及页面内容,这是一个sql注入的题目。 直接就套用万能密码试试。 admin or 1 # 轻松拿到flag 换种方式也可以轻松拿到flag 我们再看一下网页源码 这段 HTML 代码…...
【微服务】面试题 6、分布式事务
分布式事务面试题讲解 一、问题背景与解决方案概述 因微服务项目涉及远程调用可能引发分布式事务问题,需解决。主流解决方案有阿里 Seata 框架(含 XA、AT、TCC 模式)和 MQ。 二、Seata 框架关键角色 事务协调者(TC)&…...
【2024年华为OD机试】(C卷,100分)- 分割均衡字符串 (Java JS PythonC/C++)
一、问题描述 题目描述 均衡串定义:字符串中只包含两种字符,且这两种字符的个数相同。 给定一个均衡字符串,请给出可分割成新的均衡子串的最大个数。 约定:字符串中只包含大写的 X 和 Y 两种字符。 输入描述 输入一个均衡串…...
Spring Data Elasticsearch简介
一、Spring Data Elasticsearch简介 1 SpringData ElasticSearch简介 Elasticsearch是一个实时的分布式搜索和分析引擎。它底层封装了Lucene框架,可以提供分布式多用户的全文搜索服务。 Spring Data ElasticSearch是SpringData技术对ElasticSearch原生API封装之后的产物,它通…...
GESP202312 四级【小杨的字典】题解(AC)
》》》点我查看「视频」详解》》》 [GESP202312 四级] 小杨的字典 题目描述 在遥远的星球,有两个国家 A 国和 B 国,他们使用着不同的语言:A 语言和 B 语言。小杨是 B 国的翻译官,他的工作是将 A 语言的文章翻译成 B 语言的文章…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
路由基础-路由表
本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中,往往存在多个不同的IP网段,数据在不同的IP网段之间交互是需要借助三层设备的,这些设备具备路由能力,能够实现数据的跨网段转发。 路由是数据通信网络中最基…...
