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

三、A2DP协议详解

参考的文档:

https://developer.aliyun.com/article/1171880

https://wlink.blog.csdn.net/article/details/107727900

AVDTP_SPEC_V13.pdf

A2DP_SPEC_V12.pdf

Assigned_Numbers.pdf

一、简介

1 A2DP和A2DTP概念介绍

简介: A2DP(Advanced Audio Distribution Profile)是蓝牙高音质音频传输协议, 用于传输单声道, 双声道音乐(一般在 A2DP 中用于 stereo 双声道) , 典型应用为蓝牙耳机。 A2DP旨在通过蓝牙连接传输高质量的立体声音频流。它使用的基本压缩算法是SBC(Sub-Band Coding)来减小音频数据的大小,同时保持高音质,SBC压缩虽然效率较低,但是是必须支持的基本备用方案。A2DP还支持其他高级编解码器,例如AAC、aptX和LDAC,这些编解码器比SBC提供更好的音质,但这些编解码器的支持取决于设备本身的支持情况。

A2DP数据的流传示意图如下:

画板

2 蓝牙音频概念

  1. 采样率:采样率指单位时间内对连续模拟信号进行离散化采样的次数,单位为赫兹(Hz)。1s采集的次数

  2. 位宽:表示单个采样点的振幅值被量化的离散级别数,即每个采样值占用的二进制位数。每个采样点振幅被映射为 216=65536216=65536 个离散值(范围:-32768 ~ +32767)。

  3. 单/双声道:

  • 单声道(Mono):单一声轨,所有音频信号混合至单一通道输出,无空间方位信息。
  • 双声道(Stereo):独立左(L)、右(R)双通道,通过声道间 电平差(Level Difference)时间差(ITD, Interaural Time Difference) 传递立体声场信息。

A2DP 协议必须支持SBC格式, 其他的格式是可选的,支持的格式如下:

二、AVDTP讲解

1 AVDTP术语概念

携带的信息有

  • SEID(流端点标识符):唯一标识流端点的跨设备标识符,用于信令交互,范围1-15 。
  • 流端点类型(TSEP):标明是音视频源(SRC)还是接收器(SNK),例如耳机为SNK,手机为SRC 。
  • 编解码能力:支持的音频编解码格式(如SBC、AAC、aptX)及参数(采样率、比特率等),通过<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(246, 246, 246);">Get Capability</font>命令协商。
  • 传输会话类型
    • 媒体会话(Media Packet):传输音视频数据,基于RTP协议 9。
    • 恢复会话(Recovery Packet):用于前向纠错(FEC),提升抗干扰能力 9。
    • 报告会话(Reporting Packet):传递QoS统计信息(如延迟、丢包率) 9。
  • 流状态:包括空闲(Idle)、打开(Open)、流传输(Streaming)等状态,用于控制流的生命周期。

2 AVDTP signal 通道的数据格式

回话流程如下:

3 信号格式

参考8.4小节

信号格式为:

以上就是Signal的header format,可以看到分3种封包格式:

1)单一封包

2)开始封包,一般用于封包大小>MTU的拆包的第一个封包

3)继续封包和结束封包,一般用于封包大小>MTU的继续封包和结束封包

字段解析:

2.3.1 Transaction Label:

类似ID,传输标示,4bit,INT角色来填写一个值,ACP必须回送一样的值

2.3.2 Packet Type:

封包类型,有以下几种

2.3.3 Message Type:

消息类型,有以下几种

命令、响应、接收。拒绝

** 2.3.4 RFA:**

表示:省略

2.3.5 Signal Identifier:

** **信令标识符,有以下几种值

**2.3.****6 NOSP **

分片信号包中包含多少个数据包,Start封包会告知后续有多少个封包要传输

3 AVDTP discovery过程讲解

作用:主要用于在设备间发现并获取对方支持的 流端点(Stream End Point, SEP) 信息

3.1 消息作用

1 扫描对端设备的stream end point 有几个,分别是什么类型

