开始前适用开发板:ESP32-S3 Korvo · 开发框架:ESP-IDF
适用开发板:Korvo S3 · 工程
04.advanced.avi_recorder· targetesp32s3
前置:摄像头 LVGL 显示 · SD 卡读写
学习时长:约 30 分钟 · 难度:★★★★☆
学习目标
完成本节后,你将能够:
- 理解 AVI 文件格式(RIFF + MJPEG 视频流 + PCM 音频流)
- 掌握摄像头 JPEG 帧 + 麦克风 PCM 同步写入 TF 卡的方法
- 了解嵌入式环境下的音视频同步和文件封装
- 理解 ESP32 上的"安防录像"实现方案
1. 这个例子在干嘛
一个完整的 安防录像机——DVP 摄像头每帧输出 JPEG,麦克风录音得 PCM,两路数据交错写入 TF 卡生成标准 AVI 文件。录完可以拔卡在 PC 上用播放器(VLC/PotPlayer)直接观看。
生活类比:行车记录仪——不断录制音视频写入 SD 卡。
┌──────────┐ JPEG ┌──────────┐ RIFF/AVI ┌──────────┐
│ DVP 摄像头 │──────→│ ESP32-S3 │───────────→│ TF 卡 │
└──────────┘ │ │ 同步封装 │ xxx.avi │
│ │ └──────────┘
┌──────────┐ PCM │ │
│ 麦克风 │──────→│ │
│ ES7210 │ └──────────┘
└──────────┘
AVI 文件结构简介
RIFF 'AVI '
├── hdrl(文件头)
│ ├── avih(主头:帧率、分辨率)
│ ├── strl(视频流:MJPEG, FourCC='MJPG')
│ └── strl(音频流:PCM, 16kHz, 16bit)
└── movi(数据区)
├── 00dc(视频帧 1 JPEG)
├── 01wb(音频块 1 PCM)
├── 00dc(视频帧 2 JPEG)
├── 01wb(音频块 2 PCM)
└── ...
2. 编译烧录
cd Korvo_Firmware\04.advanced.avi_recorder
idf.py set-target esp32s3
idf.py build flash monitor
必须插入 TF 卡(FAT32 格式)。
3. 运行现象
| 阶段 | 屏幕 | 串口 | TF 卡 |
|---|---|---|---|
| 启动 | 摄像头预览 | SD mount OK | — |
| 录制 | 红色录制指示 | Recording: frame N | AVI 文件增长 |
| 停止 | 恢复预览 | File closed: xxx.avi | 文件完成 |
| PC 播放 | — | — | VLC 可播放 |
4. 常见问题与排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| TF 卡挂载失败 | 卡未插/非 FAT32 | 格式化为 FAT32 |
| AVI 播放不了 | 文件头不完整 | 录制必须正常结束(别断电) |
| 录制帧率低 | JPEG 太大 | 降低分辨率/质量 |
| 无音频 | ES7210 初始化失败 | 检查麦克风硬件 |
| SD 写入慢 | 卡速度等级低 | 用 Class 10 / U1 以上的卡 |
5. 动手改造建议
- 自动分段:每 5 分钟自动新建文件(行车记录仪模式)
- 运动检测:帧差法检测画面变化,有动作才录制
- Wi-Fi + MQTT:开始/停止录制可远程控制
- 时间戳水印:在 JPEG 帧上叠加时间文字
- 纯视频录制:不需要音频时可去掉 PCM 流
6. 知识延伸
- MJPEG vs H.264:MJPEG 每帧独立压缩,简单但文件大;H.264 帧间压缩,文件小但编解码复杂
- ESP32-S3 不支持 H.264 硬编码:所以用 MJPEG 是最实用的方案
- 音视频同步:AVI 靠帧率(FPS)和采样率(16kHz)隐式同步,不需要时间戳
- SD 卡带宽:SDMMC 4-bit 模式约 20~40 MB/s,QVGA JPEG(~10KB/帧)10fps 只需 100KB/s
7. 下一步
| 方向 | 推荐例程 | 说明 |
|---|---|---|
| AVI 播放 | AVI Player | 播放录制的文件 |
| 多窗播放 | AVI Multi Player | 多路播放 |
| P4C5 版 | P4C5 AVI Recorder | 硬件 JPEG 编码 |
酷世DIY · Kevincoooool