当前位置: 首页 > news >正文

BAP 深度解析:单播与广播的基石

目录

  1. BAP 概述
  2. 核心概念
  3. Unicast(单播)详解
  4. Broadcast(广播)详解
  5. PACS:能力发现机制
  6. ASE:音频流端点
  7. 状态机详解
  8. 配置流程实战
  9. 代码示例

------------------------------------------------------------------------------------------------------------------------------------------

视频链接:https://item.taobao.com/item.htm?id=1001969040805&mi_id=000032T4qZX9WZoRwX6YbxlNUaZOfOI6XoxDx0jxsfnwlEc&spm=a21xtw.29178619.0.0

---------------------------------------------------------------------------------------------------------------------------------

BAP 概述

什么是 BAP?

BAP (Basic Audio Profile)是 LE Audio 的基础 Profile,定义了:

  • 音频流的配置和建立
  • 单播(Unicast)和广播(Broadcast)两种模式
  • 音频能力的发现和协商

角色定义

┌─────────────────────────────────────────────────────────┐ │ BAP 角色定义 │ ├─────────────────────────────────────────────────────────┤ │ 单播 (Unicast) │ │ ├─ Unicast Client - 单播客户端(如手机) │ │ ├─ Unicast Server - 单播服务器(如耳机) │ │ │ │ 广播 (Broadcast) │ │ ├─ Broadcast Source - 广播源(如公共广播发射器) │ │ └─ Broadcast Sink - 广播接收器(如耳机接收广播) │ └─────────────────────────────────────────────────────────┘

BAP 在协议栈中的位置

应用层 │ ├─ CAP (Common Audio Profile) ← 统一配置接口 │ ├─ BAP (Basic Audio Profile) ← 本文主角 │ ├─ ASCS (Audio Stream Control Service) │ ├─ PACS (Published Audio Capabilities) │ └─ BASS (Broadcast Audio Scan Service) │ └─ ISO (Isochronous Channels) ← 传输层 ├─ CIS (单播) └─ BIS (广播)

核心概念

1. Direction(方向)

typedef enum { BAP_DIR_SINK = 0x01, // 接收端(如耳机) BAP_DIR_SOURCE = 0x02, // 发送端(如手机麦克风) } bap_direction_t;
  • Sink: 接收音频数据(播放)
  • Source: 发送音频数据(录音/通话上行)

2. Target Latency(目标延迟)

延迟级别

典型应用

0x01

Low (7.5-15ms)

游戏、专业音频

0x02

Balanced (15-30ms)

音乐、视频

0x03

High (30-50ms)

普通通话

3. PHY(物理层)

typedef enum { BAP_PHY_1M = 0x01, // 1 Mbps BAP_PHY_2M = 0x02, // 2 Mbps(推荐) BAP_PHY_CODED = 0x04, // Coded PHY(远距离) } bap_phy_t;

Unicast(单播)详解

单播特点

  • 点对点连接: 一对一传输
  • 双向通信: 支持同时 Sink + Source(如通话)
  • 可靠传输: CIS 支持重传机制

CIS(Connected Isochronous Stream)

CIS 架构: ┌─────────┐ CIG ┌─────────┐ │ Source │ ←──────────→ │ Sink │ │ (手机) │ CIS x N │ (耳机) │ └─────────┘ └─────────┘ CIG: Connected Isochronous Group CIS: Connected Isochronous Stream 一个 CIG 可以包含多个 CIS: - CIS_0: 左耳音频 - CIS_1: 右耳音频 - CIS_2: 麦克风上行

单播配置参数

typedef struct { // 基本信息 uint8_t direction; // SINK or SOURCE uint8_t target_latency; // LOW/BALANCED/HIGH uint8_t phy; // 1M/2M/CODED // Codec 配置 bap_codec_cfg_t codec; // QoS 配置 bap_qos_cfg_t qos; } bap_unicast_config_t;

Broadcast(广播)详解

广播特点

  • 一对多: 一个发射器,无限接收器
  • 单向传输: 仅 Source → Sink
  • 无连接: 接收器无需配对即可收听
  • 支持加密: 需要 Broadcast Code 解密

BIS(Broadcast Isochronous Stream)

BIS 架构: ┌───────────────┐ │ Broadcast │ │ Source │ │ (公共广播) │ └───────┬───────┘ │ BIS 广播 ↓ ┌────┼────┐ ↓ ↓ ↓ ┌───┐┌───┐┌───┐ │耳机││耳机││助听器│ └───┘└───┘└───┘ BIG: Broadcast Isochronous Group BIS: Broadcast Isochronous Stream

Auracast™

Auracast是 LE Audio 广播音频的商标名称,应用场景:

  • 机场登机广播
  • 剧院/电影院音频
  • 教堂/清真寺宗教仪式
  • 健身房电视音频
Auracast 标识: 📢 发射器: "请使用支持 Auracast 的设备收听" 🎧 接收器: 扫描 → 发现广播 → 加入收听

PACS:能力发现机制

什么是 PACS?

PACS (Published Audio Capabilities Service)用于设备发布自己的音频能力:

  • 支持的编解码器
  • 采样率
  • 帧时长
  • 通道数

PAC(Published Audio Capability)

typedef struct { uint8_t codec_id; // 0x06 = LC3 uint16_t company_id; // Vendor ID (0xFFFF for standard) // 能力位图 uint16_t sampling_freqs; // 8/16/24/32/44.1/48 kHz uint8_t frame_durations; // 7.5ms / 10ms uint8_t channel_counts; // 1/2/3... channels // 码率范围 uint16_t min_octets_per_frame; uint16_t max_octets_per_frame; } bap_pac_t;

发现流程

1. Client 连接 Server ↓ 2. Client 发现 PACS Service ↓ 3. Client 读取 Sink/Source PAC ↓ 4. Client 根据能力选择合适的配置 ↓ 5. Client 通过 ASCS 配置 ASE

LC3 典型能力

采样率: 8, 16, 24, 32, 44.1, 48 kHz 帧时长: 7.5ms, 10ms 码率: 16-320 kbps 常见配置: - 音乐: 48kHz, 10ms, 160kbps - 通话: 32kHz, 10ms, 64kbps - 游戏: 48kHz, 7.5ms, 240kbps (低延迟)

ASE:音频流端点

ASE 定义

ASE (Audio Stream Endpoint)是 LE Audio 中音频流的抽象端点:

  • 每个 ASE 代表一个音频流配置
  • ASE 有明确的状态机
  • Client 通过 Control Point 操作 ASE

ASE Characteristics

Characteristic

说明

Sink ASE

接收音频的 ASE

Source ASE

发送音频的 ASE

ASE Control Point

控制 ASE 状态的操作点

ASE 数量

典型设备配置: - TWS 耳机: 2 Sink ASE (左右耳) + 1 Source ASE (麦克风) - 单耳耳机: 1 Sink ASE + 1 Source ASE - 手机: 多个 Sink/Source ASE,支持多设备

状态机详解

ASE 状态机

┌─────────────┐ ┌─────────│ IDLE │◄────────────────┐ │ └──────┬──────┘ │ │ │ Config Codec │ │ ↓ │ │ ┌─────────────┐ │ │ │ CODEC_CFG │ │ │ └──────┬──────┘ │ │ │ Config QoS │ │ ↓ │ │ ┌─────────────┐ │ │ │ QOS_CFG │ │ │ └──────┬──────┘ │ │ │ Enable │ │ ↓ │ │ ┌─────────────┐ Start Ready │ └────────►│ ENABLING │◄───────────────│ └──────┬──────┘ │ │ Receiver Start Ready │ ↓ │ ┌─────────────┐ Disable │ ┌────────►│ STREAMING │─────────────────┘ │ └─────────────┘ │ │ │ ↓ Receiver Stop Ready │ ┌─────────────┐ └─────────│ DISABLING │ └─────────────┘

状态说明

状态

说明

可执行操作

Idle

空闲状态

Config Codec

Codec Configured

已配置编解码器

Config QoS, Release

QoS Configured

已配置 QoS

Enable, Release

Enabling

启用中

Receiver Start Ready

Streaming

流式传输中

Disable, Update Metadata

Disabling

禁用中

Receiver Stop Ready

Releasing

释放中

-


配置流程实战

单播配置完整流程

【场景】手机连接 TWS 耳机,播放音乐 Step 1: 发现 PACS ┌──────┐ ┌──────┐ │ 手机 │ ←─Discover PACS──→ │ 耳机 │ └──────┘ └──────┘ Step 2: 读取 Sink PAC ┌──────┐ ┌──────┐ │ 手机 │ ←─Read Sink PAC──→ │ 耳机 │ └──────┘ └──────┘ 获取: 支持 48kHz, 10ms, LC3 Step 3: 配置 ASE (Sink) ┌──────┐ ┌──────┐ │ 手机 │ ──Config Codec──→ │ 耳机 │ │ │ │ │ │ │ ◄────Success─────── │ │ └──────┘ └──────┘ State: Idle → Codec Configured Step 4: 配置 QoS ┌──────┐ ┌──────┐ │ 手机 │ ──Config QoS────→ │ 耳机 │ │ │ ◄────Success─────── │ │ └──────┘ └──────┘ State: Codec Configured → QoS Configured Step 5: 启用 ASE ┌──────┐ ┌──────┐ │ 手机 │ ────Enable──────→ │ 耳机 │ │ │ ◄────Success─────── │ │ └──────┘ └──────┘ State: QoS Configured → Enabling Step 6: Receiver Start Ready ┌──────┐ ┌──────┐ │ 手机 │ ──Start Ready───→ │ 耳机 │ │ │ ◄────Success─────── │ │ └──────┘ └──────┘ State: Enabling → Streaming Step 7: 创建 CIS ┌──────┐ ┌──────┐ │ 手机 │ ←──CIS Created──→ │ 耳机 │ └──────┘ └──────┘ Step 8: 开始传输音频 ┌──────┐ ┌──────┐ │ 手机 │ ═══LC3 Data════► │ 耳机 │ └──────┘ └──────┘

广播配置完整流程

【场景】机场广播 Step 1: 创建 Broadcast Source ┌──────────────┐ │ 广播源 │ │ (机场系统) │ └──────┬───────┘ │ ↓ BIG Created Step 2: 配置 BIS - Codec: LC3, 48kHz, 10ms - QoS: 10000us interval, 160kbps Step 3: 启动广播 ┌──────────────┐ │ 广播源 │═══BIS Broadcast═══► └──────────────┘ Step 4: 接收端发现广播 ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 耳机 │ │ 助听器 │ │ 手机 │ │ (Synced) │ │ (Synced) │ │ (Synced) │ └──────────┘ └──────────┘ └──────────┘ Step 5: 接收音频 所有接收器同步接收相同音频流

代码示例

初始化 BAP

#include "bap.h" static bap_callbacks_t bap_cbs = { .pacs_discover_complete = on_pacs_discovered, .ase_state_changed = on_ase_state_changed, .cis_connected = on_cis_connected, }; void bap_init(void) { int err = bap_init(&bap_cbs); if (err) { printf("BAP init failed: %d\n", err); return; } printf("BAP initialized\n"); }

发现 PACS

void discover_pacs(bap_conn_handle_t conn) { int err = bap_discover_pacs(conn, on_pacs_discovered, NULL); if (err) { printf("Discover PACS failed: %d\n", err); return; } } void on_pacs_discovered(bap_conn_handle_t conn, int err, void *user_data) { if (err) { printf("PACS discovery failed\n"); return; } // 获取 Sink PAC uint8_t count; const bap_pac_t *sink_pacs = bap_get_sink_pacs(conn, &count); for (int i = 0; i < count; i++) { printf("Sink PAC %d: codec=%d, freq=%d\n", i, sink_pacs[i].codec_id, sink_pacs[i].sampling_freqs); } }

配置 ASE

void configure_ase(bap_conn_handle_t conn) { bap_ase_config_t config = { .direction = BAP_DIR_SINK, .target_latency = BAP_LATENCY_BALANCED, .phy = BAP_PHY_2M, .codec = { .codec_id = BAP_CODEC_LC3, .sampling_freq = BAP_SAMPLING_FREQ_48000, .frame_duration = BAP_FRAME_DURATION_10MS, .channel_count = 2, .octets_per_frame = 120, // 96kbps }, .qos = { .framing = 0, // Unframed .phy = BAP_PHY_2M, .sdu_interval_us = 10000, // 10ms .max_sdu_size = 120, .retransmission_number = 2, .max_latency_ms = 20, }, }; int err = bap_ase_config(conn, &config, on_ase_configured, NULL); if (err) { printf("ASE config failed: %d\n", err); } } void on_ase_state_changed(bap_conn_handle_t conn, bap_ase_handle_t ase, bap_ase_state_t state, void *user_data) { switch (state) { case BAP_ASE_STATE_QOS_CONFIGURED: printf("ASE configured, enabling...\n"); bap_ase_enable(conn, ase, on_ase_enabled, NULL); break; case BAP_ASE_STATE_STREAMING: printf("ASE streaming!\n"); break; default: break; } }

创建广播

void create_broadcast(void) { bap_broadcast_config_t config = { .num_bis = 1, .codec = { .codec_id = BAP_CODEC_LC3, .sampling_freq = BAP_SAMPLING_FREQ_48000, .frame_duration = BAP_FRAME_DURATION_10MS, .octets_per_frame = 120, }, .qos = { .sdu_interval_us = 10000, .max_sdu_size = 120, }, }; bap_big_handle_t big; int err = bap_broadcast_create(&config, &big, on_broadcast_created, NULL); if (err) { printf("Broadcast create failed: %d\n", err); } } void on_broadcast_created(bap_big_handle_t big, int err, void *user_data) { if (err) { printf("Broadcast creation failed\n"); return; } // 启动广播 bap_broadcast_start(big, on_broadcast_started, NULL); }

常见问题

Q1: ASE 配置失败怎么办?

检查点:

  1. PACS 发现是否成功?
  2. 选择的 Codec 参数是否在 PAC 支持范围内?
  3. QoS 参数是否满足 PHY 和延迟要求?

Q2: CIS 连接失败?

检查点:

  1. ASE 是否已进入 Streaming 状态?
  2. CIG/CIS 参数是否正确?
  3. 设备是否支持相应的 PHY?

Q3: 广播接收不到?

检查点:

  1. 广播是否已启动?
  2. 接收端是否扫描到广播?
  3. 是否需要 Broadcast Code?

总结

BAP 核心要点

  1. 两种模式: Unicast(单播)和 Broadcast(广播)
  2. 三个关键: PACS(能力)、ASE(端点)、CIS/BIS(传输)
  3. 状态机驱动: ASE 有明确的状态流转
  4. 配置先行: 必须先配置 Codec 和 QoS,才能启用传输
http://www.jsqmd.com/news/430250/

相关文章:

  • 2026年河南通风设备实力厂商综合评估与选购指南 - 2026年企业推荐榜
  • 2026年河北脱硫设备品牌综合评估与三家优选厂商解析 - 2026年企业推荐榜
  • 河北唐山脱硫企业盘点:2026年值得关注的5家实力厂商 - 2026年企业推荐榜
  • Python 大型项目结构设计:从混乱到优雅的架构之道
  • 2026年3月知名粮油批发厂家综合测评与战略选型指南 - 2026年企业推荐榜
  • 北京装修如何避坑?优秀整装企业的选择之道 - 2026年企业推荐榜
  • 2026年河北专业脱硫服务公司精选:技术、案例与适配指南 - 2026年企业推荐榜
  • 2026淮安电梯公司信誉榜揭晓:专业维保服务商深度评测 - 2026年企业推荐榜
  • 2026年宜兴硝化菌平台综合评测与选型指南 - 2026年企业推荐榜
  • 如果全球哲学界不接受空性
  • 2026年陕西国土资源技术服务团队综合评测与选型指南 - 2026年企业推荐榜
  • 2026年河南通风工程实力工厂综合盘点与选型指南 - 2026年企业推荐榜
  • 2026年第一季度安徽中央空调清洗剂服务商综合测评与选购指南 - 2026年企业推荐榜
  • 2026年报废车回收平台评测:谁家流程最快最省心? - 2026年企业推荐榜
  • 2026上海环保板材供应商:谁在引领绿色智造新浪潮? - 2026年企业推荐榜
  • 2026年3月玻璃钢桥架工厂综合评测与选型指南 - 2026年企业推荐榜
  • 2026年亳州报废车回收服务商评测与靠谱推荐 - 2026年企业推荐榜
  • 苍穹外卖Day01笔记
  • 2026年淮安杂货梯源头供应商综合实力解析与选择 - 2026年企业推荐榜
  • 2026年西安近视防控机构深度测评:专业之选在哪里? - 2026年企业推荐榜
  • 2026年3月南阳工程造价公司实力盘点与选择指南 - 2026年企业推荐榜
  • 2026年江苏徐州电子皮带秤定制厂家综合评估与选型指南 - 2026年企业推荐榜
  • 2026年Q1推拉窗铝材工厂综合评测与选型指南 - 2026年企业推荐榜
  • 梦笔记20260303-2
  • 2026年近期,如何挑选武汉可靠的纸碗定制供应商? - 2026年企业推荐榜
  • 2026年江苏钢结构厂家专业度权威评测与选型指南 - 2026年企业推荐榜
  • 2026年湖北武汉一次性餐具定制厂商综合评估与选择指南 - 2026年企业推荐榜
  • 湖南乡村自建房专业施工单位2026开年口碑榜TOP5 - 2026年企业推荐榜
  • 2026年佛山换热器批发厂家盘点与专业推荐 - 2026年企业推荐榜
  • 2026年3月设计领先的纹身贴厂商综合实力盘点 - 2026年企业推荐榜