ESP32-A2DP:用ESP32打造你的蓝牙音乐世界

文摘   2024-11-22 00:02   湖南  

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, 4410016)) {
      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


DIY太阳系
分享嵌入式系统知识,写精华文章!
 最新文章