一篇深入读懂蓝牙音频!

article/2025/10/19 23:50:25

一、蓝牙简介

蓝牙是一种无线通讯技术标准,用来让设备之间在短距离内交换资料,最早由瑞典的爱立信公司在 1994 年发布。提出蓝牙标准的目的很简单,就是简化电子设备之间的数据交互过程。那个时候手机刚刚开始流行,用手机跟耳机或电脑进行无线连接成了一个很强劲的需求,蓝牙协议很大程度上也是服务于这类需求。

二、蓝牙的发展历史

蓝牙 1.0 (1999年)早期的蓝牙版本,有数据泄露风险,并没有被广泛应用;

蓝牙 1.2 蓝牙技术一直在迭代,发布于 2003 年的蓝牙 1.2 是蓝牙真正走向安全可用的标志;

蓝牙 2.0(2004 年)则着重提高多任务处理能力,同时支持双工模式,可以一边语音通讯,一边传输文件;

蓝牙 3.0(2009 年)引入高速传输,加大带宽,客观上挤占 WiFi 的位置,增加了功耗和成本;

蓝牙 4.0(2010 年)重新找准定位,引入 BLE 概念,即 Bluetooth Low Energy 低功耗蓝牙;

蓝牙 5.0(2016 年)让蓝牙在低功耗下具备更强大的传输能力,提高了安全性和可达性,逐渐成为目前主流。

蓝牙 5.2(2020 年)聚焦LE Audio,发布多个LE音频规范和全新的LC3高品质低延迟编码器,增强蓝牙音频体验。

三、蓝牙音频规范

组成蓝牙协议的基石是一个个规范(Profile),蓝牙标准里目前有二十多个规范,一个规范其实就是一种通讯的类型或者协议,不同规范覆盖不同的应用。

其中有三个规范聚焦于音频数据的传输。传统的A2DP和HFP以及最新的BAP

1.HFP规范

其中HFP 基于SCO(Synchronous Connection Oriented)链路用于双向传输通话语音。SCO链路具有同步传输特性,但无线传输有错误风险为保证同步性数据的完整、正确性就无法保障所以HFP采用的编码器需要具备容错能力。

2.A2DP规范

A2DP(Advanced Audio Distribution Profile),蓝牙立体声音频传输规范,典型应用为蓝牙耳机。蓝牙A2DP规范在协议栈中的位置如下图:

A2DP协议的音频数据在ACL Link上传输,这与SCO上传输的语音数据有本质区别。A2DP不包括远程控制的功能,远程控制的功能则依赖AVRCP协议规范。A2DP是建立在AVDTP协议之上的高层协议,AVDTP定义了蓝牙设备之间数据流句柄的参数协商,建立和传输过程以及相互交换的信令实体形式,该协议是A2DP框架的基础协议。

蓝牙A2DP数据包基于AVDTP协议进行传输,其层级关系如下数据包在每一层都有自己的包头。

进行数据传输之前发送端(SRC)与接收端(SNK)需进行一系列信令交互以确认双方传输数据的参数之后才能开始数据传输,其信令交互流程如下:

3.蓝牙音频编码器

同为近距离无线通信蓝牙相较于WIFI优势在于功耗和其便携的插入性只需按照规范实现相应的协议即可实现快捷插拔,但其劣势传输带宽也显而易见,如今WIFI传输速率已达到Gbps级别而蓝牙传输带宽仅2Mbps,而早期的蓝牙传输速率仅为几百Kbps。

而对于音乐音频来说基本的CD品质也需要1.4Mbpsr如果直接传输原始音频则可能耗尽带宽,抗干扰性能差易卡音断音,所以传输音频数据必须在Source端压缩编码,在Sink端解压缩。

而如何编码解码蓝牙联盟标准规定SBC是强制支持的,AAC/MP3可选的支持(Optional Codec),除了这些外,也可以有厂家自己的编码形式(Vendor Specific A2DP Codecs),例如高通的APT-X、索尼的LDAC、以及LHDC。

 资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