3.2 封包格式

3.2.1 SEID

ID 做标识作用

3.3.2 In Use

是否在使用

3.2.3 Media Type

媒体类型

3.2.4 TESP

指示流端点是 SNK 还是 SRC

3.3 抓包分析

btsnoop_hci.zip

4 AVDTP_get_capaibity过程讲解

4.1 作用
拿到每个SEP的具体信息
4.2 命令

4.3 回复

主要是tlv的值

4.3.1 Service Categore为

4.3.2 Length Of Service Capabilities (LOSC):

长度

4.3.3 Service Capabilities Information Elements:

常用的有

4.3.3.1 Media Transport

作用: Media Transport 负责建立、管理和维护音视频流的传输通道,确保数据在设备间高效可靠地传输。

  • 协议支持
    • AVDTP(音视频分布传输协议):定义流端点(SEP)的发现、配置和流控制流程,支持单播和多播传输模式 1 6。例如,AVDTP的Stream Establishment流程用于打开特定SEID(流端点标识符),启动媒体流传输 1。
    • ISOAL(等时适配层):在蓝牙核心规范6.0中增强,通过优化数据分帧和重组机制,降低传输延迟并提高可靠性,适用于LE Audio的同步多设备广播 5 7。
  • 功能细分
    • 流控制:通过Set Configuration、Start/Stop Stream等命令管理流的启停和参数配置 1。
    • 多流支持:例如在TWS耳机中,Media Transport支持左右耳独立音频流的同步传输,减少耳间延迟差异 8。

4.3.3.2 Media Codec

作用: Media Codec 负责对音频数据进行压缩编码和解码,平衡音质、带宽和功耗需求。

  • 核心编解码器
    • LC3(低复杂度通信编解码器):蓝牙LE Audio的强制编解码器,支持16-48kHz采样率及动态比特率调整(32-320kbps),在相同比特率下音质显著优于传统SBC编码,且功耗更低 7 8。例如,LC3在32kHz/64kbps下的音质接近EVS编码,适用于高清语音通话 8。
    • 传统编解码器:如A2DP中的SBC(基础子带编码)、aptX和AAC(苹果设备常用),分别针对不同场景优化音质与延迟 4 6。
  • 技术特性
    • 动态适应:LC3支持PLC(丢包隐藏)技术,在数据包丢失时通过插值算法补偿音频,提升抗干扰能力 7。
    • 多通道支持:LE Audio通过LC3实现多通道音频传输(如立体声、环绕声),并支持广播音频场景下的高同步性

4.3.3.2.1 Media Type

4.3.3.2.2 Media Codec Type

4.3.3.2.3 Media Codec Specific Information Elements

A2DP中的特定的Media Codec

1)Sampling Frequency(采样频率)

  • 含义:音频信号每秒的采样次数,单位为Hz。常见值包括16 kHz、32 kHz、44.1 kHz、48 kHz等。
  • 作用:决定音频信号的频率范围(根据奈奎斯特定理,最高频率为采样频率的一半)。例如,44.1 kHz可覆盖人类听觉范围(20 Hz-20 kHz)。不同的编解码器支持的采样率不同,SBC支持16 kHz至48 kHz的采样频率 1 8。
  • 对音质的影响:采样率越高,音频细节保留越完整,但数据量也越大。

2)Channel Mode(通道模式)

  • 含义:音频通道的配置方式,如单声道(Mono)、立体声(Stereo)、联合立体声(Joint Stereo)或双通道(Dual Channel)。
  • 作用
    • 单声道:仅传输一个声道,适用于语音通话。
    • 立体声/联合立体声:传输左右声道,联合立体声通过共享部分频段信息减少数据冗余 3 8。
    • 双通道:独立处理左右声道,可能提高分离度但增加比特率。例如,SBC的双通道模式可将比特率提升至617 kbps(通过独立分配比特池) 3 8。

