ESP-BT-AUDIO 组件

[English]

概述

ESP_BT_AUDIO 是乐鑫推出的蓝牙音频高级组件,用于统一管理经典蓝牙(Classic Bluetooth)与 LE Audio 的音频能力。该组件整合了底层蓝牙协议、音频数据流与事件通知流程,为应用层提供统一的初始化、数据访问和状态管理接口,从而降低蓝牙音频应用的开发复杂度。

ESP_BT_AUDIO 会根据用户配置的角色(role)自动完成对应协议的初始化与管理,并通过统一事件机制向应用层上报连接状态、设备发现、音频流状态、播放控制、音量变化、通话状态、通讯录和通话记录等信息。

该组件适用于如下典型场景:

  • 蓝牙音箱

  • 蓝牙耳机

  • 智能音频设备

  • 带通话能力的语音终端

  • 需要接入 ESP-GMF pipeline 的蓝牙音频应用

主要特性

  • 统一的蓝牙音频接口 对上提供统一 API 和事件回调,应用无需分别处理不同 Bluetooth profile 的底层差异。

  • 支持经典蓝牙音频协议 支持 A2DP Sink、A2DP Source、HFP Hands-Free、AVRCP Controller/Target 和 PBAP Client Equipment 等功能。

  • 统一事件回调模型 通过 esp_bt_audio_event_cb_t 上报连接、发现、stream 生命周期、播放控制、元数据、音量、通话状态、电话状态、通讯录和通话记录等事件。

  • Stream 抽象 使用 esp_bt_audio_stream_handle_t 表示蓝牙音频流,支持查询 codec 信息、数据方向、业务上下文,并通过 packet API 读写编码帧。

  • 灵活的数据接入方式 支持 Packet I/O 直接读写蓝牙音频数据包,也支持通过 esp_gmf_io_bt 接入 ESP-GMF pipeline。

  • 降低应用开发复杂度 将协议初始化、profile 管理、状态变化和数据流处理收敛到统一组件中,提高代码复用性和可扩展性。

功能特性

ESP_BT_AUDIO 支持如下功能:

功能

说明

典型应用

A2DP Sink

从手机、PC 等远端音源接收音频并在本地播放

蓝牙音箱、耳机

A2DP Source

将本地音频发送到远端蓝牙音箱或耳机

播放器、语音设备

HFP Hands-Free

支持通话类语音场景

车载、耳机、语音终端

AVRCP Controller/Target

支持播放控制、元数据和播放状态通知

播控面板、音频播放器

PBAP Client Equipment

拉取手机通讯录和通话记录

带电话簿能力的终端设备

GMF I/O

将蓝牙音频 stream 接入 ESP-GMF pipeline

复杂音频处理链路

架构概览

ESP_BT_AUDIO 位于应用层与蓝牙协议栈之间,作为适配层向上提供统一接口,向下对接 BT host、蓝牙 controller 以及各类 Classic Bluetooth profile。底层 profile 和 host 的回调会被组件统一转换为事件,再通知应用层处理。

典型处理流程如下:

  1. 应用初始化 NVS 和 BT controller。

  2. 应用配置 host、role 和事件回调。

  3. 调用 esp_bt_audio_init() 初始化组件。

  4. 组件根据 role 初始化对应蓝牙协议。

  5. 连接、发现、stream 状态和控制事件通过统一回调上报。

  6. 应用根据 stream 方向选择读取、写入或绑定 GMF pipeline。

Stream 生命周期

ESP_BT_AUDIO 的 stream 生命周期由组件内部维护,并通过 ESP_BT_AUDIO_EVENT_STREAM_STATE_CHG 事件上报。应用可根据状态完成编解码器初始化、pipeline 绑定、数据处理启停和资源释放。

常见状态如下:

  • ALLOCATED:stream 已创建,应用可查询 codec、方向和上下文,并分配相关资源。

  • STARTED:音频流已启动,应用开始读取或写入编码帧。

  • STOPPED:音频流已停止,应用停止对应处理流程。

  • RELEASED:stream 已释放,应用清理相关资源。

典型数据流

A2DP Sink 场景中,手机或 PC 作为音源发送 SBC 等编码帧,ESP 设备通过 ESP_BT_AUDIO 获取编码数据,再经过解码、采样率转换、声道转换等处理后输出到 I2S、DAC 或 codec device。

A2DP Source 场景中,ESP 设备从文件、麦克风或 pipeline 获取本地音频数据,经过必要的转换和编码后,通过 ESP_BT_AUDIO 发送给远端蓝牙音箱或耳机。

示例工程

可以通过以下命令创建 bt_audio 示例工程:

idf.py create-project-from-example "espressif/esp_bt_audio=0.8.1:bt_audio"

更多示例代码请参考组件中的 examples 目录。

组件链接