4.A2DP音质和延迟

前面讲到为了在蓝牙通道传输音频数据必须将音频数据进行压缩编码后传输,而这里的压缩和常规认知的文件压缩、解压后得到完全一致的源文件不一样,为了适应蓝牙传输的带宽音频数据被压缩后占用的带宽很小这种压缩为有损压缩。以SBC为例压缩后仅占用200多Kbps 压缩比达到1/7,而这样的有损压缩势必损失音乐的音质。

常见编码器占用带宽如下表。

SBC是A2DP协议强制规定的编码格式。利用人耳对不同频率信号的感知灵敏度不同的特性,在人的听觉(不敏感的部位采用较粗糙的量化,在敏感部位采用较细的量化,以获得更好的主观听觉效果,是音质最差的一种编码器。AAC则是协议规范可选支持的一种高品质编码器,后来实现厂商提出了apt-X,LDAC,LHDC 等高带宽占用的高品质音频编码器,其中LDAC/LHDC更是支持Hi-RES标准认证的96K高解析音频。LC3则是跟随全新一代LE音频发布的LE音频强制支持的高品质低带宽编码技术。总体来说更高的码率意味着更好的音质,然而最新一代LC3的出现则可能打破这一规律,LC3和SBC的主观对比打分如下,在码率为345 kbps的情况下,SBC的分数略高于4.0,但LC3在码率160 kbps情况下即可达到比SBC更高的主观评分。

前面提到蓝牙音频传输必须先进行编码,而编码是按照帧进行的既一定长度的数据进行一次编码压缩,这里累积到足够数据再编码,设备端收到数据再解码播放的过程则会造成延迟。网络上的帖子大多将蓝牙音频延迟归咎于此,其实不然,前文提到的几种编码器编码帧最长的为AAC 一帧长度达到23ms,蓝牙传输一帧的数据也能(通常)在几ms间完成,然而实际延迟却是这个数据的好几倍达到100ms以上,SBC一帧更是只有2ms不到,但其延迟却达到200以上。

实际上影响延迟的主要因素是蓝牙传输的稳定性。理想情况下发送蓝牙音频发送端等时间间距均匀的发送数据包,接收端等时间间距均匀的接收数据,这种情况下接收端可稍微延迟后将收到数据通过喇叭送出,在喇叭播放完这包数据之前可收到下包数据继而能够连续不断的播放,此时蓝牙音频的时延取决于发包间隔和传输时间。

然而现实情况总是不如人意,蓝牙作为一种无线传输协议传输数据可能受到周边无线设备或强电磁设备比如电磁炉、微波炉等设备干扰导致数据出错重传,实际上即使没有干扰由于蓝牙器件本身的性能、或是因为无线传输的特性都是有可能出现传输错误的。传输错误重传导致其中某些包重传次数多传输时间变长,接收端收到的数据包并不是等时间均匀的。这种情况下接收端想要流畅播放必须先缓存一定时间长度的数据之后再进行播放,以防止其中包晚到导致播放不连续,这种情况下真实主要因素是为了抵抗网络传输不稳定性而人为添加的延迟(缓存),而传输码率越高网络波动带来的影响会更大也就需要更长的延迟来防止卡顿。

5.BLE Audio

LE Audio 核心框架如下

LE Audio是新一代蓝牙音频传输协议,基于低功耗蓝牙BLE无线通信,其主要特点有:

1、超低功耗,LE本身即为低功耗蓝牙,LE Audio更是首创每只耳机独立传输单通道数据,大幅缩减每只耳机的数据传输量,将传输和解码功耗降低。

2、全新高音质、低功耗音频解码器LC3(Low Complexity Communications Codec)

3、LE同步通道(ISOC:Low Energy Isochronous Channels)

4、支持多重串流音频(Multi-Stream Audio)

5、支持广播音频技术(Broadcast Audio)

LE Audio正是为了解决前文传统蓝牙音频的缺点:音质、延迟,以及双耳无线耳机和多连接问题而提出的下一代蓝牙音频方案。LE Audio 从蓝牙底层协议出发在数据流层面定义了新音频的传输机制LE Isochronous Channels。该同步通道同时支持连接模式和非连接模式。

一对一连接模式采用LE-CIS (LE Connected Isochronous Stream)逻辑传输通道,清除机制将延迟数据flush掉,保障接收端定时接收到数据从而缩减接收端的buffer大幅降低延迟。不同的LE-CIS组成CIG(Connected Isochronous Groups),同一个CIG内的CIS具有相同的时间戳,以保证同一个group内的数据是同步的,最明显的应用是耳机,左耳和右耳分别是一个CIS,他们组成一个CIG,相互之间的时间是同步的。

一对多非连接广播模式,称作是BIS(Broadcast Isochronous Stream),多个BIS可以组成一个BIG。广播模式的同步是通过一个周期广播的PDU实现的,该PDU包含有针对每个BIS的时间戳,一旦同步,接收方便可以称为同步接收者。同样的例子,如果对于一个同一个广播者,一群人中的每个人左右可同时同步接收该广播音频信号。

四、结语

移动通信技术取缔了家家户户的电话线、WIFI通信技术取代了无所不见得网线。自1998年来,蓝牙和蓝牙音频协议经过多次更新,从仅支持单声道传输到如今真无线(TWS)耳机,从仅支持极低音质传输到如今LHDC Hi-Res,蓝牙音频成长迅速,正逐渐走进每个人的身边取代人们最后的半米线(耳机线)。随着蓝牙5.2 BLE Audio技术的成熟 蓝牙广播音频可能走进公共场所,多设备间低功耗音频串流,为 TWS 真无线立体声提供更多可能,为未来的蓝牙音频带来更大的想象空间。

 


http://chatgpt.dhexx.cn/article/mMqFrHH4.shtml

相关文章

system.ArgumentException:DataGridViewComboBoxCell值无效

原因是初始化的时候给ComboboxCell绑定了一系列的值,但是真正赋值的时候却给了一个不在那一系列值范围中的值,所以就报了这个错 在开发的时候难免会因为数据的问题出现这个问题,为了不让系统崩掉,就要处理这个错误信息 但是怎么…

“System.ArgumentException”类型的未经处理的异常在 mscorlib.dll 中发生

报错图示: 项目描述: 公司项目,买的个性化框架,从SVN拉取之后,在VS中重新生成了下解决方案(补全缺少的文件),运行就报这个错误了。 错误原因: 开始怀疑app.config里面…

VRTK4.0报错ArgumentException: Input Axis Tilia.Input.UnityInputManager_Axis1 is not setup.

VRTK4.0使用Input.UnityInputManager.OpenVR.LeftController预制体运行报错 ArgumentException: Input Axis Tilia.Input.UnityInputManager_Axis1 is not setu To change the input settings use: Edit -> Settings -> Input 这是因为inputManger里面的Axes不对&#x…

【Unity】Post-Processing 问题 ArgumentException: Kernel ‘MultiScaleVODownsample1‘ not found. UnityEngine

这个问题是当windows 的项目切换到 其他平台的项目的时候,后处理文件中的compute shader配置是不一样的 解决途径: 1.关闭相关Post-processing values and Post-processing Layers 报错停止 2.重新导入 Post-processing 3.新建Post-processing profiles

System.ArgumentException:“‘gb2312‘ is not a supported encoding name.

在工具栏》NuGet包管理器》管理解决方案的NuGet程序包中,搜索 System.Text.Encoding.CodePages并安装 System.Text.Encoding.CodePages Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); StreamReader sr new StreamReader(fs, Encoding.GetEncoding("G…

System.ArgumentException:“被指定为此窗体的 MdiParent 的窗体不是 MdiContainer

在C#中添加子窗口时报异常 解决方法 在主函数中添加代码:this.IsMdiContainer true;

C#中:System.ArgumentException: 指定的值含有无效的 CRLF 字符。 参数名: value

调用第三方接口的时候会一直出现这个问题, url ConfigurationManager.AppSettings["Url"] "/user/api/account/getAccount?UserName" UserName; HttpWebRequest request WebRequest.Create(url) as HttpWebRequest; …

【解决】ArgumentException: GetComponent requires that the requested component ‘XX‘ derives from...

开发平台&#xff1a;Unity 2020 编程平台&#xff1a;Visual Studio 2020 使用语言&#xff1a;CSharp   一、问题描述 备注&#xff1a;这是一个开发者对 Unity 认知存在错误所产生的方法。 问题代码信息&#xff1a; var thisMat transform.GetComponent<Materials&g…

Unity报错 ArgumentException: The Thing You Want To Instantiate Is Null.

&#xff08;自学Unity&#xff0c;练手小游戏“坦克大战”&#xff0c;遇到了bug&#xff0c;卡了好一会儿&#xff0c;随手记录一下解决方法&#xff09; 问题描述 Console窗口的报错本来还能运行的通&#xff0c;不知道误碰了什么就报错了 原因 脚本尝试实例化一个没有…

ArgumentException: JSON parse error: Invalid value.

迭代文件夹下的文件反序列化json遇到【ArgumentException: JSON parse error: Invalid value.】错误&#xff0c;检查下是不是meta文件忘记排除了&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&…

Unity :ArgumentException: method arguments are incompatible

报错截图&#xff1a; ArgumentException: method arguments are incompatible。 中文翻译&#xff1a; 参数异常:方法参数不兼容。 什么时候出现&#xff1a; 在点击UI的Button按钮时。 原因&#xff1a; 在Button的事件中有个一个绑定丢失了。 解决办法&#xff1a; 移除就…

C# ArgumentException和FormatException异常解析和实例

本文主要演示和说明如何 使用ArgumentException类 和FormatException类进行异常捕捉和处理。 ArgumentException参数异常 A non-null argument that is passed to a method is invalid. 一个传递给方法的非空参数无效。 ArgumentException是一个自定义“合法参数”的异常&…

dhcp动态获取ip 详细实验流程

简介 DHCP&#xff08;动态主机配置协议&#xff09;是一个局域网的网络协议。指的是由服务器控制一段IP地址范围&#xff0c;客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情况下&#xff0c;DHCP作为Windows Server的一个服务组件不会被系统自动安装…

H3C交换机配置镜像命令及示例

配置H3C镜像&#xff08;端口镜像配置命令&#xff09; 1.1.1 display mirroring-group display mirroring-group命令用来显示镜像组的信息 【命令】display mirroring-group { group-id | all | local | remote-destination | remote-source }【视图】任意视图【缺省用户角…

静态路由

路由概括 路由&#xff1a;从源主机到目标的转发过程 路由表的形式 路由器中维护的路由条目的集合 路由表根据路由表做路径选择 根据路由表转发数据 路由表的形式 直接网段 配置IP地址、端口哈UP状态、形成直连路由 非直连网段 静态路由 静态路由是由管理员在路由器中手动…

静态路由实验作业

第一步&#xff1a;划分子网 一共需要14个网段&#xff0c;包括6个骨干链路和8个环回接口。 在192.168.1.0/24上进行子网划分&#xff0c;划分如下&#xff1a; 192.168.1.0/24192.168.1.000.00000/27 ----骨干链路192.168.1.000 000 00/30 --- 192.168.1.0/30192.168.1.000…

生成树(STP)

1.详细说明STP的工作原理 在二层交换网络中&#xff0c;逻辑的阻塞部分的接口&#xff0c;实现从跟交换机到所有节点唯一的路径称为最佳路径&#xff0c;生成一个没有环路的拓扑。当最佳路径出现故障时&#xff0c;个别被阻塞的接口将打开&#xff0c;形成备份链路。 2. STP的…