原文:https://habr.com/en/articles/456182/

智能手机市场大规模取消了3.5毫米音频插孔,这改变了耳机行业,无线蓝牙耳机已经成为了许 多用户听音乐和在耳机模式下进行通信的主要方式。

蓝牙设备制造商很少公开详细的产品规格,互联网上的蓝牙音频文章相互矛盾,有时甚至是错误的。它们没有讲述所有功能,而且经常发布相同的虚假信息。

让我们尝试理解协议、蓝牙堆栈的功能、耳机和扬声器、音乐和语音的蓝牙编解码器,找出影响传输音频质量和延迟的因素,学习如何捕获和解码有关支持的编解码器和其他设备功能的信息。

TL;DR

  • SBC 编解码方案足够好
  • 每个耳机都有已经设置好的均衡器和后处理(post processing)配置。
  • aptX 并没有广告说的那么好
  • LDAC 是营销废话
  • 语音音频质量仍然较低
  • 浏览器能够执行使用 emscripten 从 C 编译为 WebAssembly 的音频编码器,而且它们甚至不会出现卡顿。

通过蓝牙播放音乐

蓝牙的功能组件由配置文件定义——规范中正式记录的特性。蓝牙音乐使用高质量的音频 A2DP 传输配置文件进行传输。A2DP 标准于2003年采纳,自那时起就没有发生重大变化。

该配置文件标准化了一个强制性的编解码器——SBC,这是一种专为蓝牙创建的低计算复杂度编解码器,以及三种额外的编解码器。人们还可以使用自己实现的、未包含在A2DP中的供应商特定编解码器。

截至2019年6月,我们生活在这幅 XKCD 漫画中,拥有14种A2DP编解码器:

  • SBC - 包含在 A2DP 中,被所有设备支持。
  • MPEG-1/2 Layer 1/2/3 - 包含在 A2DP 中:广为人知的MP3,数字电视中常见的MP2,以及过时的MP1。
  • MPEG-2/4 AAC - 包含在 A2DP 中。
  • ATRAC - 索尼的旧编解码器,包含在A2DP中。
  • LDAC - 索尼的新编解码器。
  • aptX - 1988年的编解码器。
  • aptX HD - 与aptX相同,但编码配置文件不同。
  • aptX Low Latency - 完全不同的编解码器,没有软件实现的aptX,具有更低的缓冲区。
  • aptX Adaptive - 另一个高通编解码器。
  • FastStream - 伪编解码器,SBC的双向修改。
  • HWA LHDC - 华为的新编解码器。
  • Samsung HD - 由2种设备支持。
  • Samsung Scalable - 由2种设备支持。
  • Samsung UHQ-BT - 由3种设备支持。

您可能会想知道,如果蓝牙有EDR(Enhanced Data Rate),允许您以2或3 Mb/s的速度传输数据,而未压缩的双通道16位PCM仅需1.4 Mb/s,我们为什么首先需要编解码器?

蓝牙的数据传输

蓝牙中有两种类型的数据传输:异步连接无关(Asynchronous Connection Less,简称 ACL),用于无需建立连接的异步传输;另一种是同步连接导向(Synchronous Connection Oriented,简称SCO),用于需要建立连接的同步传输。

数据传输使用时分(分割时间)方案,并为每个传输的数据包改变频率通道(跳频 FH/时分双工 TDD)。时间被划分为625微秒的时间间隔,称为时隙。其中一个设备在偶数时隙传输,另一个在奇数时隙传输。一个传输的数据包可以占用1、3或5个时隙,具体取决于数据的大小和传输模式。如果数据包足够大,并且使用了多于一个时隙的传输模式,数据将在偶数和奇数时隙中传输,直到传输结束。在一秒钟内,如果每个数据包占用1个时隙,并且两个设备持续传输和接收数据,你可以接收和发送最多1600个数据包。

在宣传或蓝牙官网上提到的 2Mbps 至 3Mbps 的 EDR 传输速率是指:所有数据(包括所有协议的报头,用于封装数据)双向同时传输的最大信道数据传输速率。实际的数据传输速率会有很大的变化。

Asynchronous method is used for music streaming, almost always using 2-DH5 and 3-DH5 type packets, which carry the maximum amount of data in 2 Mb/s and 3 Mb/s EDR modes respectively and occupy 5 time division slots.

