我们修改了蓝牙堆栈,以改善没有编解码器AAC,aptX和LDAC的耳机上的声音

在阅读本文之前,建议您阅读上一篇文章: 通过蓝牙进行音频:尽可能多地了解配置文件,编解码器和设备 / 英文

使用无线耳机的一些用户注意到,使用支持所有音频设备的标准SBC蓝牙编解码器时,音频质量较差且缺少高频。 改善声音的常见建议是购买支持aptX和LDAC编解码器的设备和耳机。 这些编解码器需要支付许可费用,因此带有其支持的设备会更昂贵。

事实证明,SBC的质量低是由于蓝牙协议栈和耳机设置的人为限制所致,可以通过对智能手机或计算机进行软件更改来在任何现有设备上规避此限制。

SBC编解码器

SBC编解码器具有许多不同的参数,这些参数在连接建立阶段保持一致。 其中包括:

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


解码设备必须支持这些参数的任何组合。 编码器可能无法全部实现。
通常,现有的蓝牙堆栈在以下配置文件中达成共识:联合立体声,8频段,16块,响度,比特池2..53。 此配置文件以328 kbps的比特率编码44.1 kHz音频。
bitpool参数直接影响单个配置文件中的比特率:它越高,比特率越高,因此质量也越高。
但是,bitpool参数未绑定到特定配置文件。 其他参数也会影响比特率:信道类型,频带数,块数。 您可以通过协商非标准配置文件来间接提高比特率,而无需更改比特池。

bitrate= frac8\次 length\次 rate\次


SBC比特率公式


例如,双通道模式使用每个通道的整个位池分别对通道进行编码。 通过强制设备使用双通道而不是联合立体声,我们获得了几乎相同的最大比特池值:617 kbps的双比特率。
我认为,在批准阶段使用非配置文件的位池值是A2DP标准的缺陷,这导致了SBC质量的人为限制。 同意比特率而不是比特池是比较明智​​的。

这些固定值Bitpool和Bitrate源自具有高质量音频建议值的表。 但是,建议并非仅限于这些值的理由。

蓝牙SBC配置文件表

从2007年到2015年有效的A2DP v1.2规范要求所有解码设备以最高512 kbps的比特率正常工作:

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


新版本的规范中没有比特率限制。 假定2015年之后发布并支持EDR的现代耳机可以支持高达≈730 kbps的比特率。

由于某些原因,我测试过的Linux蓝牙堆栈(PulseAudio),Android,Blackberry和macOS对bitpool参数的最大值有人为的限制,这直接影响了最大比特率。 但这不是最大的问题,几乎所有耳机都将最大位池值限制为53。
正如我已经设法确保的那样,大多数设备在经过修改的蓝牙协议栈上都可以正常工作,其比特率为551 kbit / s,不会出现中断和裂纹。 但是在正常条件下,在普通的蓝牙协议栈上,这种比特率将永远无法协商。

修改蓝牙堆栈

任何与A2DP标准兼容的蓝牙协议栈都支持双通道模式,但无法从界面激活它。

让我们在界面上添加一个开关! 我为Android 8.1和Android 9制作了补丁,这些补丁将对双通道的完全支持添加到了堆栈中,在开发人员工具的模式切换菜单中添加了模式,并处理了具有双通道支持的SBC,就好像它是像aptX,AAC或LDAC这样的附加编解码器( Android通过在蓝牙设备的设置中添加对勾标记来将其称为“高清音频”。 看起来是这样的:

图片

适用于Android 9的补丁
适用于Android 8.1的补丁

选中此复选框后,如果耳机支持3 Mbps的连接,则开始以551 kbps的比特率传输蓝牙音频;如果耳机仅支持2 Mbps,则以452 kbps的速率传输蓝牙音频。

该修补程序包含在以下备用固件中:
  • LineageOS
  • 复活混音
  • 机器人


551和452 kbit / s来自何处?

蓝牙空气分离技术旨在有效地传输大型固定大小的数据包。 数据是按时隙传输的,一次传输中发送的时隙数最多为5。还有一些传输模式使用1或3个时隙,但不使用2或4。在5个时隙中,您可以以2 Mbps的连接速度传输多达679个字节,最高可达1021字节,速度为3 Mbps,分别为3-367和552字节。

图片

如果我们要传输的数据少于679或1021字节,但少于367或552字节,则传输仍将占用5个时隙,并且数据将在同一时间传输,从而降低了传输效率。

图片

双通道模式下的SBC,在具有Bitpool 38参数的44100 Hz音频上,每帧16个块,8个频率范围,将音频编码为164字节大小的帧,比特率为452 kbps。
音频必须封装在L2CAP和AVDTP传输协议中,这些协议从音频有效载荷中占用16个字节。

\开始{align *}帧长&= 4 + \ frac {子带\次通道} {2} + \\&\开始{cases} \ frac {块\次通道\次位池} {8}&\ text {如果是单通道或双通道模式,则\\ \ frac {子带+块\次比特池} {8}&\文本{如果是联合立体声模式} \\ \ frac {块\次比特池} {8}&\文本{如果是立体声模式} \\ \结束{cases} \结束{align *}





因此,在具有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帧,这会降低传输效率,减少每个数据包传输的音频量,并会迅速导致在恶劣的无线电条件下出现音频卡顿现象。

同样,为3 Mbps的EDR选择了551 kbit / s的比特率:对于Bitpool 47,一个帧中有16个块,在8个频率范围内,帧大小为200字节,比特率为551 kbit / s。 5个帧或14.6毫秒的音乐适合一个包装。

计算所有SBC参数的算法非常复杂,如果您手动进行计数,您很容易感到困惑,因此我制作了一个交互式计算器来帮助那些有兴趣的人: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

为什么这一切都是必要的?

与aptX编解码器的声音质量的普遍看法相反,在某些文件上,它可能比标准比特率为328 kbps的SBC产生更差的结果。

SBC为频段动态分配量化位,以“从下到上”的方式运行。 如果整个比特率都用于低频和中频,则较高的频率将被“切断”(取而代之的是静音)。
aptX连续地量化具有相同位数的频带,这就是为什么它具有恒定比特率的原因:44.1 kHz为352 kbit / s,48 kHz为384 kbit / s,并且它无法“将比特”“传输”到那些频率最需要他们。 与SBC不同,aptX不会“削减”频率,但会向其添加量化噪声,从而减小音频的动态范围,有时还会引入特征性的裂纹。 另一方面,SBC“吞噬细节”-丢弃最安静的区域。
平均而言,与SBC 328k相比,aptX可以在较宽的频率范围内为音乐带来更少的失真,但是有时它在较窄的频率范围和较宽的动态范围内的音乐中获胜。

考虑一种特殊情况。 记录钢琴的频谱图:
图片

主要能量位于0到4 kHz的频率中,并持续高达10 kHz。
aptX中压缩的文件的频谱图如下:
图片

看起来SBC 328k。
图片

可以看出,SBC 328k定期完全关闭16 kHz以上的范围,并消耗了低于此值的范围的所有可用比特率。 但是,aptX在人耳听到的频谱中引入了更多的失真,这可以从aptX频谱图减去原始频谱图中看到(越亮,失真越大):
图片

尽管SBC 328k在0至10 kHz范围内干扰信号的程度较小,但其余部分却被削减了-
图片

485k SBC比特率足以保存整个频率范围,而无需断开频带。
图片

在此组成上,SBC 485k在0-15 kHz的范围内明显领先于aptX,并且具有较小但仍然明显的差异-15-22 kHz(较暗,失真较小):
图片

原始音频,SBC和aptX的存档

切换到高位SBC,您将在任何耳机上获得声音,通常优于aptX。 在支持3 Mbps EDR连接的耳机上,551 Kbps的比特率可产生与aptX HD相当的声音。

我可以再吃点吗?

Android补丁也可以选择进一步将EDR设备的比特率提高2 Mbps。 您可以将比特率从452 kbps增加到595 kbps,以降低复杂无线电条件下的传输稳定性为代价。
只需将变量persist.bluetooth.sbc_hd_higher_bitrate设置为1:
 # setprop persist.bluetooth.sbc_hd_higher_bitrate 1 

迄今为止,极限比特率补丁仅在LineageOS 15.1中接受,但在16.0中尚未接受。

设备兼容性

几乎所有耳机,扬声器和车载音响系统都支持SBC双通道。 这不足为奇-该标准规定了其在任何解码设备中的支持。 在这种模式下会导致问题的设备很少,但这只是单个实例。
有关兼容设备的更多详细信息,请访问w3bsit3-dns.comxda-developers

声音差异比较

我制作了一个Web服务,就在浏览器中实时编码SBC(以及aptX和aptX HD)中的音频。 借助它,您可以比较各种SBC配置文件和其他编解码器的声音,而无需通过蓝牙在任何有线耳机,扬声器和您喜欢的音乐上实际传输音频,并且可以在音频播放期间直接更改编码设置。
btcodecs.valdikss.org.ru/sbc-encoder

与Android开发人员联系

我写信给许多Google蓝牙堆栈开发人员,要求考虑在主要的Android分支AOSP中包含补丁,但没有得到一个答案。 有关Android的Gerrit补丁系统的补丁也没有留下任何评论。
如果能与Google的开发人员以及Android中的SBC HD的实现得到帮助,我将感到非常高兴。 gerrit补丁已经过时了(这是早期的版本之一),如果开发人员对我的更改感兴趣(我不容易更新,因为我没有Android Q兼容设备),我将对其进行更新。

结论

使用LineageOS,Resurrection Remix和crDroid固件的智能手机用户现在可以满足于提高音质的需求,只需激活蓝牙设备设置中的选项即可。 Linux用户还可以通过安装PaliRohár补丁来提高SBC比特率,该补丁除其他外还增加了对aptXaptX HD和FastStream编解码器的支持。

Source: https://habr.com/ru/post/zh-CN455316/


All Articles