3)Block Length(位深)

  • 含义:编码时每个音频块的时间长度,通常以块数(如4、8、12、16)表示。
  • 作用:块长度越长,编码效率越高(压缩比提升),但会增加算法延迟。例如,SBC默认使用16块,对应约4.8 ms的音频数据块 3 8。
  • 对实时性的影响:较短的块长度(如4块)适用于低延迟场景,但可能导致压缩效率下降。

4)Subbands(子带数量)

  • 含义:编解码器将音频信号分割为多个子带(频段)的数量,SBC支持4或8个子带。
  • 作用:子带数量影响频域分析的精细度。8个子带能更精确地分配量化比特,优化高频和低频的编码效果 2 8。
  • 权衡:子带越多,计算复杂度越高,但音质提升边际效应递减。

5)Allocation Method(分配方法)

  • 含义:量化比特在不同子带间的分配策略,常见方法包括Loudness(响度感知)SNR(信噪比优化)
  • 作用
    • Loudness:基于人耳听觉特性,优先为敏感频段分配更多比特,减少听觉冗余 3 8。
    • SNR:均匀分配比特以减少整体量化噪声,但可能牺牲高频细节。
  • 实际应用:SBC默认使用Loudness方法,以优化主观听感

6)Minimum Bitpool Value (最小比特池值)

  • 含义:编解码器允许的最小比特池值,决定最低比特率。
  • 作用:确保基本音质下限。例如,SBC的最小比特池值通常为2,对应最低约10 kbps的比特率 2 3。
  • 应用场景:网络条件较差时,通过降低比特池值维持连接稳定性。

7)Maximum Bitpool Value(最大比特池值)

  • 含义:编解码器允许的最大比特池值,决定最高比特率。
  • 作用:限制编码器的最高比特率以避免带宽过载。例如,SBC的默认最大比特池为53,对应328 kbps(44.1 kHz下) 2 8。
  • 音质影响:较高的比特池值(如实验性SBC XQ模式)可提升音质,接近aptX HD水平

4.3.3.3 Delay Reporting

作用: Delay Reporting 主要用于测量和报告音视频传输中的端到端延迟差异,确保音频与视频的同步性,并优化实时传输的QoS(服务质量)。

  • 延迟同步:在音视频流传输中,由于音频和视频的处理路径不同,可能导致播放不同步。Delay Reporting通过反馈延迟数据,帮助设备动态调整缓冲或播放时序,实现音画同步 1 5。
  • QoS管理:在蓝牙LE Audio中,延迟报告结合LC3编解码器的低延迟特性,支持动态调整编解码参数以适应不同场景(如通话、游戏),减少用户感知的延迟 5 7。
  • 应用场景:例如在蓝牙耳机与手机的视频播放中,Delay Reporting可检测音频流与视频流的延迟差,通过调整音频播放时间戳实现同步

5 AVDTP_set_configure过程详解

作用:配置想要的参数

ACP SEID

  • 作用:标识远端设备(接受方,ACP)的流端点。在配置过程中,发起方(INT)通过此标识符选择并指定远端设备中需要配置的SEP。
  • 场景:例如,当手机(INT)连接蓝牙耳机(ACP)时,手机通过ACP SEID确定耳机支持的音频编码能力和参数(如SBC解码能力、采样率等),从而完成适配配置

INT SEID

  • 作用:标识本地设备(发起方,INT)的流端点。发起方通过此标识符指定自身用于数据传输的SEP。
  • 场景:在配置阶段,发起方需向远端设备声明自身使用的SEP,以确保两端流端点的兼容性。例如,手机在发送音频数据时,需通过INT SEID确定本地音频源的传输参数(如编码格式、声道模式等)

6 AVDTP_delay_report过程详解

作用:为了音画同步,让视频延迟播放

7 AVDTP_open过程详解

作用:它的核心作用是 触发流通道的正式开启,使音视频数据能够通过已协商的参数(如编解码格式、采样率等)进行传输

8 AVDTP_start过程详解

