蓝牙耳机
存在三种蓝牙音频系统
- 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(它取代了 pulseaudio 和 pulseaudio-bluetooth)。
守护进程将作为用户服务自动启动。使用 pavucontrol 或桌面环境的设置进行配置。有关更多信息,请参阅 PipeWire#蓝牙设备。
截至 2025 年 2 月,LE 音频系统仍处于实验阶段,因此默认情况下禁用 LC3 编解码器,但通过一些努力可以使用它。有关更新,请参阅 PipeWire wiki [2]。或者,监控此主题 [3]。
故障排除
由于耳机和 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 使用耳机
安装 pulseaudio-alsa、pulseaudio-bluetooth 和 bluez-utils 软件包,最后一个软件包提供了 bluetoothctl
实用程序。
通过 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 的“播放”和“录制”选项卡通过该设备重定向任何音频。
您现在可以再次禁用扫描并退出程序
[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
通过 GNOME Bluetooth 配置
您可以使用 GNOME Bluetooth 图形前端轻松配置蓝牙耳机。
首先,您需要确保 bluetooth.service
systemd 单元正在运行。
打开 GNOME Bluetooth 并激活蓝牙。扫描设备后,您可以在设备列表中选择您的耳机以连接。您可以从设备菜单直接访问声音配置面板。在声音面板上,连接设备后应出现新的音频接收器。
LDAC/aptX
自 PulseAudio 15.0 起,支持 LDAC/aptX 编解码器。您可以按如下方式验证您用于连接的编解码器
$ pactl list | grep a2dp_codec
故障排除
声音差 / 静态噪音 / “浑浊”的声音
如果您在使用耳机时遇到声音质量不佳的情况,则很可能是因为您的耳机未设置为正确的配置文件。请参阅 #在 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.pa
或 system.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 配置。否则,请返回并确保连接成功。
当使用 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)再次可用,并可以从 pavucontrol 和 pacmd 轻松访问。
HSP 问题:蓝牙音频接收器和源已创建,但没有音频传输
您可能缺少固件,或者 SCO(HSP 和 HFP 的音频协议)路由可能不正确。请参阅 [6] - BCM20702 的固件可以通过 bcm20702a1-firmwareAUR 或 bcm20702b0-firmwareAUR 安装。
错误:启动发现失败 org.bluez.Error.InProgress
如果您的耳机已被发现,但连接失败并出现错误“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 音频接收器配置文件不可用时,将无法使用 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
)的耳机初始配对后也会出现此问题,这些控制器可能默认为 Handsfree
或 Headset - HS
服务,并且不允许切换到需要 AudioSink
服务的 A2DP PulseAudio 音频接收器。
可能的解决方案
- 对于某些耳机,使用耳机音量或播放/暂停控件(在连接时)可以触发 A2DP 配置文件变为可用。
- 如果您正在使用其他内核,请尝试从正常的 linux 或 linux-lts 内核开始。
- 通过 bluez-utils 从
bluetoothctl
连接到耳机可能会使 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
以下说明已在 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 中无法工作
仅支持 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 更新到最新版本。然后 安装 ofonoAUR 和 phonesimAUR,然后按照 [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 &
- 启用/启动
ofono.service
。 - 为调制解调器供电
$ 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)
禁用 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 配置。
/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。
电池电量报告
要获取耳机当前电量并报告给 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#允许普通用户使用设备