蓝牙 SBC 双通道高清音频模式
作者:ValdikSS,撰写于 2019 年 7 月 6 日
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,但会大大降低算法延迟,这反过来会使自适应量化过程恶化。尽管比特率增加,但此更改不会带来更好的音质。
固定的位池和比特率值源于高质量音频的原生推荐配置文件。该建议本不应成为限制这些参数的原因,但事实却如此。
从 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 字节。
如果我们想要传输少于 679 或 1021 字节但多于 367 或 552 字节的数据,传输仍然需要 5 个时隙,并且传输将花费相同的时间,这将降低传输效率。
使用 SBC 在双通道模式下编码的 44100 Hz 音频,位池 = 38,帧中 16 个块,8 个频带,产生 164 字节的音频帧,比特率为 452 kb/s。
音频有效负载应封装到 L2CAP 和 AVDTP 传输协议中,这将从音频有效负载中扣除 16 字节的开销。
一个 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 作为低质量和“备用”编解码器的偏见。在选择新的蓝牙耳机或扬声器时,用户将不再需要考虑专有编解码器。