ESP32-A2DP 是一个基于 ESP32 微控制器的开源库,它提供了简单易用的 API,使 ESP32 能够轻松地接收和发送蓝牙音频数据,构建你的专属蓝牙音乐世界。本文将详细介绍 ESP32-A2DP 的功能、使用方法以及一些应用场景,帮助你快速上手并开发出有趣的蓝牙音乐项目。
1. ESP32-A2DP 简介
ESP32-A2DP 库基于 ESP32 的 A2DP 蓝牙协议,支持接收和发送音频数据。它提供了简洁的 API,方便用户在 Arduino IDE 中进行开发。
1.1 支持的蓝牙协议
ESP32-A2DP 主要支持 A2DP (Advanced Audio Distribution Profile) 蓝牙协议,该协议用于无线传输音频数据。此外,它还支持 AVRCP (Audio/Video Remote Control Profile) 协议,用于控制音频播放。
1.2 I2S API 和依赖项
ESP32-A2DP 库依赖于 ESP32 的 I2S API,用于音频数据的输出。为了确保代码的兼容性,建议使用 AudioTools 库,该库提供了统一的 I2S 输出 API,与 ESP32 的不同版本兼容。
2. A2DP Sink (音乐接收器)
ESP32-A2DP 可以作为 A2DP Sink,接收来自蓝牙设备的音频数据。例如,你可以使用它来构建一个蓝牙音箱。
2.1 简单 I2S 示例
以下是一个简单的示例,演示如何将蓝牙音频数据输出到 I2S 接口:
#include "AudioTools.h"
#include "BluetoothA2DPSink.h"
I2SStream i2s;
BluetoothA2DPSink a2dp_sink(i2s);
void setup() {
a2dp_sink.start("MyMusic");
}
void loop() {
}
该示例创建了一个名为 "MyMusic" 的蓝牙设备,并将音频数据输出到默认的 I2S 引脚 (bck_io_num = 14, ws_io_num = 15, data_out_num = 22)。你需要将这些引脚连接到外部 DAC,以将数字音频信号转换为模拟音频信号。
2.2 自定义引脚
你可以自定义 I2S 引脚,在 setup()
函数中进行配置:
#include "AudioTools.h"
#include "BluetoothA2DPSink.h"
I2SStream i2s;
BluetoothA2DPSink a2dp_sink(i2s);
void setup() {
auto cfg = i2s.defaultConfig();
cfg.pin_bck = 14;
cfg.pin_ws = 15;
cfg.pin_data = 22;
i2s.begin(cfg);
a2dp_sink.start("MyMusic");
}
void loop() {
}
2.3 使用 ESP32 I2S API
你也可以使用 ESP32 的 I2S API,无需安装额外的库:
#include "I2S.h"
#include "BluetoothA2DPSink.h"
BluetoothA2DPSink a2dp_sink(I2S);
void setup() {
I2S.setSckPin(14);
I2S.setFsPin(15);
I2S.setDataPin(22);
if (!I2S.begin(I2S_PHILIPS_MODE, 44100, 16)) {
Serial.println("Failed to initialize I2S!");
while (1); // do nothing
}
a2dp_sink.start("MyMusic");
}
void loop() {
}
2.4 输出到内部 DAC
你可以将音频数据直接输出到 ESP32 的内部 DAC,使用 AudioTools 库的 AnalogAudioStream
类:
#include "AudioTools.h"
#include "BluetoothA2DPSink.h"
AnalogAudioStream out;
BluetoothA2DPSink a2dp_sink(out);
void setup() {
a2dp_sink.start("MyMusic");
}
void loop() {
}
音频数据将输出到 DAC 引脚 GPIO25 (通道 1) 和 GPIO26 (通道 2)。
2.5 使用回调函数访问数据流
你可以使用回调函数来接收音频数据包。音频数据通常以 44.1kHz 采样率,双声道 16 位样本格式进行编码。
// 在 setup 函数中设置回调函数
a2dp_sink.set_on_data_received(data_received_callback);
// 回调函数
void data_received_callback() {
Serial.println("Data packet received");
}
或者,你可以直接访问数据包:
// 在 setup 函数中设置数据流读取函数
a2dp_sink.set_stream_reader(read_data_stream);
// 数据流读取函数
void read_data_stream(const uint8_t *data, uint32_t length)
{
int16_t *samples = (int16_t*) data;
uint32_t sample_count = length/2;
// 处理音频数据
}
2.6 元数据支持
ESP32-A2DP 支持接收 AVRCP 元数据,例如歌曲标题、播放时间等。你可以注册一个回调函数来处理元数据:
void avrc_metadata_callback(uint8_t data1, const uint8_t *data2) {
Serial.printf("AVRC metadata rsp: attribute id 0x%x, %s\n", data1, data2);
}
a2dp_sink.set_avrc_metadata_callback(avrc_metadata_callback);
a2dp_sink.start("BT");
2.7 通知支持
ESP32-A2DP 支持接收 AVRCP 通知,例如播放状态、播放位置、曲目变化等。你可以注册回调函数来处理这些通知。
3. A2DP Source (音乐发送器)
ESP32-A2DP 可以作为 A2DP Source,将音频数据发送到蓝牙设备。例如,你可以使用它来构建一个蓝牙音频发射器。
3.1 使用回调函数发送数据
你可以使用回调函数来生成音频数据,并将其发送到蓝牙设备。ESP32-A2DP 支持 SBC 音频编解码器,音频数据通常以 44.1kHz 采样率,双声道 16 位样本格式进行编码。
#include "BluetoothA2DPSource.h"
BluetoothA2DPSource a2dp_source;
// 回调函数
int32_t get_sound_data(Frame *data, int32_t frameCount) {
// 生成音频数据
// 返回生成的音频数据长度 (帧数)
return frameCount;
}
void setup() {
a2dp_source.start("MyMusic", get_sound_data);
}
void loop() {
}
3.2 使用预先录制的数据发送数据
你也可以使用预先录制的数据来发送音频数据。
#include "BluetoothA2DPSource.h"
extern const uint8_t StarWars10_raw[];
extern const unsigned int StarWars10_raw_len;
BluetoothA2DPSource a2dp_source;
SoundData *music = new OneChannelSoundData((int16_t*)StarWars30_raw, StarWars30_raw_len/2);
void setup() {
a2dp_source.start("RadioPlayer");
a2dp_source.write_data(music);
}
void loop() {
}
4. 应用场景
ESP32-A2DP 可以应用于各种蓝牙音乐项目,例如:
• 蓝牙音箱: 接收来自手机或其他蓝牙设备的音频数据,并将其输出到扬声器。
• 蓝牙音频发射器: 将音频数据发送到蓝牙耳机或音箱。
• 蓝牙音乐播放器: 从 SD 卡或其他存储设备读取音频数据,并将其发送到蓝牙设备。
• 蓝牙音频处理: 使用 ESP32 的音频处理能力,对音频数据进行处理,例如添加音效、滤波等。
5. 总结
ESP32-A2DP 是一个功能强大、易于使用的蓝牙音频库,它可以帮助你轻松地构建各种蓝牙音乐项目。无论你是想打造一个蓝牙音箱、蓝牙音频发射器,还是进行音频处理,ESP32-A2DP 都能满足你的需求。希望本文能帮助你快速了解并使用 ESP32-A2DP 库,创造出更多有趣的蓝牙音乐项目。
参考资料
• ESP32-A2DP 库地址:https://github.com/pschatzmann/ESP32-A2DP
• ESP32 文档:https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/bluetooth/esp_gap_ble_api.html
• AudioTools 库地址:https://github.com/pschatzmann/audio-tools