蓝牙耳机

出自 ArchWiki

存在三种蓝牙音频系统

  • A2DP(高级音频分发)提供音乐级立体声输出(接收器),通常没有输入(源)。
    • A2DP 可以使用多种编解码器。标准 SBC 的质量-比特率权衡较差,但更好的开源替代方案(LDAC、AptX)已变得普及。
    • AVRCP 在 A2DP 之上使用,以提供播放控制。
  • HFP/HSP(免提/耳机)提供语音级单声道输出和输入。HFP 构建于 HSP 之上。
  • LE Audio 是 2020 年宣布的低功耗音频标准。标准编解码器是 LC3。

内核、BlueZ 5 和 PipeWire 支持所有三种配置文件。较旧的声音服务器(如 PulseAudio 和 ALSA)仅支持 A2DP 和 HFP/HSP。尽管蓝牙以不可靠而闻名[1],但许多实现都得到了大幅改进,使其在像 Intel 蓝牙芯片这样的成熟硬件上成为一种不那么痛苦的体验。

通过 PipeWire 使用耳机

PipeWire 可以作为 PulseAudio 的直接替代品,并提供了一种轻松设置蓝牙耳机的方法。它包括对使用 SBC/SBC-XQ、AptX、LDAC 或 AAC 编解码器的 A2DP 音频接收器配置文件和 HFP/HSP 的开箱即用支持。

安装 pipewire-pulse(它取代了 pulseaudiopulseaudio-bluetooth)。

守护进程将作为用户服务自动启动。使用 pavucontrol 或桌面环境的设置进行配置。有关更多信息,请参阅 PipeWire#蓝牙设备

截至 2025 年 2 月,LE 音频系统仍处于实验阶段,因此默认情况下禁用 LC3 编解码器,但通过一些努力可以使用它。有关更新,请参阅 PipeWire wiki [2]。或者,监控此主题 [3]

故障排除

本文或章节是与 PipeWire#故障排除 合并的候选对象。

注意: 此页面上的章节仅链接到 Pipewire,后者有其自己的故障排除章节。(在 Talk:Bluetooth headset 中讨论)

由于耳机和 PipeWire 之间同步导致音频音量过高

0.3.26 版本以来,PipeWire 使用“硬件音量”将耳机音量与系统音量链接起来,使得无法单独更改其中一个。在某些设备上,这可能会导致最低音量也令人感到不舒服地响亮,并且音量控制变得过于粗糙。可以使用 WirePlumber 或 Pipewire Media Session 禁用硬件音量。

使用 WirePlumber

如果目录和文件 /etc/wireplumber/wireplumber.conf.d/80-bluez-properties.conf 不存在,则创建它们以系统范围内禁用硬件音量,或者创建 ~/.config/wireplumber/wireplumber.conf.d/80-bluez-properties.conf 以仅为您的用户禁用它。编辑该文件以包含以下内容

monitor.bluez.properties = {
  bluez5.enable-hw-volume = false
}

重启系统或重启 PipeWire 和 WirePlumber 服务以使更改生效。

使用 Pipewire Media Session

如果目录 /etc/pipewire/media-session.d/ 不存在,则创建它以系统范围内禁用硬件音量,或者创建 ~/.config/pipewire/media-session.d/ 以仅为您的用户禁用它。然后,将 /usr/share/pipewire/media-session.d/bluez-monitor.conf 复制到您创建的目录。编辑该文件,并添加以下行

bluez5.enable-hw-volume = false

重启系统或 PipeWire 服务以使更改生效。

通过 Bluez5/PulseAudio 使用耳机

本文或章节是与 蓝牙 合并的候选对象。