1 作用:AVDTP_START 命令触发设备间音频或视频流的数据传输,将流端点(SEP)状态从 <font style="color:rgba(0, 0, 0, 0.88);">OPEN</font> 切换为 <font style="color:rgba(0, 0, 0, 0.88);">STREAMING</font>,允许数据通过已建立的 L2CAP 数据通道传输

2 协议分析:

3 什么时候触发:

1 source端点击播放时
2 sink端点击播放 发送avrcp play命令

9 AVDTP_音频封包格式

包格式如下:

可以看出是由Media Packet + Header Media Payload + Frame Header

组成

**9.1 Media Packet Header **

文档中解释如下:

Mandatory 必选强制要求

Extension 可选扩展功能

详细解析如下:

  1. Version (V): 2 bits
    • 这个字段用来标识使用的RTP版本号。目前广泛使用的是版本2。其他值如0和1很少见,其中0主要用于早期的实验性软件“vat”中,而1代表了RTP草案阶段。
  2. Padding §: 1 bit
    • 如果设置了这个位,则表示在RTP数据包末尾存在额外的填充字节。这些填充字节不包含任何实际的数据信息,并且通常用于满足某些特定网络传输需求,比如确保整个数据包大小符合某种对齐要求或加密算法的需求。
  3. Extension (X): 1 bit
    • 当该位被设置为1时,表明在标准RTP头之后还附加了一个扩展头。这种情况下,扩展头的第一个字节指出了扩展项的长度(以32位字为单位),随后是具体的扩展信息内容。这对于增加自定义功能非常有用。
  4. CSRC Count (CC): 4 bits
    • 表示贡献源识别符(CSRC)列表中包含了多少个32位长的标识符。每个CSRC ID都对应于一个参与创建当前RTP包内容的来源。这主要用于混合器场景下追踪原始音频/视频流的贡献者。
  5. Marker (M): 1 bit
    • 标记位的作用取决于具体的应用场景或配置文件(profile)。它可能用于标记重要的事件边界,例如视频帧的开始、音频片段的重要变化点等。不同类型的媒体流可能会给此位赋予不同的意义。
  6. Payload Type (PT): 7 bits
    • 有效载荷类型字段用来指定所携带的数据类型。对于多媒体应用来说,它可以区分不同的编解码器输出,比如GSM编码的语音、JPEG压缩的图像或者H.264编码的视频流等。接收端通过检查这一字段来决定如何处理接收到的数据。
  7. Sequence Number: 16 bits
    • 每发送一个新的RTP数据包,序列号就会递增一次。这样可以跟踪丢包情况并保持正确的播放顺序。
  8. Timestamp: 32 bits
    • 时间戳反映了生成第一个八位组的时间点,单位由负载类型定义。它帮助同步多个相关联的媒体流,并支持精确的回放控制。
    • 实际上,时间戳增加一并不是我们通常意义上的过了一个微秒,而是增加了一个采样间隔那么长的时间。举个例子来说。不同的采集有不同的采样频率,比如一般的音频是8K的采样频率,也就是一毫秒采集8次数据,也就是每次采样间隔是1/8MS,而timestamp增加1也就意味着增加了一个采样间隔。也就是过了1/8MS。换个例子,如果令一种编码的采样频率是16K,那么timestamp增加1也就意味着系统过了1/16MS。也就是说,再同一个系统中,对不同编码,虽然使用同一个时钟,但timestamp的增长速度是不同的,在这个例子中,采样频率是16K的编码要比8K的快两倍,请记住这个区别。
  9. Synchronization Source (SSRC) Identifier: 32 bits
    • 每个独立的RTP会话参与者都有其唯一的同步源标识符。发送方使用这个ID来让接收方能够区分不同的数据源。
  10. Contributing Source (CSRC) Identifiers: variable length
    • 如上所述,当CC字段非零时,紧跟在固定头部之后的就是一系列32位长的CSRC标识符,数量由CC字段指定。它们提供了关于哪些源对该数据包有所贡献的信息。

