# ESP 音频渲染器示例
- [English](./README.md)
本示例演示了如何使用 `esp_audio_render` 来渲染带或不带音效处理的 PCM 音频,以及如何将多个输入混音为一个输出。它展示了端到端流程:通过网络获取压缩音频(例如 MP3),使用 `esp_audio_codec` 解码器解码,将 PCM 输入到渲染 API,最终输出到 `esp_codec_dev`(I2S 编解码器)。
## 硬件要求
- **推荐**:[ESP32-S3-Korvo2](https://docs.espressif.com/projects/esp-adf/en/latest/design-guide/dev-boards/user-guide-esp32-s3-korvo-2.html) 或 [ESP32‑P4‑Function‑EV‑Board](https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32p4/esp32-p4-function-ev-board/user_guide.html)
- 支持其他开发板;请参阅 [其他开发板支持](#其他开发板支持)
## 软件要求
- ESP‑IDF v5.4 或更高版本
- `esp_audio_render` 组件
- ESP‑GMF 框架(提供格式转换器和可选处理器)
- `esp_audio_codec`(用于解码 MP3/其他格式)
- `esp_codec_dev`(用于实际音频输出)
## 演示的功能特性
- **单流播放**:MP3/AAC (HTTP) → 解码为 PCM → 渲染 → 编解码器
- **多流混音**:解码多个独立的 MP3/AAC 源并混音到一个接收端
- **固定输出格式配置**:16 kHz、16位、立体声输出
- **每流处理**:每个流上的 ALC(自动电平控制)
- **混音后处理**:混音后的 ALC 处理
- **网络音频流**:基于 HTTP 的 MP3/AAC 文件下载和播放
## 工作原理
### 整体流程
```mermaid
flowchart LR
NET[HTTP MP3/AAC] --> DEC[esp_audio_codec 解码器]
DEC -- PCM --> STRM[esp_audio_render 流]
STRM --> MIX[混音线程]
MIX --> POST[后处理流水线: ALC]
POST --> SINK[esp_codec_dev]
```
### 处理器流水线布局
```mermaid
flowchart LR
subgraph 每流路径
IN[来自解码器的 PCM]
P1[可选: CH/BIT/RATE 转换]
P2[每流 ALC]
end
IN --> P1 --> P2 --> OUTQ[环形缓冲区]
subgraph 混音线程
OUTQ --> M[ESP 音频效果混音器]
M --> PM[后处理流水线: ALC]
end
PM --> WR[esp_codec_dev]
```
- **每流处理** 在 `esp_audio_render_stream_write()` 调用者中内联运行
- **当 `stream_num > 1` 时**,混音线程消费每流环形缓冲区并运行混音后流水线
- **ALC 处理** 在每流和混音后都应用,用于演示音频处理器功能
## 运行示例
1. 在示例的 `app_main()`(或相应的辅助函数)中配置 Wi‑Fi 和开发板音频编解码器初始化,然后构建和烧录:
```bash
idf.py -p /dev/XXXXX flash monitor
```
2. 该示例自动运行两个测试场景:
- **单流测试**:下载并播放一个 MP3 文件 30 秒
- **多流混音测试**:同时下载并混音 8 个不同的音频源
### 典型 API 调用
- `esp_audio_render_create()` - 创建渲染器并初始化互斥锁
- `esp_audio_render_set_out_sample_info()` - 设置输出格式
- `esp_audio_render_stream_open()` - 打开流并保护互斥锁
- `esp_audio_render_stream_add_procs()` - 向流添加处理器
- `esp_audio_render_stream_write()` - 写入 PCM 数据
- `esp_audio_render_stream_close()` - 关闭流并保护互斥锁
- `esp_audio_render_destroy()` - 清理并销毁互斥锁
## 其他开发板支持
本示例可以利用 `gmf_app_utils` 进行快速开发板启动。在menuconfig的"GMF APP Configuration"下检查开发板兼容性。详情请参阅 `gmf_app_utils` README。
或者,您可以使用 [esp-bsp](https://github.com/espressif/esp-bsp/tree/master) API:
- 使用 `bsp_audio_codec_microphone_init()` 替代 `esp_gmf_app_get_record_handle()`
To create a project from this example, run:
idf.py create-project-from-example "espressif/esp_audio_render=0.7.1:audio_render"