本示例演示了如何使用 esp_audio_render 来渲染带或不带音效处理的 PCM 音频,以及如何将多个输入混音为一个输出。它展示了端到端流程:通过网络获取压缩音频(例如 MP3),使用 esp_audio_codec 解码器解码,将 PCM 输入到渲染 API,最终输出到 esp_codec_dev(I2S 编解码器)。
- 推荐:ESP32-S3-Korvo2 或 ESP32‑P4‑Function‑EV‑Board
- 支持其他开发板;请参阅 其他开发板支持
- 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 文件下载和播放
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]
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 处理 在每流和混音后都应用,用于演示音频处理器功能
- 在示例的
app_main()(或相应的辅助函数)中配置 Wi‑Fi 和开发板音频编解码器初始化,然后构建和烧录:
idf.py -p /dev/XXXXX flash monitor- 该示例自动运行两个测试场景:
- 单流测试:下载并播放一个 MP3 文件 30 秒
- 多流混音测试:同时下载并混音 8 个不同的音频源
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 API:
- 使用
bsp_audio_codec_microphone_init()替代esp_gmf_app_get_record_handle()