9.2 Media Payload

9.3 Frame Header

封包格式为:

01234567
syncword (9C)
sampling frequencyblockschannel modeallocation_methodsubbands
bitpool
crc_check

1. Syncword (0x9C)

  • 作用:同步字,用于标识SBC帧的起始位置,确保接收端正确解析数据流的边界。
  • :固定为0x9C(二进制<font style="color:rgba(0, 0, 0, 0.88);">10011100</font>),在蓝牙A2DP协议中作为SBC帧的唯一标识 1 4。
  • 意义:接收端通过检测该字段实现帧对齐,若丢失或错误可能导致音频流解析失败。

2. Sampling Frequency(采样频率)

  • 定义:音频信号的采样率,决定音频频宽与质量。
  • 可选值:16 kHz、32 kHz、44.1 kHz、48 kHz。
  • 编码规则
    • 解码器必须支持44.1 kHz和48 kHz 1 7。
    • 编码器需至少支持44.1 kHz或48 kHz中的一种。
  • 位表示:通常由2位字段表示,例如00=16 kHz,01=32 kHz,10=44.1 kHz,11=48 kHz 1 4。

3. Blocks(块数)

  • 定义:每个SBC帧包含的音频块数量,直接影响编码延迟和压缩效率。
  • 可选值:4、8、12、16个块。
  • 规则
    • 编码器和解码器必须支持所有块数 1 7。
    • 块数越多,编码延迟越高,但压缩效率可能提升。
  • 位表示:通常由2位字段编码,例如00=4块,01=8块等 4。

4. Channel Mode(通道模式)

  • 定义:音频通道的编码方式,决定立体声效果与带宽占用。
  • 模式分类
    • Mono(单声道):单通道音频。
    • Dual Channel(双通道):独立编码左右声道,适用于双耳独立信号。
    • Stereo(立体声):左右声道独立编码。
    • Joint Stereo(联合立体声):利用声道间冗余压缩数据,提升效率 1 4。
  • 规则:解码器需支持全部模式,编码器至少支持Mono和一种其他模式。

5. Allocation Method(比特分配方法)

  • 定义:决定子带中比特分配的算法类型。
  • 类型
    • SNR(信噪比优化):根据子带信号的信噪比分配比特,适用于高保真场景。
    • Loudness(响度优化):基于人耳听觉特性分配比特,优先保留高频细节 1 5。
  • 规则:解码器需支持两种方法,编码器至少支持Loudness。

6. Subbands(子带数量)

  • 定义:将音频信号分割的子带数,影响频域分辨率。
  • 可选值:4或8个子带。
  • 规则
    • 解码器必须支持两种子带数。
    • 编码器需至少支持8个子带 1 4。
  • 影响:子带数越多,频域划分越细,但计算复杂度增加。

7. Bitpool(比特池)

  • 定义:动态控制每块分配的比特总数,直接影响音频质量和码率。
  • 范围:2~250,具体最大值受通道模式和子带数限制(例如Joint Stereo模式下上限为32×子带数) 1 5。
  • 作用
    • 值越大,比特分配更灵活,音质提升但延迟和带宽需求增加。
    • 低Bitpool可降低功耗,适用于移动设备 9。

8. CRC Check(循环冗余校验)

  • 作用:检测帧头传输错误,确保关键参数正确性。
  • 计算范围:覆盖Syncword至Bitpool字段。
  • 规则:若校验失败,接收端可能丢弃该帧或请求重传 1 6。

9. RFA(保留字段)

  • 定义:Reserved for Future Use,协议中未定义的保留位。
  • 用途:用于未来扩展或厂商自定义功能,当前需置0 4 7。

10. Join[sb](联合立体声子带标记)

  • 定义:仅在Joint Stereo模式下有效,标记哪些子带采用联合编码。
  • 规则
    • 每个子带由1位标记(0=独立编码,1=联合编码)。
    • 子带数由Subbands字段决定(4或8位) 1 4。
  • 目的:通过共享声道间相似频段信息,减少冗余数据,提升压缩率。

