三、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 蓝牙音频概念
-
采样率:采样率指单位时间内对连续模拟信号进行离散化采样的次数,单位为赫兹(Hz)。1s采集的次数
-
位宽:表示单个采样点的振幅值被量化的离散级别数,即每个采样值占用的二进制位数。每个采样点振幅被映射为 216=65536216=65536 个离散值(范围:-32768 ~ +32767)。
-
单/双声道:
- 单声道(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 可选扩展功能
详细解析如下:
- Version (V): 2 bits
- 这个字段用来标识使用的RTP版本号。目前广泛使用的是版本2。其他值如0和1很少见,其中0主要用于早期的实验性软件“vat”中,而1代表了RTP草案阶段。
- Padding §: 1 bit
- 如果设置了这个位,则表示在RTP数据包末尾存在额外的填充字节。这些填充字节不包含任何实际的数据信息,并且通常用于满足某些特定网络传输需求,比如确保整个数据包大小符合某种对齐要求或加密算法的需求。
- Extension (X): 1 bit
- 当该位被设置为1时,表明在标准RTP头之后还附加了一个扩展头。这种情况下,扩展头的第一个字节指出了扩展项的长度(以32位字为单位),随后是具体的扩展信息内容。这对于增加自定义功能非常有用。
- CSRC Count (CC): 4 bits
- 表示贡献源识别符(CSRC)列表中包含了多少个32位长的标识符。每个CSRC ID都对应于一个参与创建当前RTP包内容的来源。这主要用于混合器场景下追踪原始音频/视频流的贡献者。
- Marker (M): 1 bit
- 标记位的作用取决于具体的应用场景或配置文件(profile)。它可能用于标记重要的事件边界,例如视频帧的开始、音频片段的重要变化点等。不同类型的媒体流可能会给此位赋予不同的意义。
- Payload Type (PT): 7 bits
- 有效载荷类型字段用来指定所携带的数据类型。对于多媒体应用来说,它可以区分不同的编解码器输出,比如GSM编码的语音、JPEG压缩的图像或者H.264编码的视频流等。接收端通过检查这一字段来决定如何处理接收到的数据。
- Sequence Number: 16 bits
- 每发送一个新的RTP数据包,序列号就会递增一次。这样可以跟踪丢包情况并保持正确的播放顺序。
- Timestamp: 32 bits
- 时间戳反映了生成第一个八位组的时间点,单位由负载类型定义。它帮助同步多个相关联的媒体流,并支持精确的回放控制。
- 实际上,时间戳增加一并不是我们通常意义上的过了一个微秒,而是增加了一个采样间隔那么长的时间。举个例子来说。不同的采集有不同的采样频率,比如一般的音频是8K的采样频率,也就是一毫秒采集8次数据,也就是每次采样间隔是1/8MS,而timestamp增加1也就意味着增加了一个采样间隔。也就是过了1/8MS。换个例子,如果令一种编码的采样频率是16K,那么timestamp增加1也就意味着系统过了1/16MS。也就是说,再同一个系统中,对不同编码,虽然使用同一个时钟,但timestamp的增长速度是不同的,在这个例子中,采样频率是16K的编码要比8K的快两倍,请记住这个区别。
- Synchronization Source (SSRC) Identifier: 32 bits
- 每个独立的RTP会话参与者都有其唯一的同步源标识符。发送方使用这个ID来让接收方能够区分不同的数据源。
- Contributing Source (CSRC) Identifiers: variable length
- 如上所述,当CC字段非零时,紧跟在固定头部之后的就是一系列32位长的CSRC标识符,数量由CC字段指定。它们提供了关于哪些源对该数据包有所贡献的信息。
9.2 Media Payload
9.3 Frame Header
封包格式为:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
syncword (9C) | |||||||
sampling frequency | blocks | channel mode | allocation_method | subbands | |||
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-328kbps | 16-48kHz / 16bit | 150-250ms | 子带编码 + 自适应PCM量化 | 强制兼容性,硬件资源占用低 | 压缩率高,音质损失明显 | 所有蓝牙设备基础传输 |
AAC | 苹果/MPEG | 64-320kbps | 8-96kHz / 16-24bit | 150-200ms | MDCT变换 + 心理声学模型 | 低码率音质优化,苹果生态兼容 | 二次编码失真,延迟较高 | 苹果设备、流媒体平台 |
LDAC | 索尼 | 330/660/990kbps | 24bit/96kHz | 150-200ms | 改进MDCT + 霍夫曼编码 | 高解析音质,动态码率适应 | 信号稳定性要求高 | 索尼耳机、Hi-Res音频设备 |
aptX | 高通 | 48-576kbps | 24bit/48kHz | 40-200ms | ADPCM差分编码 | 低延迟(LL版),硬件兼容性 | 专利限制,苹果不支持 | 安卓手机、电竞耳机 |
LHDC | Savitech | 128kbps-1Mbps | 24bit/192kHz | 30-150ms | 动态码率 + 空间音频扩展 | 超低延迟(LLAC),超高解析 | 设备支持少,生态未成熟 | 安卓旗舰手机、车载系统 |
- 音质排序:LHDC ≈ LDAC > aptX > AAC > SBC 3 4 11。
- 延迟排序:LHDC LLAC(30ms)< aptX LL(40ms)< SBC(200ms) 11 19。
- 兼容性:SBC(全设备)> AAC(苹果/安卓)> aptX(高通设备)> LDAC/LHDC(特定品牌)
- 适用场景:
- 音乐发烧友:优先LDAC/LHDC。
- 游戏/视频:aptX LL或LHDC LLAC。
- 日常通用:SBC/AAC(兼顾兼容性与基础音质)。