蓝牙 SBC 双通道高清音频模式

 · 5 分钟
Table of contents

本文是原Lineage官网列出的“Bluetooth SBC Dual Channel HD audio mode”1的个人翻译版本,供各位学习交流使用。译文中的图片均直接转载自原文。原文作者是 Valdikss,发布时间为2019年7月6日,引用时间2023年1月22日。


LineageOS 15.1 和 16.0 为原有的蓝牙 SBC 音频编码带来了一个独特的音质提升。它们引入了带有 eXtreme quality profile (SBC XQ) 的 SBC 双通道模式,将这个老旧编码的音频质量提升到了与高通私有编码——aptX HD——相近的高度。

只要用户的设备运行的是在2019年3月31日或之后编译的 LineageOS 15.1、或是在2019年5月13日或之后编译的 LineageOS 16.0,一个新的“HD Audio: SBC”复选框就会出现在用户的蓝牙音频设备设置界面上。激活这项设定将启用双通道模式(Dual Channel mode),这提供了一个经过提升、比原版 SBC 编码高得多的比特率(bitrate)。新的比特率(452 或 551 kbps)依赖于蓝牙设备的最大增强数据率(Enhanced Data Rate)并且在使用联合立体声模式(Joint Stereo mode)时相比于原版 328 kbps 是一个明显的提升。

这个特性搭载在所有受 LineageOS 支持的设备上,并且可以和现存的绝大多数蓝牙播放设备一同使用。这个特性最适合没有额外编码支持——aptX、aptX HD、AAC 或是 LDAC——的廉价音频设备。

SBC 编码(协议)

SBC 有许多在连接过程中协商的不同参数:

  • 音频通道/音轨(类型和数量):联合立体声,立体声,双通道,单声道;
  • 频带数量:4 或 8;
  • 单个音频数据帧中音频数据块的数量:4,8,12,16;
  • 量化位分配算法:响度,信噪比(SNR);
  • 量化过程中用到比特池(bit pool)的容量范围:通常为 2 到 53;

解码器(播放设备)应当支持上述参数的任何可能组合,但编码器(智能手机)可以只实现一部分。

现在的蓝牙协议栈通常用下面一组参数进行协商(这一组参数也被称作 profile):联合立体声(Joint Stereo),8 个频带,16 块,响度,以及一个 2 到 53 位的比特池大小。这个 profile 将用 328 kbps 的比特率为 44.1 kHz 的立体声音频编码。

在所提到的参数中,比特池因其对比特率的直接影响处于格外重要的地位:它的大小越大,比特率就越大,也就提高了音频传输质量。当 profile 中的其他参数不改变时,一个特定的比特池大小将决定一个对应的比特率数值。

比特率同样被其它参数显著影响:音轨类型、频带数量以及音频数据块数量。你可以通过协商非常规的 profiles 来间接提高比特率,而不用调整比特池大小。需要着重注意的是一个更高的比特率并不总是带来更好的音质。例如,将单个音频数据帧中的音频数据块数量从 16 下调到 4,当使用联合立体声模式和 53 位大小的比特池时,将会把比特率从 328 kbps 提升到 441 kbps,但这也将减少很多计算时延,而这样会让动态量化过程变得更糟糕。上述例子不会带来除比特率增长之外的任何好处。

$$ bitrate = \frac{8 \times frame\_length \times sample\_rate}{subbands \times blocks} $$

固定的比特池大小与比特率的值均来自原版编码为高品质音频推荐的 profile。这个推荐值应该不构成我们去限制实际参数值的原因,正如下面所做的那样。

几种 profile 的参数对比

生效自 2007 年至 2015 年的 A2DP 规范 v1.2(译注:节4.3.2.6)要求所有解码设备都能正确处理最高达 512 kbps 的比特率:

The decoder of the SNK shall support all possible bitpool values that do not result in excess of the maximum bit rate. This profile limits the available maximum bit rate to 320kb/s for mono, and 512kb/s for two-channel modes.

输入端(SNK,sink)的解码器必须支持所有不让比特率超过最大限定值的比特池大小。该 profile 将最大比特率限制为单声道模式下的 320kb/s 和双声道模式下的 512kb/s。

而新版本的规范并未声明任何比特率限制。据推测,2015年之后发布的支持 EDR(Enhanced Data Rate)的现代耳机最高能支持 1000 kbps 的比特率。

