audio_render

Example of the component espressif/esp_audio_render v0.7.0
# 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.0:audio_render"

or download archive (~11.18 KB)