异步传输用于音乐流媒体传输,几乎总是使用2-DH5和3-DH5类型的数据包,这些数据包在2 Mbps和3 Mbps EDR模式下分别携带最大数量的数据,并且占用5个时分时隙。

使用5个时隙进行传输的一个设备的示意图,以及使用1个时隙进行传输的另一个设备(DH5/DH1): 使用5个时隙进行传输的一个设备的示意图,以及使用1个时隙进行传输的另一个设备(DH5/DH1)

根据时分复用的原则,如果我们在发送一个数据包后,第二个设备没有向我们传输任何东西或只传输了一个小数据包,我们必须等待625微秒的时隙,如果第二个设备以大数据包进行传输,则需要更多的时间。如果多于一个设备连接到手机(例如耳机、智能手表和健身手环),那么传输时间将在它们之间共享。

A2DP 音频流媒体需要在特殊的传输协议 L2CAP 和 AVDTP 中进行封装,这会从数据包中最大可能的音频负载量中扣除16字节。

数据包类型插槽数量每个数据包的最大字节数最大 A2DP 有效负载字节数最大 A2DP 有效载荷比特率
2-DH33367351936 Kb/s
3-DH335525361429 kb/s
2-DH556796631414 kb/s
3-DH55102110052143 kb/s

在现实世界条件下,特别是在嘈杂的2.4 GHz频段和偶尔的服务数据传输中,1414kbps 和 1429 kbps 是不足以传输未压缩的音频的。EDR 的 3 Mbps 对传输功率和信噪比有较高要求,因此即使在 3-DH5 模式下,也不可能舒适地传输 PCM,因为总会有短期中断,并且只有在几米的距离内,一切才会或多或少地可靠工作。

实际上,即使是990 kb/s的音频流(LDAC 990 kb/s)也不是轻易就能可靠传输的。

回到编解码器。

SBC

对于所有支持A2DP标准的设备,必须实现 SBC 编解码器。它既是最好也是最差的编解码器。

采样率位深比特率编码支持解码支持
16, 32, 44.1, 48 kHz16 bit10-1500 kb/s所有设备所有设备

SBC是一个简单且计算速度快的编解码器,它使用了一个原始的心理声学模型(具有简单的听觉掩蔽效果),并采用了自适应脉冲编码调制(APCM)。

A2DP规范建议使用两种配置文件:中等质量和高质量。

SBC 有许多配置项,允许您控制算法延迟、块中的样本数量和比特分配算法,但几乎所有设备都采用了如下参数:

  • Joint Stereo(联合立体声)
  • 8 频带
  • 16 blocks in the audio frame
  • Loudness bit allocation method

SBC 可以动态调整 bitpool 参数,这直接影响到比特率。如果无线电信号拥堵、数据包丢失或设备距离较远,音频源可以减少比特池以防止音频中断,直到连接再次稳定。

大多数耳机厂商将 bitpool 参数的最大值设定为53,这在使用推荐的 Profile 时将比特率限制在 328kbps。

即使耳机厂商将 bitpool 的最大值设置在53以上(例如 Beats Solo³、JBL Everest Elite 750NC、AirPods,以及一些接收器和车载头单元),大多数操作系统也不允许使用更高的比特率,因为蓝牙技术栈的内部有限制。

此外,一些厂商为某些设备设置了较低的 bitpool 最大值。例如,Bluedio T 的是 39,Samsung Gear IconX 的是 37,这会导致音质较差。

蓝牙技术栈中引入的人为限制可能是由于认证测试不足以及某些设备与较大 Bitpool 值或非典型配置文件不兼容,即使它们报告支持这些配置文件。对于开发人员来说,将选项限制在推荐配置文件的已知良好值上,比创建不兼容设备的数据库要容易。尽管如此,现在他们也会因为其他功能不正确的工作而这样做。

SBC 会动态为频带分配量化位,从低频到高频,各频带有不同的权重。如果整个比特率被用于低频和中频,那么高频将会被切断(替换为静音)。

SBC 328 kbps的示例。原始音频在顶部,SBC编码的音频在底部。音轨切换用于比较。视频文件中的音频流使用FLAC无损编解码器压缩。在mp4容器中使用FLAC没有官方标准化,这就是为什么音频可能在您的浏览器中无法播放(应该可以在桌面Chrome和Firefox的最新版本中工作)。如果您没有声音,可以下载文件并在任何视频播放器中打开它。

aptX and aptX HD