注意: 与蓝牙页面上的常规设置存在明显的冗余。应该在那里合并。特定于耳机的信息将保留在此页面上。(在 Talk:Bluetooth#合并键盘、鼠标、耳机页面中的常规设置 中讨论)

安装 pulseaudio-alsapulseaudio-bluetoothbluez-utils 软件包,最后一个软件包提供了 bluetoothctl 实用程序。

注意: 在继续之前,请确保蓝牙设备未被 rfkill 阻止。

通过 CLI 配置

启动 bluetooth.service

现在我们可以使用 bluetoothctl 命令行实用程序进行配对和连接。有关 bluetoothctl 的故障排除和更详细的说明,请参阅 蓝牙 文章。运行

$ bluetoothctl

以进入其内部命令提示符。然后输入

[bluetooth]# power on
[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# scan on

现在确保您的耳机处于配对模式。它应该很快被发现。例如,

[NEW] Device 00:1D:43:6D:03:26 Lasmex LBT10

显示了一个名为 “Lasmex LBT10” 且 MAC 地址为 “00:1D:43:6D:03:26” 的设备。我们现在将使用该 MAC 地址启动配对

[bluetooth]# pair 00:1D:43:6D:03:26

配对后,您还需要显式连接设备(如果不起作用,请在尝试连接之前尝试下面的 trust 命令)

[bluetooth]# connect 00:1D:43:6D:03:26

如果您收到连接错误 org.bluez.Error.Failed,请先杀死现有的 PulseAudio 守护进程,然后重试

$ pulseaudio -k
[bluetooth]# connect 00:1D:43:6D:03:26

最后,如果您希望将来自动连接到此设备

[bluetooth]# trust 00:1D:43:6D:03:26

如果一切正常,您现在在 PulseAudio 中有一个单独的输出设备。

注意: 设备可能默认关闭。在 pavucontrol 的“配置”选项卡中选择其音频配置文件(OFFA2DPHFP)。

您现在可以使用 pavucontrol 的“播放”和“录制”选项卡通过该设备重定向任何音频。

您现在可以再次禁用扫描并退出程序

[bluetooth]# scan off
[bluetooth]# exit

设置自动连接

要使耳机自动连接,您需要启用 PulseAudio 的 switch-on-connect 模块。通过将以下行添加到 /etc/pulse/default.pa 来执行此操作

/etc/pulse/default.pa
### Automatically switch to newly-connected devices
load-module module-switch-on-connect
注意: 确保您的蓝牙音频设备是受信任的,否则重复配对将失败。有关详细信息,请参阅 Bluetooth#配对

通过 GNOME Bluetooth 配置

注意: 由于持续存在的错误,A2DP 配置文件将无法通过此方法在 pulseaudio 9/10 中激活,从而可能导致低质量的单声道声音。有关可能的解决方案,请参阅 #A2DP 在 PulseAudio 中无法工作

您可以使用 GNOME Bluetooth 图形前端轻松配置蓝牙耳机。

首先,您需要确保 bluetooth.service systemd 单元正在运行。

打开 GNOME Bluetooth 并激活蓝牙。扫描设备后,您可以在设备列表中选择您的耳机以连接。您可以从设备菜单直接访问声音配置面板。在声音面板上,连接设备后应出现新的音频接收器。

LDAC/aptX

PulseAudio 15.0 起,支持 LDAC/aptX 编解码器。您可以按如下方式验证您用于连接的编解码器

$ pactl list | grep a2dp_codec

故障排除

注意: 许多用户报告在使 A2DP/蓝牙耳机工作方面感到沮丧。有关更多信息,请参阅 #在 HSP/HFP 和 A2DP 设置之间切换

声音差 / 静态噪音 / “浑浊”的声音

如果您在使用耳机时遇到声音质量不佳的情况,则很可能是因为您的耳机未设置为正确的配置文件。请参阅 #在 HSP/HFP 和 A2DP 设置之间切换 以解决问题。

如果您怀疑声音质量不佳是由于蓝牙连接不良引起的,您可以通过使用 pactl 切换到较低比特率和较低音频质量的编解码器(如 SBC 或 aptX)来弥补

$ pactl send-message /card/bluez_card.XX_XX_XX_XX_XX_XX/bluez switch-codec '"sbc"'

可以使用以下命令获取可用编解码器的列表

$ pactl send-message /card/bluez_card.XX_XX_XX_XX_XX_XX/bluez list-codecs

已选择音频配置文件,但耳机未激活且音频无法重定向

具有欺骗性的是,此菜单在设备连接之前可用;令人恼火的是,它将不起作用。菜单似乎是在接收器识别到设备后立即创建的。

确保以 root 身份运行 bluetoothctl 并手动连接设备。可能存在一些配置选项可以消除每次都执行此操作的需要,但配对和信任都不能诱导我进行自动连接。

配对失败,出现 AuthenticationFailed

如果配对失败,您可以尝试使用以下命令启用或禁用 SSPMode

# btmgmt ssp off

# btmgmt ssp on

您可能需要在运行此命令时关闭蓝牙。

配对成功,但连接失败

您可能会在 bluetoothctl 中看到以下错误

[bluetooth]# connect 00:1D:43:6D:03:26
Attempting to connect to 00:1D:43:6D:03:26
Failed to connect: org.bluez.Error.Failed

要进一步调查,请检查 bluetooth.service单元状态或查看如下日志

# journalctl -n 20

您可能会看到类似这样的消息

bluetoothd[5556]: a2dp-sink profile connect failed for 00:1D:43:6D:03:26: Protocol not available

这可能是由于未安装 pulseaudio-bluetooth 软件包引起的。如果缺少,请安装它,然后重启 pulseaudio。

这也可能是由于权限问题,尤其是当以 root 身份启动 pulseaudio 允许您连接时。有关参考,请参阅 /usr/share/dbus-1/system.d/bluetooth.conf

如果问题不是由于缺少软件包引起的,则在这种情况下问题是 PulseAudio 没有赶上。解决此问题的常见方法是重启 PulseAudio。请注意,在 PulseAudio 作为用户运行时,以 root 身份运行 bluetoothctl 是完全可以的。重启 PulseAudio 后,重试连接。无需重复配对。

如果重启 PulseAudio 无效,则需要加载 module-bluetooth-discover。

# pactl load-module module-bluetooth-discover

可以将相同的 load-module 命令添加到 /etc/pulse/default.pa

如果仍然无效,或者您正在使用 PulseAudio 的系统范围模式,则还加载以下 PulseAudio 模块(同样,这些模块可以通过您的 default.pasystem.pa 加载)

module-bluetooth-policy
module-bluez5-device
module-bluez5-discover

也可能是 /var/lib/bluetooth/ 的所有者没有写入权限。如果是这种情况,您可以通过删除并重新配对设备来使设备工作,但问题会在重启后再次出现。恢复写入权限可以解决此问题

# chmod -R u+w /var/lib/bluetooth

连接成功,但始终存在声音故障

当蓝牙和 Wi-Fi 共享同一个芯片时,这很可能发生,因为它们共享同一个物理天线,并且可能共享相同的频段范围 (2.4GHz)。尽管这在 Windows 上可以无缝运行,但在 Linux 上并非如此。

一种可能的解决方案是将您的 Wi-Fi 网络移动到 5GHz,这样就不会有干扰。如果您的网卡/路由器不支持此功能,您可以升级您的 Wi-Fi 驱动程序/固件。

如果以上方法都不可行,一种效果较差的缓解措施是调整 PulseAudio 输出端口上的片段大小和延迟,尝试补偿干扰。必须选择合理的值,因为这些设置可能会使音频不同步(例如,在播放视频时)。要更改蓝牙耳机端口的延迟(例如,在以下示例中更改为 125000 微秒)

$ pactl set-port-latency-offset <bluez_card> headset-output 125000

可以使用以下命令找到网卡标识符

$ pacmd list-sinks | grep -Eo 'bluez_card[^>]*'

片段大小可以在 /etc/pulse/daemon.conf 中设置,并在重启 PulseAudio 后生效(有关更多详细信息,请参阅 PulseAudio/Troubleshooting#在 PulseAudio 中设置默认片段数和缓冲区大小)。

或许将 options ath9k btcoex_enable=1 添加到 /etc/modprobe.d/ath9k.conf (使用适当的蓝牙适配器)会有所帮助

/etc/modprobe.d/ath9k.conf
# possibly fix for sound glitches
options ath9k btcoex_enable=1

然后重启。

连接成功,但没有声音

确保在您的 日志 中看到以下消息

bluetoothd[5556]: Endpoint registered: sender=:1.83 path=/MediaEndpoint/A2DPSource
bluetoothd[5556]: Endpoint registered: sender=:1.83 path=/MediaEndpoint/A2DPSink

如果您看到类似于此的消息,您可以继续调查您的 PulseAudio 配置。否则,请返回并确保连接成功。

本文或章节是与 PulseAudio/故障排除 合并的候选对象。

注意: 以下似乎是常见问题:[4] (在 Talk:Bluetooth headset 中讨论)

当使用 GDM 时,会启动另一个 PulseAudio 实例,该实例“捕获”您的蓝牙设备连接。可以通过屏蔽 GDM 用户的 pulseaudio 套接字来防止这种情况,方法如下

# mkdir -p  /var/lib/gdm/.config/systemd/user
# ln -s /dev/null  /var/lib/gdm/.config/systemd/user/pulseaudio.socket

在下次重启时,第二个 PulseAudio 实例将不会启动。

可能会发生 bluez 错误地将耳机视为不具备 a2dp 功能的情况。在这种情况下,使用以下命令搜索蓝牙设备的索引

$ pacmd ls

在输出中,应该有一个与蓝牙耳机相关的部分,其中包含类似于

$ pacmd ls
index: 2
        name: <bluez_card.XX_XX_XX_XX_XX_XX>
        driver: <module-bluez5-device.c>
        owner module: 27
        properties:
                device.description = "SONY MDR-100ABN"
                device.string = "XX:XX:XX:XX:XX:XX"
                device.api = "bluez"
                device.class = "sound"
                ...

要手动设置配置文件,请运行

$ pacmd set-card-profile 2 a2dp_sink

其中 2 是通过 pacmd ls 检索到的设备的索引。

连接成功,但设备未在 PulseAudio 音频接收器中显示

如果耳机连接成功(可以通过 bluetoothctl 确认),但未在 pavucontrol 中显示为输出/输入音频接收器,您可以尝试将(或创建)以下策略添加到您的蓝牙配置文件 /etc/bluetooth/audio.conf

/etc/bluetooth/audio.conf
[General]
Enable=Control,Gateway,Headset,Media,Sink,Socket,Source

重启 bluetooth.service,然后重新连接耳机。

一些用户报告这解决了他们的问题。

连接成功,声音播放正常,直到耳机空闲,然后断断续续

如果耳机播放声音正常,直到它们空闲,然后在恢复时断断续续(例如,因为声音已暂停,或者因为一段时间内没有播放声音),请尝试禁用 PulseAudio 的空闲时自动音频接收器/源挂起。

一些用户报告当蓝牙连接不发送任何数据时,会出现巨大的延迟甚至没有声音。这是由于 module-suspend-on-idle 模块引起的,该模块会自动挂起空闲的音频接收器/源。由于这可能会导致耳机出现问题,因此可以停用负责的模块。

要禁用 module-suspend-on-idle 模块的加载,请注释掉正在使用的配置文件(~/.config/pulse/default.pa/etc/pulse/default.pa)中的以下行

~/.config/pulse/default.pa
### Automatically suspend sinks/sources that become idle for too long
#load-module module-suspend-on-idle

最后,重启 PulseAudio 以应用更改。

UUID 具有不支持的类型

在配对期间,您可能会在 bluetoothctl 中看到此输出

[CHG] Device 00:1D:43:6D:03:26 UUIDs has unsupported type

此消息非常常见,可以忽略。

电脑显示设备已配对,但设备无法识别

这可能是由于设备不支持蓝牙 LE 进行配对。

尝试在 /etc/bluetooth/main.conf 中设置 ControllerMode = bredr。请参阅 [5]

设备连接,然后在几秒钟后断开连接

如果您在 日志 中看到如下消息,并且您的设备无法连接或在连接后不久断开连接

bluetoothd: Unable to get connect data for Headset Voice gateway: getpeername: Transport endpoint is not connected (107)
bluetoothd: connect error: Connection refused (111)

这可能是因为您已经使用同一蓝牙适配器(例如,双启动)将设备与另一个操作系统配对。某些设备无法处理与同一 MAC 地址(即蓝牙适配器)关联的多个配对。您可以通过重新配对设备来解决此问题。首先删除设备

$ bluetoothctl
[bluetooth]# devices
Device XX:XX:XX:XX:XX:XX My Device
[bluetooth]# remove XX:XX:XX:XX:XX:XX

然后重启 bluetooth.service,打开您的蓝牙适配器,使您的设备可被发现,重新扫描设备,然后重新配对您的设备。根据您的蓝牙管理器,您可能需要执行完全重启才能重新发现设备。

Apple AirPods 音量过低

bluetooth.service 创建一个 drop-in 文件,其中包含以下内容

/etc/systemd/system/bluetooth.service.d/noplugin-avrc.conf
[Service]
ExecStart=
ExecStart=/usr/lib/bluetooth/bluetoothd --noplugin=avrcp

然后,重启 bluetooth.service重新加载其配置,然后重新连接您的耳机。

此外,对于 AirPods Pro,请在 iPhone 的设置中禁用空间音频并启用单声道。

这也可以解决某些无法通过 AVRCP 控制的设备的问题。

Apple AirPods Pro 作为 A2DP Sink 在 PulseAudio 中工作,但不适用于 HSP/HFP

如果您发现 AirPods Pro 在 PulseAudio 中工作,但无法使用 HSP/HFP 配置(在 pavucontrol配置选项卡中,通常列为不可用),请尝试切换到 pipewire-pulse

请注意,切换到 pipewire-pulse (并重启您的计算机或相应的用户级 systemd 服务)应该启用 HSP/HFP,但也可能禁用 A2DP。(在配置选项卡中选择 A2DP Sink 时,该选项会立即取消选择并变为关闭。)如果您遇到此问题,请尝试删除/重命名 /var/lib/bluetooth 文件夹,如下所示

# mv /var/lib/bluetooth /var/lib/bluetooth.bak

之后重新配对您的 AirPods Pro(和其他设备)。这应该使所有配置(HSP/HFP 和 A2DP)再次可用,并可以从 pavucontrolpacmd 轻松访问。

HSP 问题:蓝牙音频接收器和源已创建,但没有音频传输

您可能缺少固件,或者 SCO(HSP 和 HFP 的音频协议)路由可能不正确。请参阅 [6] - BCM20702 的固件可以通过 bcm20702a1-firmwareAURbcm20702b0-firmwareAUR 安装。

错误:启动发现失败 org.bluez.Error.InProgress

本文或章节的事实准确性存在争议。

原因: 可能可以通过在 bluetoothctl 中发出 power offpower on 来替换。(在 Talk:Bluetooth headset 中讨论)

如果您的耳机已被发现,但连接失败并出现错误“Failed to start discovery org.bluez.Error.InProgress”,请安装 bluez-deprecated-tools 并运行

$ hciconfig hciX up
$ hciconfig hciX reset

其中 X 是您计算机的蓝牙设备的标识符(通常为 0)。

然后,您应该能够按照 #通过 CLI 配置 中的步骤进行连接。

由于耳机和 PulseAudio 之间同步导致音频音量过高

PulseAudio 15 起,“绝对音量”将耳机音量与 PulseAudio 互锁,使得无法单独更改其中一个。在某些耳机上,例如 Hoco W25 上,这可能会导致令人恼火的响度。要禁用“绝对音量”,请编辑 /etc/pulse/default.pa 并更改行

 load-module module-bluetooth-discover

 load-module module-bluetooth-discover avrcp_absolute_volume=false

在 HSP/HFP 和 A2DP 设置之间切换

可以通过以下命令轻松实现这一点,其中 card_number 可以通过运行 pacmd list-cards 获得。

$ pacmd set-card-profile card_number a2dp_sink

请注意,不同的配置文件可能具有不同的音量,您需要增加新配置文件的音量,然后才能再次听到声音。

为了在没有设置任何角色的情况下出现录制流时启用从 A2DP 到 HSP 的自动配置文件切换,您可以将 auto_switch=2 附加到 /etc/pulse/default.pa 中的 load-module module-bluetooth-policy

有关 PulseAudio 配置文件的更多信息,请参阅 PulseAudio 文档

A2DP 在 PulseAudio 中无法工作

套接字接口问题

如果在 bluez 4.1+ 和 PulseAudio 3.0+ 的情况下将配置文件更改为 A2DP 时 PulseAudio 失败,您可以尝试从 /etc/bluetooth/main.conf 禁用套接字接口,方法是删除行 Enable=Socket 并添加行 Disable=Socket

A2DP 音频接收器配置文件不可用

当 A2DP 音频接收器配置文件不可用时,将无法使用 PulseAudio 前端切换到 A2DP 音频接收器(输出),并且甚至不会列出 A2DP 音频接收器。可以使用 pactl 确认这一点。

$ pactl list | grep -C2 A2DP
     Profiles:
             headset_head_unit: Headset Head Unit (HSP/HFP) (sinks: 1, sources: 1, priority: 30, available: yes)
             a2dp_sink: High Fidelity Playback (A2DP Sink) (sinks: 1, sources: 0, priority: 40, available: no)
             off: Off (sinks: 0, sources: 0, priority: 0, available: yes)
        Active Profile: headset_head_unit

尝试使用 pacmd 手动设置网卡配置文件将失败。

$ pacmd set-card-profile bluez_card.C4_45_67_09_12_00 a2dp_sink
Failed to set card profile to 'a2dp_sink'.

已知从 PulseAudio 10.0 版本开始,通过 Bluedevil 或另一个 BlueZ 前端连接到蓝牙耳机时会发生这种情况。请参阅 相关错误报告。

在某些蓝牙控制器(例如 0a12:0001, Cambridge Silicon Radio)的耳机初始配对后也会出现此问题,这些控制器可能默认为 HandsfreeHeadset - HS 服务,并且不允许切换到需要 AudioSink 服务的 A2DP PulseAudio 音频接收器。

可能的解决方案

  • 对于某些耳机,使用耳机音量或播放/暂停控件(在连接时)可以触发 A2DP 配置文件变为可用。
  • 如果您正在使用其他内核,请尝试从正常的 linux 或 linux-lts 内核开始。
  • 通过 bluez-utilsbluetoothctl 连接到耳机可能会使 A2DP 音频接收器配置文件可用。每次连接蓝牙设备时都有一个自动化程序:fix-bt-a2dpAUR详细用法
[bluetooth]# connect headset_MAC_address
  • 手动切换到蓝牙的 AudioSink 服务,这将使 A2DP 配置文件及其 A2DP PulseAudio 音频接收器可用。这可以使用 blueman 中包含的 blueman-manager 或通过 bluetoothctl 注册 AudioSink 服务的 UUID 来完成。
$ bluetoothctl
[bluetooth]# menu gatt
[bluetooth]# register-service 0000110b-0000-1000-8000-00805f9b34fb
[bluetooth]# quit
  • 禁用耳机配置文件
/etc/bluetooth/main.conf
[General]
Disable=Headset
  • 启用 MultiProfile 支持。这可能有助于支持 A2DP 以及耳机音频的耳机。
/etc/bluetooth/main.conf
[General]
MultiProfile=multiple
  • 有时,以上步骤都无效。您可能尝试了重启和关闭/打开蓝牙,但无济于事。在这种情况下,请尝试重启 bluetooth.service
  • 对于某些带有音频控制面板的耳机型号,必须通过按下面板上的播放/暂停按钮来启用 A2DP 配置文件。

带有 GDM 的 Gnome

本文或章节是与 #连接成功,但我无法播放声音 合并的候选对象。

注意: 重复的说明(在 Talk:Bluetooth headset 中讨论)

以下说明已在 Gnome 3.24.2 和 PulseAudio 10.0 上测试,但它们可能仍然适用于其他版本并有用。

如果在使用 GNOME 和 GDM 的情况下,PulseAudio 在切换到 A2DP 配置文件时失败,您需要阻止 GDM 启动其自身的 PulseAudio 实例

  • 通过添加以下内容,防止 PulseAudio 客户端在服务器未运行时自动启动服务器
/var/lib/gdm/.config/pulse/client.conf
autospawn = no
daemon-binary = /bin/true
  • 防止 systemd 仍然通过套接字激活启动 PulseAudio
$ sudo -ugdm mkdir -p /var/lib/gdm/.config/systemd/user
$ sudo -ugdm ln -s /dev/null /var/lib/gdm/.config/systemd/user/pulseaudio.socket
  • 重启,并使用以下命令检查 gdm 用户是否没有 PulseAudio 进程
$ pgrep -u gdm pulseaudio

关于此问题的进一步讨论和替代修复方案,请参见 [7][8]。或者,可以尝试安装 fix-bt-a2dpAUR

HFP 在 PulseAudio 中无法工作

注意: 一些用户报告通过将 PulseAudio 替换为 PipeWire 以获得蓝牙支持,成功启用了 HFP 支持。[9] 请参阅 #通过 PipeWire 使用耳机 以获取安装说明。

仅支持 HFP 的蓝牙耳机可能无法在 PulseAudio 的标准配置中使用。相应的配置文件会出现,但它们不可用

bluetoothctl info
UUID: Audio Sink                (0000110b-0000-1000-8000-00805f9b34fb)
UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
UUID: A/V Remote Control        (0000110e-0000-1000-8000-00805f9b34fb)
UUID: Handsfree                 (0000111e-0000-1000-8000-00805f9b34fb)
pactl list
...
Profiles:
      ...
      headset_head_unit: Headset Head Unit (HSP/HFP) (sinks: 1, sources: 1, priority: 30, available: no)

要解决相应问题,请将 PulseAudio 和 BlueZ 更新到最新版本。然后 安装 ofonoAURphonesimAUR,然后按照 [10] 中的描述创建/激活一个虚拟调制解调器

注意: 创建 phonesim.conf 之后的步骤每次您想连接耳机时都应该执行。
  • 创建包含以下内容的 /etc/ofono/phonesim.conf
[phonesim]
Address=127.0.0.1
Driver=phonesim
Port=12345
  • 以用户身份启动
$ phonesim -p 12345 /usr/share/phonesim/default.xml &
$ dbus-send --print-reply --system --dest=org.ofono /phonesim org.ofono.Modem.SetProperty string:"Powered" variant:boolean:true
  • 激活调制解调器
$ dbus-send --print-reply --system --dest=org.ofono /phonesim org.ofono.Modem.SetProperty string:"Online" variant:boolean:true
  • 要检查结果,请使用 ofonoAUR 中安装在 /usr/lib/ofono/test/ 的测试命令。要供电、激活和测试调制解调器,您可以使用
$ /usr/lib/ofono/test/enable-modem /phonesim
$ /usr/lib/ofono/test/online-modem /phonesim
$ /usr/lib/ofono/test/list-modems

相应调制解调器部分的输出应如下所示

...
[ /phonesim ]
  Online = 1
  Powered = 1
  Lockdown = 0
  Emergency = 0
  Manufacturer = MeeGo
  ...
  • 最后,重启 PulseAudio 并重新连接耳机。现在,HFP 应该可用了
headset_head_unit: Headset Head Unit (HSP/HFP) (sinks: 1, sources: 1, priority: 30, available: yes)
注意: HFP 支持不稳定,可能会导致切换到 A2DP 时出现故障;如果需要的模式不可用,请尝试重新连接。

禁用 PulseAudio 自动将耳机切换到 HSP/HFP

当使用支持多种配置文件的蓝牙耳机时,某些应用程序会自动切换到 HSP/HFP 配置文件。如果不需要此行为,您可以通过将 auto_switch=false 参数附加到 bluetooth-policy 模块来禁用它

/etc/pulse/default.pa
load-module module-bluetooth-policy auto_switch=false

禁用 PipeWire HSP/HFP 配置文件

与 PulseAudio 不同,PipeWire 不会 响应输入事件自动在 A2DP 和 HSP/HFP 之间切换。但是,与其在 A2DP 失败时启用自动切换到(较低音质的)HSP/HFP 配置文件,您可能更愿意完全禁用前者。为此,请创建或编辑如下所示的 bluez 配置。

注意: 内置麦克风需要 HSP 模式才能工作 [11]
/etc/wireplumber/wireplumber.conf.d/51-mitigate-annoying-profile-switch.conf (or ~/.config/wireplumber/wireplumber.conf.d/51-mitigate-annoying-profile-switch.conf)
## In WirePlumber there's a bug where some applications trigger switching to Headset Profile
## --
## See issue #634, #645, #630, #629, #613
## --
## This config mitigates the issue by completely disabling the switching and support for Headset Profile (HFP)
## Using this would only make sense if you never plan on using the microphone that comes with your headset.

wireplumber.settings = {
  ## Whether to use headset profile in the presence of an input stream.
  ## --
  ## Disable for now, as it causes issues. See note at the top as to why.
  bluetooth.autoswitch-to-headset-profile = false
}

monitor.bluez.properties = {
  ## Enabled roles (default: [ a2dp_sink a2dp_source bap_sink bap_source hfp_hf hfp_ag ])
  ##
  ## Currently some headsets (Sony WH-1000XM3) are not working with
  ## both hsp_ag and hfp_ag enabled, so by default we enable only HFP.
  ##
  ## Supported roles: hsp_hs (HSP Headset),
  ##                  hsp_ag (HSP Audio Gateway),
  ##                  hfp_hf (HFP Hands-Free),
  ##                  hfp_ag (HFP Audio Gateway)
  ##                  a2dp_sink (A2DP Audio Sink)
  ##                  a2dp_source (A2DP Audio Source)
  ##                  bap_sink (LE Audio Basic Audio Profile Sink)
  ##                  bap_source (LE Audio Basic Audio Profile Source)
  ## --
  ## Only enable A2DP here and disable HFP. See note at the top as to why.
  bluez5.roles = [ a2dp_sink a2dp_source ]
}

正如 Wireplumber 问题跟踪器上的此评论 中建议的那样。

替代方案:A2DP 双工通道

FastStream、AptX LL 和 “Opus 05 Pro”(pipewire 的一项发明)具有 “双工” 通道,允许发送麦克风音频而无需进入 HSP/HFP 并容忍音质下降。PipeWire 而不是 PulseAudio 支持此功能。一旦检测到该功能,支持将自动启用。与现有配置文件切换器 (WirePlumber) 的交互未知。

技巧与窍门

以下内容适用于 PipeWire 和 PulseAudio。

电池电量报告

注意: 这是一个实验性功能。启用它可能会阻止某些蓝牙鼠标自动连接(请参阅 GitHub 问题)。

要获取耳机当前电量并报告给 upower,您必须按照 Bluetooth#启用实验性功能 中的描述启用 bluez 的 D-Bus 实验性功能。

媒体控制

要使用媒体控制,可以将它们转发到 MPRIS,在那里它们可以被支持 MPRIS 进行外部控制的媒体播放器拾取。有关详细信息,请参阅 MPRIS#蓝牙

AVRCP 媒体控制

对于具有过度灵敏的触摸控制的蓝牙耳机,可能需要禁用 AVRCP 播放控制,可以通过对应于虚拟 AVRCP 输入设备的 inhibited sysfs 文件来禁用,例如 /sys/devices/virtual/input/input877/inhibited。可以通过 name 属性(/sys/devices/virtual/input/input877/name)来识别正确的虚拟输入,例如可能是 “Soundcore Life P3 (AVRCP)”。将 1 回显到此文件会禁用 AVRCP,将 0 回显到此文件会重新启用它。可以在运行时动态更改此设置,而无需重启 bluetoothd 或断开设备连接。

这将在设备断开连接和重新连接时重置,因此可能需要通过 udev 规则自动设置它,例如

SUBSYSTEM=="input" ATTR{name}=="Soundcore Life P3 (AVRCP)" ATTR{inhibited}="1"

如果您希望能够以普通用户身份更改此属性,请参阅 udev#允许普通用户使用设备