Linux 多用户环境下 AirPods 已连接但没有声音排查与修复

一台 Ubuntu 双系统主机上,AirPods 可以完成蓝牙配对,也能显示为已连接,但 GNOME 的声音输出列表里没有 AirPods,应用音频仍然只能输出到板载声卡或 HDMI。这是 Linux 多用户音频服务抢占了蓝牙音频 profile。

蓝牙层看起来正常:

bluetoothctl devices Connected

能看到 AirPods 已连接:

Device AA:BB:CC:DD:EE:FF AirPods Pro

设备详情也显示已配对、已信任、已连接,并且包含音频相关 UUID:

Paired: yes
Trusted: yes
Connected: yes
UUID: Audio Sink
UUID: Handsfree

但 PipeWire 里没有对应的蓝牙音频设备:

wpctl status

只看到本机声卡输出,看不到类似下面的条目:

AirPods Pro [bluez5]

真正根因:多个用户的 WirePlumber 抢占 BlueZ 蓝牙音频 profile

Ubuntu 24.04 默认使用 PipeWire 和 WirePlumber 管理音频。蓝牙音频由 WirePlumber 向 BlueZ 注册 A2DP/HFP profile。

问题在于:

  • BlueZ 是系统级服务
  • 蓝牙音频 profile 是全系统资源
  • WirePlumber 是用户级服务
  • 多个登录用户可以各自启动自己的 WirePlumber

如果这台机器除了桌面用户外,还有 SSH 用户、VS Code Remote 用户或残留登录会话,它们也可能启动自己的:

pipewire
pipewire-pulse
wireplumber

于是多个用户的 WirePlumber 会同时尝试向 BlueZ 注册蓝牙音频 profile。谁先注册成功,谁就占住资源。桌面用户如果没有抢到,就会出现:

RegisterProfile() failed: org.bluez.Error.NotPermitted

WirePlumber 日志里还可能看到:

Multiple sound server instances are probably trying to use Bluetooth audio at the same time

这时蓝牙连接本身是正常的,但桌面用户的 PipeWire 无法创建 AirPods 的音频 sink,所以声音设置里没有该设备。

诊断步骤

1. 确认蓝牙层是否正常

bluetoothctl info AA:BB:CC:DD:EE:FF

重点看:

Paired: yes
Trusted: yes
Connected: yes
UUID: Audio Sink

如果这些都存在,说明蓝牙配对和连接层基本正常。

2. 确认 PipeWire 是否生成蓝牙输出

wpctl status

正常情况下应该看到:

Audio
 ├─ Devices:
 │      AirPods Pro [bluez5]
 ├─ Sinks:
 │  *   AirPods Pro

如果蓝牙已连接但这里没有 AirPods,问题通常在音频 profile 注册或 PipeWire/WirePlumber。

3. 查看 WirePlumber 日志

journalctl --user -u wireplumber -n 120 --no-pager

如果看到:

RegisterProfile() failed: org.bluez.Error.NotPermitted

或者:

Multiple sound server instances are probably trying to use Bluetooth audio at the same time

基本可以确认是多用户音频服务抢占。

4. 查看是否有其他用户的音频服务

ps -ef | grep -Ei "wireplumber|pipewire|pipewire-pulse|pulseaudio|bluealsa"

问题场景中可能会看到类似:

desktop-user   ... /usr/bin/wireplumber
ssh-user-a     ... /usr/bin/wireplumber
ssh-user-b     ... /usr/bin/wireplumber

还可以查看登录会话:

loginctl list-users
loginctl list-sessions

如果只有一个桌面用户,却有多个 SSH 用户的 WirePlumber 正在运行,就很可能是根因。

临时修复

先终止非桌面用户的残留会话,释放 BlueZ profile:

sudo loginctl terminate-user ssh-user-a
sudo loginctl terminate-user ssh-user-b

然后重启桌面用户的音频栈:

systemctl --user restart wireplumber pipewire-pulse pipewire

重新连接 AirPods:

bluetoothctl connect AA:BB:CC:DD:EE:FF

再确认输出设备:

wpctl status

成功后应能看到:

AirPods Pro [bluez5]
* AirPods Pro

长期修复

如果这台机器又有桌面用户,又有 SSH 或 VS Code Remote 使用,那么建议不要让 SSH 用户启动 WirePlumber。

可以对非桌面用户禁用用户级 WirePlumber:

sudo -u ssh-user-a XDG_RUNTIME_DIR=/run/user/1002 systemctl --user mask --now wireplumber.service
sudo -u ssh-user-b XDG_RUNTIME_DIR=/run/user/1003 systemctl --user mask --now wireplumber.service

如果对应用户没有正在登录,可能需要等该用户登录后执行,或者由管理员在用户级 systemd 配置中做持久化处理。

核心原则是:让唯一的桌面用户运行 WirePlumber,并由它负责注册蓝牙音频 profile。不要让多个 SSH 用户的 WirePlumber 同时尝试管理 BlueZ 蓝牙音频。

posted @ 2026-07-05 16:33  Ofnoname  阅读(23)  评论(0)    收藏  举报