面向 ESP32 的开源无线研究平台。
ESP Audio Codec 组件是由乐鑫为其系列 SOC 开发的官方音频编码与解码处理模块。
ESP Audio Encoder 提供了统一的编码接口,允许注册多个编码器,如:AAC、AMR-NB、AMR-WB、ADPCM、G711A、G711U、PCM、OPUS、ALAC。用户可以基于这些编码接口创建一个或多个编码实例,这些实例可同时进行编码。同时,用户也可以直接调用指定的编码器 API,以减少调用层级。
ESP Audio Decoder 同样提供了统一的解码接口,允许注册多个解码器,如:AAC、MP3、AMR-NB、AMR-WB、ADPCM、G711A、G711U、VORBIS、OPUS、ALAC。用户可以使用这些接口创建一个或多个解码实例,这些实例可同时进行解码。同时,也可以直接调用某一指定解码器的 API 以减少调用深度。ESP Audio Decoder 仅支持音频帧级别的数据处理(即输入数据必须是帧边界对齐的数据)。
为了简化音频帧的解析与定位,我们设计了 ESP Audio Simple Decoder。它通过内置解析器自动完成数据聚合、帧边界检测和帧结构化处理,随后由 ESP Audio Decoder 执行实际解码。用户可以输入任意长度的数据。支持的容器和格式包括:AAC、MP3、WAV、FLAC、AMR-NB、AMR-WB、M4A。
第三方版权许可记录在 版权和许可。
统一且易用的接口
ESP Audio Codec 模块提供统一的接口设计,使用简便,便于快速集成和调用。
轻量化与高性能
该模块针对核心编解码算法做了深度汇编优化,实现高性能同时保持轻量级和低内存占用。
双层解码 API
系统提供两类解码器以满足不同数据输入模式,两类解码器的 API 设计保持一致,便于用户在不同模式间平滑切换。
高度可定制的注册机制
通过注册 API,用户可以轻松添加自定义的解码器、编码器或 Simple Decoder,也可在无需修改应用层代码的情况下替换默认的编码器与解码器,实现高度灵活的功能扩展与定制化。
ESP Audio Codec 支持以下功能特性:
esp_audio_enc_register 注册自定义编码器或覆盖默认编码器esp_audio_enc_register_default 注册所有支持的编码器,并通过 menuconfig 进行管理支持的编码器详细信息如下:
AAC
AMR
ADPCM
G711
OPUS
ALAC
SBC
LC3
G722
esp_audio_dec_register 注册自定义解码器或覆盖默认解码器esp_audio_dec_register_default 注册所有支持的解码器,并通过 menuconfig 进行管理支持的解码器详细信息如下:
AAC
AMR
ADPCM
G711
OPUS
ALAC
FLAC
VORBIS
SBC
LC3
G722
支持的音频容器详细信息如下:
以下结果在 ESP32-S3R8 平台上测试和收集。可以通过运行测试代码中的 Encode to Decode chain test 来获取数据,示例日志输出如下:
I (12599) CODEC_TEST: Start to do chain test for AAC sample_rate 48000 channel 2
I (12879) DEC_TEST: Encoder for AAC cpu: 12.91%
I (12880) DEC_TEST: Encoder AAC compress ratio: 5.86% heap usage: 51400
I (12914) DEC_TEST: Decode for AAC cpu: 6.75% heap usage: 51168
要获取其他采样率、声道数或复杂度下的性能,请在测试代码中更改参数(主要位于函数 chain_test_thread 和 get_encoder_config 中)。
说明:
编码器 CPU 使用率高度依赖于某些编码设置(如比特率或复杂度)
说明:
下表显示了 ESP_AUDIO_CODEC 对乐鑫 SoC 的支持情况。"✔" 表示支持,"✖" 表示不支持。
示例用法请参考 audio_encoder_test.c
示例用法请参考 audio_decoder_test.c
示例用法请参考 simple_decoder_test.c 自定义解析器和解码器的用法请参考 simple_decoder_cust.c
| 音频容器 | 说明 |
|---|
| AAC | 支持通过配置控制 AAC-Plus |
| MP3 | 支持第 1、2、3 层 |
| AMRNB | 仅支持带 AMRNB 文件头的文件 |
| AMRWB | 仅支持带 AMRWB 文件头的文件 |
| FLAC | 仅支持带 FLAC 文件头的文件 |
| ADPCM | 仅支持 IMA-ADPCM |
| WAV | 支持 G711A、G711U、PCM、ADPCM |
| M4A | 支持 MP3、AAC、ALAC 仅支持 MOOV 之后的 MDAT |
| TS | 支持 MP3、AAC |
| G711 | 支持 G711A、G711U |
| SBC | 支持 SBC 和 MSBC |
| LC3 | 支持 LC3 |
| OPUS | 仅支持原始 opus |
| PCM | 仅支持原始 pcm |
| ALAC | 仅支持原始 alac |
| OGG | 支持 VORBIS、OPUS、FLAC |
| VORBIS | 仅支持原始 vorbis |
| 编码器编解码器 | 采样率 (Hz) | 声道数 | 内存 (KB) | CPU 占用 (%) |
|---|
| AAC | 48000 | 2 | 51.4 | 12.9 |
| G711-A | 8000 | 1 | 0.06 | 0.32 |
| G711-U | 8000 | 1 | 0.06 | 0.33 |
| AMR-NB | 8000 | 1 | 3.3 | 17.81 |
| AMR-WB | 16000 | 1 | 5.6 | 37.69 |
| ADPCM | 48000 | 2 | 0.01 | 2.69 |
| OPUS | 48000 | 2 | 29.4 | 24.9 |
| SBC | 48000 | 2 | 1.85 | 9.55 |
| LC3 | 48000 | 2 | 3.67 | 46.57 |
| G722 | 16000 | 1 | 20.8 | 9.74 |
| 解码器编解码器 | 采样率 (Hz) | 声道数 | 内存 (KB) | CPU 占用 (%) |
|---|
| AAC | 48000 | 2 | 51.2 | 6.75 |
| G711-A | 8000 | 1 | 0.04 | 0.14 |
| G711-U | 8000 | 1 | 0.04 | 0.13 |
| AMR-NB | 8000 | 1 | 1.8 | 4.23 |
| AMR-WB | 16000 | 1 | 5.4 | 9.5 |
| ADPCM | 48000 | 2 | 0.11 | 2.43 |
| OPUS | 48000 | 2 | 26.6 | 5.86 |
| MP3 | 44100 | 2 | 28 | 8.17 |
| FLAC | 44100 | 2 | 89.4 | 8.0 |
| SBC | 48000 | 2 | 0.21 | 8.14 |
| LC3 | 48000 | 2 | 1.36 | 17.5 |
| G722 | 16000 | 1 | 0.55 | 9.21 |
| Version | ESP32 | ESP32-S2 | ESP32-S3 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-P4 | ESP32-H4 | ESP32-S31 |
|---|
| v1.0.0 | ✔ | ✔ | ✔ | ✖ | ✔ | ✖ | ✖ | ✖ | ✖ | ✖ |
| v2.0.0 | ✔ | ✔ | ✔ | ✖ | ✔ | ✖ | ✔ | ✔ | ✖ | ✖ |
| v2.1.0 | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✖ | ✖ |
| v2.2.0 | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✖ | ✖ |
| v2.3.0 | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✖ |
| v2.4.0 | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✖ |
| v2.5.0 | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |