网站开发的报告书,襄阳市网站搭建公司,陕西西安有什么好玩的,温州气象权威发布目录 BAP 概述核心概念Unicast#xff08;单播#xff09;详解Broadcast#xff08;广播#xff09;详解PACS#xff1a;能力发现机制ASE#xff1a;音频流端点状态机详解配置流程实战代码示例 ----------------------------------------------------------------------…目录BAP 概述核心概念Unicast单播详解Broadcast广播详解PACS能力发现机制ASE音频流端点状态机详解配置流程实战代码示例------------------------------------------------------------------------------------------------------------------------------------------视频链接https://item.taobao.com/item.htm?id1001969040805mi_id000032T4qZX9WZoRwX6YbxlNUaZOfOI6XoxDx0jxsfnwlEcspma21xtw.29178619.0.0---------------------------------------------------------------------------------------------------------------------------------BAP 概述什么是 BAPBAP (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目标延迟值延迟级别典型应用0x01Low (7.5-15ms)游戏、专业音频0x02Balanced (15-30ms)音乐、视频0x03High (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 支持重传机制CISConnected Isochronous StreamCIS 架构: ┌─────────┐ 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 解密BISBroadcast Isochronous StreamBIS 架构: ┌───────────────┐ │ Broadcast │ │ Source │ │ (公共广播) │ └───────┬───────┘ │ BIS 广播 ↓ ┌────┼────┐ ↓ ↓ ↓ ┌───┐┌───┐┌───┐ │耳机││耳机││助听器│ └───┘└───┘└───┘ BIG: Broadcast Isochronous Group BIS: Broadcast Isochronous StreamAuracast™Auracast是 LE Audio 广播音频的商标名称应用场景机场登机广播剧院/电影院音频教堂/清真寺宗教仪式健身房电视音频Auracast 标识: 发射器: 请使用支持 Auracast 的设备收听 接收器: 扫描 → 发现广播 → 加入收听PACS能力发现机制什么是 PACSPACS (Published Audio Capabilities Service)用于设备发布自己的音频能力支持的编解码器采样率帧时长通道数PACPublished Audio Capabilitytypedef 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 配置 ASELC3 典型能力采样率: 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 操作 ASEASE CharacteristicsCharacteristic说明Sink ASE接收音频的 ASESource ASE发送音频的 ASEASE 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 CodecCodec Configured已配置编解码器Config QoS, ReleaseQoS Configured已配置 QoSEnable, ReleaseEnabling启用中Receiver Start ReadyStreaming流式传输中Disable, Update MetadataDisabling禁用中Receiver Stop ReadyReleasing释放中-配置流程实战单播配置完整流程【场景】手机连接 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); }发现 PACSvoid 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); } }配置 ASEvoid 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 配置失败怎么办检查点:PACS 发现是否成功选择的 Codec 参数是否在 PAC 支持范围内QoS 参数是否满足 PHY 和延迟要求Q2: CIS 连接失败检查点:ASE 是否已进入 Streaming 状态CIG/CIS 参数是否正确设备是否支持相应的 PHYQ3: 广播接收不到检查点:广播是否已启动接收端是否扫描到广播是否需要 Broadcast Code总结BAP 核心要点两种模式: Unicast单播和 Broadcast广播三个关键: PACS能力、ASE端点、CIS/BIS传输状态机驱动: ASE 有明确的状态流转配置先行: 必须先配置 Codec 和 QoS才能启用传输