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

作者:ValdikSS,撰写于 2019 年 7 月 6 日

On a maroon background, warm repeating line shapes emanate from the center toward the left and right, transforming from circles to rectangles as they near the image's edge. Large pink shapes, the Lineage logo, and the word Engineering sit on top.

LineageOS 15.1 和 16.0 为原生的蓝牙 SBC 音频编解码器带来独特的音质增强。它引入了对采用 eXtreme 质量配置文件 (SBC XQ) 的 SBC 双通道模式的支持,将这种旧编解码器的音质提升到与高通专有编解码器 aptX HD 相媲美的水平。

只要用户运行的是 2019 年 3 月 31 日或之后创建的 LineageOS 15.1 版本,或者 2019 年 5 月 13 日或之后创建的 16.0 版本,用户的蓝牙音频设备设置中就会出现一个额外的“高清音频:SBC”复选框。启用此设置将切换到双通道模式,该模式提供比原生 SBC 编解码器更高的比特率。新的比特率为 452 或 551 kbps,具体取决于蓝牙设备的最大增强数据速率,与使用联合立体声模式时的原生 328 kbps 相比,这是一个明显的升级。

该功能在所有支持 LineageOS 的设备上都可用,并且可以被绝大多数现有蓝牙播放设备使用。它最适用于不支持其他编解码器(aptX、aptX HD、AAC 或 LDAC)的廉价音频设备。

SBC 编解码器

SBC 有许多不同的参数,这些参数在连接建立阶段进行协商

  • 音频通道(类型和数量):联合立体声、立体声、双通道、单声道;
  • 频带数量:4 或 8;
  • 一个音频帧中的音频块数量: 4, 8, 12, 16;
  • 量化位分配算法:响度、信噪比 (SNR);
  • 量化过程中使用的最大和最小位池:通常为 2 到 53;

解码器(播放设备)需要支持这些参数的任何组合,但编码器(智能手机)可能只部分实现它们。

当前的蓝牙协议栈通常协商以下参数集,称为配置文件:联合立体声、8 个频带、16 个块、响度和 2 到 53 的位池。此配置文件以 328 kbps 的比特率编码 44.1 kHz 立体声音频。

在上述参数中,位池尤为重要,因为它直接影响比特率:位池越高,比特率越高,音质也因此得到提升。只有当配置文件中的其他参数保持不变时,特定的位池值才会导致相应的比特率值。

比特率还受到其他参数的显着影响:音频通道类型、频带数量和音频块数量。您可以通过协商非标准配置文件来间接提高比特率,而无需更改位池。重要的是要注意,更高的比特率并不总是带来更好的音质。例如,当使用位池为 53 的联合立体声时,将单个音频帧中的块数从 16 更改为 4,比特率将从 328 kbps 增加到 441 kbps,但会大大降低算法延迟,这反过来会使自适应量化过程恶化。尽管比特率增加,但此更改不会带来更好的音质。

SBC bitrate formula

固定的位池和比特率值源于高质量音频的原生推荐配置文件。该建议本不应成为限制这些参数的原因,但事实却如此。

SBC profiles

从 2007 年到 2015 年生效的 A2DP 规范 v1.2 要求所有解码器正确处理高达 512 kbps 的比特率

SNK 的解码器应支持所有可能的位池值,这些值不会导致超过最大比特率。此配置文件将单声道模式的可用最大比特率限制为 320kb/s,双通道模式限制为 512kb/s。

新版本的规范中没有规定比特率限制。据推测,2015 年之后发布的具有 EDR 支持的现代耳机可以支持高达 1000 kbps 的比特率。

双通道模式

双通道模式分别编码左右声道,为每个声道使用单独的位池,这与立体声或联合立体声不同,后者对两个声道都强制使用单个位池。将设备从联合立体声切换到双通道几乎会将比特率翻倍至 617 kbps,这会显着改变音质,同时保持 53 的位池值不变。我个人认为位池应该是一个内部变量。我认为 A2DP 规范设计本身的错误导致位池值未与其他编解码器参数绑定,而仅被定义为独立的协商变量。

551 和 452 kbps 来自哪里?

蓝牙时分技术旨在高效传输大型固定大小的数据包。数据传输发生在时隙中,一次传输中发送的最大时隙数为 5。还有使用 1 或 3 个时隙的传输模式,但从未使用 2 或 4 个。在 2 Mbps 的连接速度下,您最多可以在 5 个时隙中传输 679 字节,在 3 Mbps 的速度下,最多可以传输 1021 字节。当使用 3 个时隙时,最大数据量分别为 367 和 552 字节。

Bluetooth transmission. Full 5 slot transmission takes 3.75 ms. Each slot takes 0.625 ms.

如果我们想要传输少于 679 或 1021 字节但多于 367 或 552 字节的数据,传输仍然需要 5 个时隙,并且传输将花费相同的时间,这将降低传输效率。

Bluetooth transmission. 550 bytes of data still require full 5 slot transmission and 3.75 ms.

使用 SBC 在双通道模式下编码的 44100 Hz 音频,位池 = 38,帧中 16 个块,8 个频带,产生 164 字节的音频帧,比特率为 452 kb/s。

音频有效负载应封装到 L2CAP 和 AVDTP 传输协议中,这将从音频有效负载中扣除 16 字节的开销。

Frame length formula

一个 5 时隙音频传输最多可以包含 4 个音频帧

679 (EDR 2 mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 (SBC 标头) - (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 参数的算法非常复杂,增加了出错的可能性。如果您想手动计算所有参数,建议使用此交互式计算器

我们还能更进一步吗?

Android 补丁集有一个额外的选项,可以提高增强数据速率为 2 mbps 的设备的比特率,超出其当前限制。您可以将比特率从 452 kbps 提升到 595 kbps,但代价是当您的设备面临拥塞的无线电条件时,传输稳定性会降低。

要启用此功能,请在 root shell 中运行以下命令

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

此 595 kbps 选项目前在 LineageOS 15.1 中可用,但在撰写本文时在 16.0 中不可用。

此更改真的有任何好处吗?

SoundExpert 的 Serge Smirnoff 执行了一项蓝牙 SBC XQ 配置文件测试。他的测试表明,SBC XQ 452 kbps 音频比 aptX 具有更少的伪影,而 551 kbps 甚至可以与 aptX HD 相媲美。

想亲自听听区别吗?尝试一个网络服务,它可以将音频实时编码为 SBC(以及 aptX 和 aptX HD),就在浏览器中进行。您可以使用此服务比较不同 SBC 配置文件和其他编解码器的声音,而无需实际通过蓝牙传输音频,适用于任何有线耳机、扬声器以及您最喜欢的音乐。您还可以在音频播放期间直接更改编码参数。

结论

LineageOS 用户现在只需勾选蓝牙设备设置中的“高清音频:SBC”复选框,即可增强蓝牙音频质量。此功能应有助于改变人们对 SBC 作为低质量和“备用”编解码器的偏见。在选择新的蓝牙耳机或扬声器时,用户将不再需要考虑专有编解码器。