如何在Linux上提高蓝牙音频质量

2020-10-14 00:30:18

蓝牙音频通常被认为是方便的,但不是“发烧友”。任何自尊的音频发烧友可能会将他们的花哨耳机连接到一些数模转换器/放大器组合上,这些组合可能会使用一些奇特的镀金USB线连接到他们的计算机上。给他们更多的权力,我就不自尊了。几个月前,我决定完全改用蓝牙音频,因为无线耳机的方便和整洁对我非常有吸引力。

我买了M-Pow H21s--这是一副相当便宜的蓝牙耳机。它们之所以吸引我,是因为它们不是非常昂贵,而且我过去购买的其他M-Pow产品的质量足够好,我相信这些也会很好。我没有错。噪音消除效果相当好,声音剖面虽然不是“中性”的,但我在工作时完全可以使用。

这些耳机真正让我恼火的一件事(我不确定故障出在Linux上的蓝牙音频还是耳机本身)是,如果我离开办公桌然后回来,音频质量会明显下降,但永远不会完全恢复。在重新启动耳机之前,它似乎在较低的质量下“卡住”了。有一天,我对此感到厌倦,于是决定研究一下到底发生了什么。

在开始的时候,有一个2DP-或高级音频分发配置文件(Advanced Audio Distribution Profile)。这是一个蓝牙配置文件-它描述了一种在发送器和接收器之间传输音频的方法。该配置文件要求所有蓝牙设备都支持称为SBC的编解码器,即低复杂度子带编解码器。编解码器确切地定义了发送音频的设备应该如何压缩音频。SBC是众所周知的低复杂度编解码器。低复杂度编解码器的设计目标是发送方易于编码,接收方易于解码。这是一个相当古老的编解码器,是MP2的前身,而MP2本身就是MP3的前身。当消费者开始从他们的蓝牙硬件中要求更高质量的音频时,各种其他的编解码器被添加到硬件中。一些硬件添加了MP3编码和解码-这在两个方面都有很小的改进。首先,如果源素材已经是MP3,并且编码器足够智能,则可以将MP3数据直接发送到接收器,这意味着不需要编码步骤。其次,就产生的音频质量而言,MP3通常被认为是更好的编解码器,因此即使有编码步骤,结果通常也会更好。苹果在他们的硬件上增加了AAC支持--这本身就是一个比MP3优越得多的编解码器,也提供了大致相同的好处。最新鲜的编解码器似乎来自高通(Qualcomm)吞并的一家公司-aptX。这个编解码器很有趣,因为它只提供上面提到的第二个优点。没有人有aptX格式的音乐,这意味着所有来源材料都必须在发送音频的设备上重新编码。

确定是否可以改进您自己的蓝牙音频的第一步是找出您的蓝牙耳机支持哪些编解码器。您通常可以通过查找制造商信息来了解这一点。我的特殊耳机H21-像石头一样笨,而且只支持SBC。如果您的耳机支持更好的编解码器,特别是如果它支持一种名为LDAC的编解码器,那么在尝试执行我们在本文中将要做的事情之前,您应该非常考虑尝试这样做,这将使用SBC编解码器提高我们可用的质量。本文相当不错地涵盖了所有编解码器。

不管您的耳机支持什么,下一件事就是安装自定义的PulseAudio模块,该模块既支持更多的高级编解码器,又允许您配置编解码器。抓取EH5/PulseAudio-module-bt并重启PulseAudio。您应该已经在系统的声音设置中看到,如果您的耳机支持AAC、aptX、aptX HD和LDAC,您现在可以在AAC、aptX、aptX HD和LDAC之间进行实际选择。如果您能够切换到aptX或LDAC,您可能可以停在这里。如果不是,那么是时候将SBC配置为不那么糟糕了。

因此,快速回顾一下我们可能关心的SBC编码器的选项。首先是立体声模式。一般来说,在音频中,我们有两种立体声模式..。嗯,立体声和联合立体声。立体声在同一个流中传输两个不同的音频通道,但彼此完全不同。联合立体声假设左声道和右声道可能足够相似,仅编码右声道与左声道的不同将导致更有效的数据打包。您的耳机可能已经在使用这两种模式之一。SBC实际上支持第三种模式,称为DUAL-该模式实质上是将两个音频流发送到您的耳机,彼此完全独立。这有效地将您的耳机的比特率提高了一倍,因为您不需要

如果您正在试用不同的耳机,我建议您从比特池值53开始,并启用双立体声。然后可以尝试增加位池值,如下所述。

要修改这些值,您需要编辑/etc/Pulse/default.pa。首先,找到开始加载模块模块-蓝牙-发现的Lind。修改它以添加这些标志,如下所示:

这将锁定您的SBC编码器,使其在位池大小为53的双立体声模式下工作。通过执行Pulsedio-k-重新启动PulseAudio,然后重新连接您的蓝牙耳机。希望您能感觉到质量有了很大的提高,就像我一样。现在可以通过更改该值53来进行试验,以获得更高的值。这里有一个已知兼容性的列表。

这种将编码器锁定为以特定比特池工作的方法的一个缺点是,随着链路质量的降低,您会失去优雅的质量等级。您可以尝试使用较低的sbc_min_bp值,以便编码器可以降低质量。