双通道模式

双通道模式分别对左右声道进行编码,每个声道都用单独的比特池大小,这不像立体声或联合立体声那样对两个声道用同一个比特池大小。将设备运行模式从联合立体声模式切换到双通道模式将几乎会让比特率翻倍,达到 617 kbps,这将在不改变比特池大小(也就是53)的情况下带来显著的音质提升。我个人觉得比特池大小应该是一个内部变量。我推测,由于 A2DP 规范自身的设计失误导致了比特池大小并非由其它变量决定,而成了一个独立可协商的参数。

551 和 452 kbps 是哪来的?

蓝牙时分技术在设计上是能高效传输固定大小的大数据包的。数据传输以 (slot) 为单位,而每次最多可传输 5 个槽。也有些传输模式使用 1 或 3 个槽,但从来没有用 2 或 4 的。在链接速率为 2 Mbps 的情况下,你可以用 5 个槽传输多达 679 字节数据,而在 3Mbps 的情况下可以传输至多 1021 字节的数据。当使用 3 个槽时,上述情况下的单次传输数据量分别为 367 和 552 字节。

使用 5 slots 在 2 Mbps 情况下传输数据示意图

如果我们向传输少于 679 或 1021 字节但多于 367 或 552 字节的数据,单次传输依然要占用 5 个槽,而且传输会占用同样长的时间,也就降低了传输效率。

44.1kHz 音频在 SBC 编码下的传输数据示意图

44100 Hz 的音频经由 SBC 在双通道模式、比特池大小 38、每帧 16 块、8 频带下编码将生成长度为 164 字节的音频数据帧,相应的比特率为 452 kb/s。

帧长度计算公式

一个用尽 5 个槽的传输可以包含至多 4 个音频数据帧:

679 (EDR 2 mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 (SBC header) - (164*4) = 6

单个数据包能至多传输 11.7 毫秒时长的音频数据,而这些数据将在 3.75 毫秒内传输完成,而我们还有 6 字节没用上。如果你稍稍提高一点比特池的大小,4 个音频数据帧将再也不能挤到单次传输之中。你不得不每次发送 3 帧,也就降低了传输效率、单次传输中的音频数据量,还会增加无线环境较差情况下的音频卡顿的概率。

EDR 3 Mbps 情况下的 551 kbps 比特率也是用类似的方法选出的:在比特池大小为 47、每帧 16 块、8 个频带的情况下,帧大小为 200 字节,而比特率为 551 kbps。单词传输也就能用 5 个音频数据帧传输至多 14.6 毫秒的音乐。

计算所有 SBC 可用参数的算法还挺复杂的,增加了出错的可能。如果你想自己全算一遍,建议使用这个 交互式计算器

我们可以做得更好吗?

安卓的补丁包有一个额外选项可以增加 EDR 2Mbps 设备的比特率、超过它们既有的限制。你可以把比特率从 452 kbps 增加到 595 kbps,不过代价是当你的设备遇到拥塞的无线网络环境时传输稳定性会下降。

为了启用上述功能,在安卓 root shell 中执行下面的命令:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

这个改变真的有什么好处吗?

SoundExpert 的 Serge Smirnoff 做了一次 蓝牙SBC XQ profile 测试。他的测试表明 SBC XQ 452 kbps 的音频比 aptX 的失真更少,而 551 kbps 的版本甚至可以和 aptX HD 比。

想自己听听差异吗?试试这个实时 将音频转码为 SBC 的在线服务(也包括 aptX 和 aptX HD),就运行在浏览器里。你可以比较不同 SBC profile 和其它编码的不同,而不用真的去用蓝牙传输音频,只要用手边的有线耳机、音箱,然后上传你最喜欢的音乐就好。你也可以在播放过程中直接调整那些参数。

结论

LineageOS 用户现在可以通过在他们的蓝牙设备设定里为“HD Audio: SBC”复选框打上勾,就能增强他们的蓝牙音频质量。这个特性应该能帮人们改变认为 SBC 低质量、应急用编码的这种偏见。当选择一个新的蓝牙耳机或音箱时,用户不再需要考虑那些私有编码了。


  1. https://www.lineageos.org/engineering/Bluetooth-SBC-XQ/