>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 嵌入式 安全
C-plus-plus

将5美元的微控制器变成蓝牙音箱或无线播放器

如果你曾经打开过乐鑫官方的蓝牙音频示例,你可能还记得那种隐隐的恐惧感。几十行底层代码、Bluedroid回调、FreeRTOS队列配置,还有指针随时可能越界的担忧。

瑞士开发者Phil Schatzmann也遇到了同样的困扰,于是编写了ESP32-A2DP库。它将所有复杂的底层代码隐藏在内部,提供了简洁的C++接口用于音频流传输。

esp32

引擎盖下是什么,它如何运作

该库处理两个主要任务:

  • A2DP Sink(接收器):ESP32模拟无线音箱或耳机,接收手机发送的流媒体,并输出到外部DAC、板上内置DAC或原始内存缓冲区。
  • A2DP Source(发送器):微控制器本身广播音频(算法生成、从SD卡读取或来自麦克风)到外部蓝牙音箱。

该项目依赖标准A2DP配置文件,并通过AVRCP支持控制信号传输。这意味着微控制器可以在手机上切换曲目、暂停播放或读取元数据(曲目标题、艺术家姓名、时长)。

在音频输出方面,该库通过I2S总线工作。在ESP-IDF v5和Arduino ESP32 v3中,I2S API经历了重大重写。为了在更新框架时保持兼容性,作者建议将库直接链接到自己的项目中,虽然你也可以使用标准类或直接获取原始PCM样本。

如何用五行代码构建无线接收器

以下是一个让音频接收器运行的最小示例:

烧录后,板子在蓝牙设备列表中显示为"MyMusic"。默认情况下,音频流(16位、44.1 kHz立体声)通过I2S引脚GPIO14(BCK)、GPIO15(WS)和GPIO22(数据输出)输出。如果你的接线不同,可以通过配置中的两行代码设置引脚。

如果你手边没有外部DAC芯片(如流行的PCM5102A或MAX98357A),可以使用GPIO25和GPIO26上的内置8位DAC:

通过内置DAC的声音对发烧友来说会有点嘈杂,但对于厨房里的语音提示或收音机来说完全够用。

读取元数据和控制曲目

一个实用的细节:库允许通过AVRCP获取曲目信息。如果你连接一个小显示屏,可以轻松制作一个媒体中心的信息屏幕:

要从物理按钮控制手机上的播放器,可以使用方法。

发送器模式:当ESP32生成声音时

如果你需要向蓝牙耳机或条形音箱发送音频,请切换到发送器模式。音频流通过回调函数传递给库:

顺便说一下,你可以通过方法(通过)传递设备名称列表。板子会自动连接到列表中找到的第一个设备。

访问原始音频流和编解码器

如果你不需要I2S,需要在微控制器上直接算法处理音频(例如,通过FFT创建灯光秀或将片段录制到内存),你可以通过回调拦截PCM数据包:

默认编解码器是标准SBC。在最新版本中,作者添加了对通过连接外部解码器的实验性支持,包括AAC(不过在IDF端需要ESP-IDF 6.1或更高版本才能获得完整功能)。

你应该知道的局限性

  • HFP和HSP配置文件(免提通话、带麦克风的通话)不受支持。该项目严格专注于媒体流传输。
  • 该库对蓝牙协议栈资源要求较高。在基本ESP32上同时处理大量Wi-Fi流量和稳定的A2DP流可能会很棘手,可能会出现音频卡顿。
  • 仓库中的文档很详细,但作者对问题报告格式要求严格:在GitHub上提交issue之前,请确保检查库版本和ESP32核心版本。

谁会发现这很有用

如果你想让老式磁带录音机重获新生、在复古放大器中集成无线接收器,或构建能直接向无线耳机流传输音频的自定义合成器,这个项目会派上用场。

该库与Arduino IDE、PlatformIO和纯Espressif IDF作为组件兼容。要开始,你只需要一块ESP32 WROOM板和一块基于PCM5102A的DAC板,价格只需几美元。

相关项目