解决方案

解决方案

我经常以两个不同的用户身份运行两个 KDE 会话。当我在它们之间切换(例如 Ctrl+Alt+F8)时,其中一个帐户中正在播放的音乐在另一个帐户上将被静音。当我切换到虚拟终端(Ctrl+Alt+F1)时,也会发生同样的情况。

据我所知,这是故意的,对于多个人类用户来说是有意义的,但在我的设置中很烦人。

当我切换到另一个 KDE 会话或虚拟终端时,如何保持可以听到音乐?

我使用基于 Ubuntu 16.04 LTS (Xenial Xerus) 的 KDE Neon 5 以及 KDE 5.36.0 和 Pulseaudio 8.0。

答案1

解决方案

  1. 将所有应该能够播放的用户添加到脉冲存取团体

    # adduser problemofficer pulse-access

  2. 创造/etc/systemd/system/pulseaudio.service包含以下内容:

    [Service]
    Type=simple
    PIDFile=/var/run/pulse/pid
    ExecStart=/usr/bin/pulseaudio --daemonize=yes --system=yes --disallow-module-loading=yes --disallow-exit=yes
    
    [Install]
    WantedBy=multi-user.target
    
  3. 启用这个新的 systemd 服务,以便它在启动时启动:# systemctl enable pulseaudio

  4. 请注意,此配置是

    • 安全性较低(例如其他用户可以监听您的麦克风)
    • 声音输出将不再自动切换到耳机和从耳机切换
    • 可能会阻止蓝牙工作。另请参阅下面的警告部分。
  5. 重启

原因

声音关闭的原因是每次登录时都会使用该用户权限启动 Pulseaudio,并且系统 不允许其他用户收听其他用户的音频。

解决方案背景

脉冲音频

为了解决这个问题,Pulseaudio 必须以 root 权限启动,以便它作为系统范围的守护进程运行,该守护进程仅适用于所有用户。每个人都将连接到这一实例,并且能够播放和收听其他用户播放或录制的所有内容。

Pulseaudio 实际上不会一直以 root 身份运行,但会放弃这些权限并假定用户脉冲

man pulseaudio

用户 脉冲, 团体 脉冲:如果 PulseAudio 作为系统守护进程运行(请参阅上面的 --system)并以 root 身份启动,则守护进程将放弃权限并成为使用此用户和组的普通用户进程。如果 PulseAudio 作为用户守护程序运行,则此用户和组没有任何意义。

请注意,“用户守护进程”与“系统守护进程”不同。前者是 Pulseaudio 之前的运行方式,后者是应用更改后的运行方式。

为了能够连接到 Pulseaudio 系统服务,您需要成为脉冲存取团体。

再次来自man pulseaudio

团体 脉冲存取:如果 PulseAudio 作为系统守护进程运行(请参阅上面的 --system),则当该组的成员通过 AF_UNIX 套接字连接时,将授予他们访问权限。如果 PulseAudio 作为用户守护进程运行,则该组没有任何意义。

系统服务

作为一种快速解决方法,可以简单地杀死 Pulseaudio 的所有“用户守护程序”实例,然后运行/usr/bin/pulseaudio --system=yes​​.这将以一种更不安全的方式启动 Pulseaudio,而不会成为守护进程,但对于快速概念验证检查可能很有用。

为了使其持久化并使 Pulseaudio 守护进程在启动时自动启动,需要将其添加为 systemd 服务。这就是文件的内容/etc/systemd/system/pulseaudio.service是为了.

当 Pulseaudio 已经找到系统守护进程时,它不会启动用户守护进程²,这就是该解决方案有效的原因。

警告

Pulseaudio 官方文档反对使用 Pulseaudio 作为系统守护进程的建议。提到的一些问题是:

  • ...从安全角度来看,一个特别有问题的事情是模块加载。任何有权访问的人都可以加载和卸载模块。可以禁用模块加载,但蓝牙和 alsa 热插拔功能不起作用...

(这意味着当您插入耳机时,声音输出不会自动从扬声器切换到耳机。当您拔下耳机时,情况也相反。两者都必须手动完成。)

  • ...系统模式下内存使用率和 CPU 负载更高...

    (就我个人而言,我没有注意到负载有任何变化。)

  • ...有权访问服务器的所有用户都可以嗅探彼此的音频流,收听他们的麦克风,等等...

  • ...您还失去了许多进一步的功能,例如桥接到杰克...

可能还有其他我不理解并因此觉得不值得的事情,包括这里。

关于 thecarpy 答案的注意事项:他的回答中描述的步骤对于此解决方案来说都不是必需的。

资源


1 如果有人能详细解释这一点,我将非常感激。

² 假设[需要引用]

答案2

https://bugs.launchpad.net/ubuntu/+source/pulseaudio/+bug/213149:

这是脉冲音频的“功能”。

编辑/etc/default/pulseaudio

改成PULSEAUDIO_SYSTEM_START=0PULSEAUDIO_SYSTEM_START=1

这样,pulseaudio 就会在系统模式下启动。

/etc/default/pulseaudio文件中:

# Start the PulseAudio sound server in system mode.
# (enables the pulseaudio init script)
# System mode is not the recommended way to run PulseAudio as it has some
# limitations (such as no shared memory access) and could potentially allow
# users to disconnect or redirect each others audio streams. The
# recommend way to run PulseAudio is as a per-session daemon. For GNOME
# sessions you can install pulseaudio-esound-compat and GNOME will
# automatically start PulseAudio on login (if ESD is enabled in
# System->Preferences->Sound). For other sessions, you can simply start
# PulseAudio with "pulseaudio --daemonize".
# 0 = don't start, 1 = start

应用更改的最简单方法是确保使用该选项启动pulseaudio--daemonize并重新启动系统。

另一种选择是完全删除pulseaudio并使用alsa代替,我个人的首选选择......

答案3

我正在使用 systemd 运行 Arch Linux,并且遇到了完全相同的问题。我的目标只是切换到另一个用户(通过 Ctrl-Alt-Fx 或通过显示管理器)并保持声音运行。

我终于让它工作了,而不必使用系统模式(危险的,不受支持的)或PolicyKit(对此一无所知)。

脚步:

  1. 将 PulseAudio 应继续播放的 $USER 添加到“音频”组:usermod -aG audio $USER
  2. 为用户启用延迟,以便 PulseAudio 在未登录的情况下启动: loginctl enable-linger $USER

如果这项工作有效,您可以选择通过向 中添加一些内容来将该用户的 PA 共享给网络上的其他用户~/.config/pulse/default.pa,例如:

load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/24

对于“客户端用户”只需添加~/.config/pulse/client.conf

default-server = 127.0.0.1

相关内容