封包内容详解:A2DP文档

10 AVDTP_suspend过程详解

11 AVDTP_close过程详解

三、A2DP讲解

A2DP主要是负责编解码

1 A2DP协议讲解

蓝牙音频编解码协议对比表

协议开发者码率范围采样率/位深延迟核心技术主要优势主要劣势典型应用场景
SBC蓝牙技术联盟 (SIG)64-328kbps16-48kHz / 16bit150-250ms子带编码 + 自适应PCM量化强制兼容性,硬件资源占用低压缩率高,音质损失明显所有蓝牙设备基础传输
AAC苹果/MPEG64-320kbps8-96kHz / 16-24bit150-200msMDCT变换 + 心理声学模型低码率音质优化,苹果生态兼容二次编码失真,延迟较高苹果设备、流媒体平台
LDAC索尼330/660/990kbps24bit/96kHz150-200ms改进MDCT + 霍夫曼编码高解析音质,动态码率适应信号稳定性要求高索尼耳机、Hi-Res音频设备
aptX高通48-576kbps24bit/48kHz40-200msADPCM差分编码低延迟(LL版),硬件兼容性专利限制,苹果不支持安卓手机、电竞耳机
LHDCSavitech128kbps-1Mbps24bit/192kHz30-150ms动态码率 + 空间音频扩展超低延迟(LLAC),超高解析设备支持少,生态未成熟安卓旗舰手机、车载系统
  1. 音质排序:LHDC ≈ LDAC > aptX > AAC > SBC 3 4 11。
  2. 延迟排序:LHDC LLAC(30ms)< aptX LL(40ms)< SBC(200ms) 11 19。
  3. 兼容性:SBC(全设备)> AAC(苹果/安卓)> aptX(高通设备)> LDAC/LHDC(特定品牌)
  4. 适用场景
    • 音乐发烧友:优先LDAC/LHDC。
    • 游戏/视频:aptX LL或LHDC LLAC。
    • 日常通用:SBC/AAC(兼顾兼容性与基础音质)。
http://www.xdnf.cn/news/276805.html

相关文章:

  • 高可用架构设计——服务接口高可用
  • 北极花 APP:开启生物多样性调查新模式,助力生态保护
  • Lesson 16 A polite request
  • bc 命令
  • 系统架构设计师:设计模式——行为设计模式
  • Go语言chan底层原理
  • el-input Vue 3 focus聚焦
  • 无人机视觉:连接像素与现实世界 —— 像素与GPS坐标双向转换指南
  • 【Unity】使用XLua进行热修复
  • Nginx 核心功能之正反代理
  • 高等数学第三章---微分中值定理与导数的应用(§3.6 函数图像的描绘§3.7 曲率)
  • 开源 FEM(有限元分析)工程
  • 工业元宇宙:从虚拟仿真到虚实共生
  • C++负载均衡远程调用学习之实时监测与自动发布功能
  • Day110 | 灵神 | 二叉树 | 根到叶路径上的不足节点
  • Qt6 学习指南:前言+安装基本依赖
  • C++名称空间
  • Python 浮点数(float)类型详解
  • 苍穹外卖12
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】3.4 数据重复与去重(IDENTITY COLUMN/UNIQUE约束)
  • 什么是unordered_set?用大白话说
  • 智能工厂自主优化:从局部调优到全局演进
  • NPP库中libnpps模块介绍
  • 【时时三省】(C语言基础)怎样定义和引用一维数组
  • C++23 std::tuple与其他元组式对象的兼容 (P2165R4)
  • SpringMVC-第二章之RequestMapping注解详解
  • 【ArcGIS微课1000例】0144:沿线或多边形要素添加折点,将曲线线段(贝塞尔、圆弧和椭圆弧)替换为线段。
  • 什么是JDBC
  • 算法每日一题 | 入门-顺序结构-大象喝水
  • 课程10. 聚类问题