aptX是一种简单且计算速度快的编解码器,没有心理声学模型,它使用自适应差分脉冲编码调制(ADPCM)。它大约在1988年出现(专利申请日期是1988年2月)。在蓝牙技术之前,它主要用于专业无线音频设备。目前由高通公司拥有,需要许可和许可费用。截至2014年:一次性支付6,000美元,每设备大约1美元,对于多达10,000台设备的批次(来源,第16页)。

该编解码器只有一个参数:采样率。尽管也有通道数量/模式配置选项,但据我所知,所有设备仅支持立体声(70多个型号)。

|编解码器 | 采样率 | 位深| 比特率 | 编码支持 | 解码支持 | | aptX| 16, 32, 44.1, 48 kHz| 16 bit | 128 / 256 / 352 / 384 kb/s (取决于采样率) | Windows 10 (desktop and mobile), macOS, Android 4.4+/7*, Blackberry OS 10 | 众多设备(硬件实现) |

  • 直到 Android 7,该编解码器需要修改蓝牙技术栈。只有在 Android 设备的制造商从高通公司获得了编解码器使用许可(如果操作系统包含了编码库)时,才支持该编解码器。

aptX 将音频分割成4个频带,并连续地用相同数量的比特对它们进行量化:0-5.5 kHz使用 8-bit,5.5-11 kHz使用 4-bit,11-16.5 kHz使用 2-bit,16.5-22 kHz使用 2-bit(这些值适用于44.1 kHz的采样率)。

aptX音频示例(顶部—原始音频,底部—aptX编码后的音频,仅左声道的频谱图,声音以FLAC格式):

高频部分略显红色,但差异是听不到的。

Due to the fixed distribution of quantization bits, the codec cannot “transfer the bits” to frequencies that need them most. Unlike SBC, aptX will not “cut off” frequencies, but will add quantization noise to them, reducing the dynamic range of the audio. 由于量化比特的固定分配,编解码器不能将“比特”转移到最需要它们的频率上。与SBC不同,aptX不会“切断”频率,而是会向它们添加量化噪声,从而降低音频的动态范围。

We should not assume that using, for example, 2 bits for a band reduces the dynamic range to 12 dB: ADPCM allows up to 96 dB of dynamic range to be used, even with 2 quantization bits, but only with a certain type of signal. 我们不应该认为,例如,对一个频段使用2比特就将动态范围降低到12分贝:即使只有2个量化比特,ADPCM也允许使用高达96分贝的动态范围,但这仅限于某种类型的信号。

aptX Low Latency

aptX Low Latency 不是一个独立的编解码器。它只在音频单元侧应用的延迟和缓冲设置上有所不同。除此之外,它就是一个普通的 aptX。

它被设计用于具有低延迟的交互式音频传输(电影、游戏),在这些应用中,声音延迟不能通过编程进行调整。有适用于英特尔蓝牙芯片的戴尔驱动软件实现。它也支持发射器、接收器、耳机和扬声器,但不包括智能手机。

AAC

AAC,即高级音频编码,是一种计算复杂度较高的编解码器,具有复杂的心理声学模型。它广泛用于互联网上的音频传输,是继MP3之后第二流行的编解码器。需要获得许可和支付许可费用:一次性支付15,000美元(或对于少于15名员工的公司为1,000美元)+前500,000个设备每个0.98美元(来源)。

该编解码器在 MPEG-2 和 MPEG-4 规范中被标准化,尽管人们常有误解,但它并不属于苹果公司。

| 编解码器 | 比特率 | 编码支持 | 解码支持 | | AAC | 8 — 576 kb/s (for stereo), 256 — 320 kb/s (typical for Bluetooth) | macOS, Android 7+*, iOS | 众多设备(硬件实现) |

  • iOS和macOS包含了迄今为止可用的最佳苹果AAC编码器,能够产生最高可能的音质。Android使用了次佳的Fraunhofer FDK AAC编码器,但也可以利用嵌入在平台(SoC)中的各种硬件编码器,其编码质量未知。根据SoundGuys网站上最近发布的测试,不同Android手机上AAC编码的质量变化很大:

大多数无线音频设备的 AAC 最大比特率是 320 kbps,有些只支持 256 kbps。其他比特率极为罕见。

