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

【经典蓝牙】蓝牙 A2DP协议分析

A2DP 介绍

        A2DP(Advanced Audio Distribution Profile)是蓝牙高音质音频传输协议, 用于传输单声道, 双声道音乐(一般在 A2DP 中用于 stereo 双声道) , 典型应用为蓝牙耳机。

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

注意A2DP协议要与AVRCP协议区分开。 A2DP是传输音频的,而AVRCP是用来控制音频的。



蓝牙架构如下图:



 





角色介绍



        A2DP 的角色分为 Source(SRC) SINK(SNK) : 发送音频的称为 Source,接收音频的称为Sink。 例如手机连接蓝牙耳机播放音乐, 那么手机就是做 source 设备,蓝牙耳机就是sink 设备。



数据流





 





音频数据流交互如上图:

● A2DP source 的发送流程

SOURCE端 收集到 PCM 数据, 然后发送到 A2DP, A2DP 经过 codec PCM lib(SBC,MPEG-1,2 AudioMPEG-2,

4 AACATRAC family 或者自定义 encoder pcm lib)压缩成特定的音频格式, 然后交给 AVDTP, AVDTP 转交给 L2CAP,L2CAP 通过 ACL 格式转交给 HCI, 然后到达 BT chip, 通过 RF 射频出去。

● A2DP sink 的接收流程

SINK端通过 RF 接收进来数据, 然后通过 ACL 交给 HCI, 然后交给 L2CAP,L2CAP 交给 AVDTP, AVDTP 交 给 A2DP , A2DP 收 到 的 是 remote 经 过 压 缩 的 数 据 , 此 时 通 过 codec pcm lib(SBC,MPEG-1,2 AudioMPEG-2, 4 AACATRAC family或者自定义encoder pcm lib)解压成PCM 数据, 然后交于声卡播放 。





A2DP编码数据传输格式



编码格式支持

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





 







SBC 编码格式介绍



下面重点介绍下A2DP协议中SBC的编码的element数据协议格式,其他格式不做说明。element的整个数据格式如下:





 





下面具体分析下每个字段的含义:



Sampling Frequency: 这部分是采样频率, Source 端强制要求 44.1KHz, 48KHz 支持一种, Sink要求 44.1KHz,48Khz 都支持, 对应的值如下图:







 





通道模式: Sink端要求全支持。



 

 



Block Length: 块长度



 









Subbands: 次频带



 









Allocation Method: 配置方法



 











Minimum Bitpool Value 和Maximum Bitpool Value表示编码质量。

在播放设备中可以设置 SBC 编码质量, 这个值叫 bitpool, 大概 1 bitpool = 6~7 kbit/s。 SBC 是一种复杂度较低的编码格式, 同等码率下音质稍差, 根据这个网站上的比较, 最高 328 kbit/s 的 SBC 音质大约介于 224 kbit/s 到 256 kbit/s 的 MP3 之间。 此外, 设置不当、 信号差、 设备不支持高 bitpool 等都会造成传输码率下降而使音质下降, 耳机或音箱本身的音质也是很重要的因素。 以下为不同的 bitpool 的码率 :





 





Sink端应该将2作为最小的bitpool值,最大的bitpool值应该等于上图中的高编码质量中的的bitpool值。





SBC数据流格式



SBC数据流是由一个头部和数据流(或者)组成。





 







头部Header的长度是一个字节, bit字段如下图:



 







F bit : 表示是否被分包, 分包为1, 不分包为0

S bit: 表示是否起始分包 起始分包为1 否则为0

L bit : 表示否是是最后一个分包。 为1表示是最后一个分包, 否则为0



Number of frames : 表示分包数。

●如果F bit为0,即数据不分包,则该字段表示的是数据包的帧数。

●如果F bit 为1,即数据分包,则该字段表示的是数据包剩余的分包数(包括当前分包)。





其他编码格式咱不做介绍。。。

http://www.lryc.cn/news/21715.html

相关文章:

  • Objective-C 构造方法的定义和声明规范
  • Matlab图像处理学习笔记
  • 笔记(三)——迭代器的基础理论知识
  • 没有公网ip怎么外网访问nas?快解析内网端口映射到公网
  • spring integration使用:消息转换器
  • Vue3电商项目实战-商品详情模块7【21-商品详情-评价组件-头部渲染、22-商品详情-评价组件-实现列表】
  • 地址,指针,指针变量是什么?他们的区别?符号(*)在不同位置的解释?
  • 【MongoDB】一、MongoDB的安装与部署
  • 《爆肝整理》保姆级系列教程python接口自动化(二十三)--unittest断言——上(详解)
  • MySQL的mvcc
  • vite:常见的配置
  • 计算机图形学:liang算法和Cyrus-Beck算法
  • React组件之间的通信方式总结(上)
  • C++17 nodiscard标记符
  • SAP 寄售业务的标准流程
  • 操作系统高频知识
  • 加载预训练模型,模型微调,在自己的数据集上快速出效果
  • VScode远程连接服务器-过程试图写入的管道不存在-could not establist connection to【已解决】
  • 电子技术——B类输出阶
  • 【老卫搬砖】034期:HarmonyOS 3.1 Beta 1初体验,我在本地模拟器里面刷短视频
  • Day901.内部临时表 -MySQL实战
  • jstatd的启动方式与关闭方式
  • _improve-3
  • C++——异常
  • MVVM 架构进阶:MVI 架构详解
  • 有没有必要考PMP证书?
  • 1 机器学习基础
  • java基础系列(六) sleep()和wait() 区别
  • Urho3D序列化
  • 企业级信息系统开发学习1.3——利用注解配置取代Spring配置文件