24.04 版支持全系统音频(包括蓝牙设备)

24.04 版支持全系统音频(包括蓝牙设备)

我需要工作设置来执行以下操作:

  1. 启动时自动连接一些蓝牙音频设备(蓝牙扬声器)。
  2. 在系统启动时(或通过其他 cron 后台任务)自动在多个音频设备上播放音乐(包括来自点 1 的蓝牙)。

要求: 避免交互式登录此系统。

我在 Ubuntu Desktop 22.04 上进行了这样的设置,使用 PulseAudio 作为系统范围的服务。设置非常简单:

  1. 为系统范围的 PulseAudio 服务 /etc/systemd/system/pulseaudio.service 创建单元文件,以使用“--system”标志执行 pulseaudio:
[Unit]
Description=PulseAudio system server

[Service]
Type=notify
ExecStart=pulseaudio --daemonize=no --system --realtime --log-target=journal
Restart=on-failure

[Install]
WantedBy=multi-user.target
  1. 启用此单元:
sudo systemctl enable pulseaudio
  1. 添加将连接蓝牙设备并播放音乐的用户帐户到以下组:pulse、pulse-access、audio
sudo usermod -a -G pulse,pulse-access,audio homeadmin
  1. 将系统与蓝牙音频设备配对。这只需要一次,所以我以交互方式登录系统并使用“设置”连接蓝牙扬声器。
  2. 创建脚本(/usr/local/bin/connect_audio.sh),连接蓝牙设备并组合音频接收器,如下所示:
bluetoothctl connect <blutooth device mac>
pactl load-module module-combine-sink
  1. 来自第 5 点的计划脚本和使用 cron 的音频播放器:
@reboot /usr/local/bin/connect_audio.sh; mpg123 <path to mp3>

但是我无法将此设置迁移到 Ubuntu 24.04。它不起作用。在安装 PulseAudio 并将其作为 24.04 上的系统范围服务(如上所述)后,我无法在没有交互式登录的情况下将蓝牙音频设备作为系统音频设备供用户使用。看起来 pipewire 被用作 Ubuntu Desktop 24.04 的音频子系统,它阻止了这种情况。

我在 24.04 尝试做过以下事情:

  1. 查找并使用配置来运行与 PulseAudio 相同的系统范围的 pipewire。未找到支持蓝牙的有效解决方案。目前看来这是不可能的,而且不受支持。以下是一些讨论: https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/1610
  2. 要禁用 pipewire (如何卸载 pipewire 并返回 pulseaudio),安装 Pulse audio,然后将 PulseAudio 设置为系统范围的服务(如上所述)。看起来不可能完全禁用 pipewire,因为它现在是桌面 (gdm) 的一部分。

请帮助我使用 pipewire 或 PulseAudio 在 Ubuntu Desktop 24.04 上进行工作设置。

更新。我发现解决此问题的唯一两个有效选项是:

  1. 使用 Ubuntu Server 24.04 而不是 Desktop。它没有 gdm(图形界面),因此没有安装 pipewire。在这种情况下,蓝牙和音频无法“开箱即用”,需要额外的配置步骤。
  2. 使用 Ubuntu 桌面,但启用自动登录用户帐户,并连接蓝牙扬声器。这是蓝牙扬声器开始作为系统中的音频设备供用户使用的唯一情况。但在这种情况下,我的要求没有得到满足。

答案1

经过大量研究,我终于找到了符合我的需求且不需要系统范围音频配置的工作设置。设置取决于发行版中默认使用的音频子系统:PulseAudio(Ubuntu 22.04)或 PipeWire(Ubuntu 24.04)。

PulseAudio(Ubuntu 22.04)

您无需将 PulseAudio 模式从用户模式更改为系统模式。只需修改以下设置:

autospawn = yes

/etc/pulse/client.conf
  1. 启用登录延迟:
sudo loginctl enable-linger <user account>

其中<user account>是运行带有任务的 cron 的帐户名。

PulseAudio 默认作为用户服务运行,在最后一个会话结束后终止。为用户启用逗留功能可解决此问题。

要检查延迟状态:

sudo loginctl user-status <user account>
  1. 将用户帐户添加到音频、脉冲、脉冲访问、蓝牙组:
sudo usermod -G audio,pulse,pulse-access,bluetooth -a <user account>
  1. 在 cron 脚本 (/usr/local/bin/connect_audio.sh) 中,您需要在蓝牙连接和接收器结合之前开始播放音频文件以生成 PulseAudio 进程:
/usr/bin/mpg321 <path to mp3> &
sleep 5
bluetoothctl connect <blutooth device mac>
pactl load-module module-combine-sink

PipeWire(Ubuntu 24.04)

  1. 启用登录延迟:
sudo loginctl enable-linger <user account>

其中<user account>是运行带有任务的 cron 的帐户名。

PipeWire 默认作为用户服务运行,一旦最后一个会话结束,服务就会终止。为用户启用延迟功能可解决此问题。

  1. 将此用户帐户添加到音频、蓝牙组:
sudo usermod -G audio,bluetooth -a <user account>
  1. 创建文件 /etc/wireplumber/bluetooth.lua.d/50-bluez-config.lua,内容如下:
bluez_monitor.properties = {
  ["with-logind"] = false,
}
sudo mkdir -p /etc/wireplumber/bluetooth.lua.d/
sudo nano /etc/wireplumber/bluetooth.lua.d/50-bluez-config.lua

当使用 PipeWire 运行 WirePlumber 时(通常如此),WirePlumber 会运行“logind-monitor”,它在登录时启用蓝牙,在注销时禁用蓝牙。

链接

https://wiki.archlinux.org/title/bluetooth

https://wiki.archlinux.org/title/Systemd/User#Automatic_start-up_of_systemd_user_instances

https://wiki.archlinux.org/title/WirePlumber#Keep_Bluetooth_running_after_logout_/_Headless_Bluetooth

相关内容