AAC 在 320 和 256 kb/s的比特率下提供出色的音质,但对于已经压缩过的内容,它容易在生成过程中损失质量,然而在iOS上,即使经过连续几次编码,也很难听到原始文件和AAC 256 kb/s之间的差异。对于将MP3 320 kbps编码为AAC 256 kbps,损失可以忽略不计。

正如任何其他蓝牙编解码器一样,任何音乐首先被解码,然后使用编解码器重新编码。当听 AAC 格式的音乐时,它首先由操作系统解码,然后再次编码为 AAC,以便通过蓝牙传输。这是为了混合多个音频流,如音乐和新消息通知。iOS也不例外。你可以找到很多声明说 iOS 不会将 AAC 格式的音乐转码为通过蓝牙传输,这是错误的。

AAC 对标准编码方法有许多扩展。其中之一有 Scalable To Lossless(无损可扩展,简称SLS),SLS 已为蓝牙标准化,并允许传输无损音频。不幸的是,在现有设备上找不到对 SLS 的支持。还有一种减少传输延迟的扩展 AAC-LD(低延迟)并未为蓝牙标准化。

MP1/2/3

MPEG-1/2/3 编解码器包括众所周知且广泛使用的MP3,较少见的MP2(主要用于数字电视和广播),以及完全不为人知的MP1。

旧的MP1和MP2编解码器完全不被支持,我找不到任何耳机或蓝牙堆栈能够对它们进行编码或解码。

一些耳机支持MP3解码,但没有任何现代操作系统堆栈支持编码。看起来,第三方BlueSoleil堆栈在Windows上可以编码MP3,如果你手动编辑配置文件的话,但在我的安装上,它导致Windows 10出现蓝屏死机。结果:你实际上不能使用蓝牙音频的编解码器。

在2006-2008年之前,当A2DP标准还未在设备中广泛使用时,人们通过MSI BluePlayer程序在诺基亚BH-501耳机上听MP3音乐,该程序可在Symbian和Windows Mobile上使用。当时,智能手机的操作系统架构允许访问许多低级功能,甚至可以在Windows Mobile上安装第三方蓝牙堆栈。

MP3编解码器的最新专利已经到期,自2017年4月23日起,使用该编解码器不再需要支付许可费。

如果以上述文献中提到的最长期限的专利作为衡量标准,那么MP3技术在美国于2017年4月16日成为无专利技术,当时由Technicolor持有和管理的美国专利6,009,399到期。 来源: www.iis.fraunhofer.de/en/ff/amm/prod/audiocodec/audiocodecs/mp3.html

| 采样率 | 比特率 | 编码支持 | 解码支持 | | 16 — 48 kHz | 8 — 320 kb/s | 没有支持 | 部分音频设备(硬件实现) |

LDAC

索尼积极推广的新型“高解析度”编解码器,支持高达96 kHz的采样率和24位深度,比特率最高可达 990 kbps。它被宣传为发烧友级的编解码器,作为现有蓝牙编解码器的替代品。它具有自适应比特率功能,可以根据无线电传输条件调整比特率。

LDAC编码器(libldac)包含在标准 Android 发行版中,从 Android 8 开始,任何Android智能手机都支持编码。软件解码器并不免费提供,编解码器规格也不对公众开放,然而,从编码器的第一眼看,其内部结构与索尼在PlayStation 4和Vita中使用的ATRAC9编解码器相似:两者都在频域中工作,使用修改后的离散余弦变换(MDCT)和霍夫曼压缩。

LDAC 将音频分割成12或16个频带:44.1和48 kHz使用12个,88.2 和 96 kHz 使用16个。

LDAC 几乎只被索尼耳机支持。LDAC 解码有时也可以在其他制造商的耳机和 DAC 上找到,但非常罕见。

--- VIDEO ---

LDAC “高解析度编解码器”的市场营销损害了其技术特性:将比特率用于编码和传输人耳听不到的频率,以及在尚无法无损压缩CD音质音频的情况下使用更高的位深,这并不明智。幸运的是,该编解码器有两种工作模式:CD音频传输和高解析度音频传输。在第一种情况下,空中传输的仅为44.1 kHz / 16位。

由于LDAC软件解码器并不免费提供,因此无法在没有额外设备解码LDAC的情况下测试该编解码器。根据SoundGuys.com工程师通过数字输出连接并记录测试信号输出声音的LDAC测试结果,在CD音质模式下,LDAC 660和990 kbit/s提供了略优于aptX HD的信噪比。这是一个好结果。