PipeWire 是一个服务器和 API,用于在 Linux 上处理多媒体。它最常见的用途是为 Wayland 和 Flatpak 应用程序实现屏幕共享、远程桌面以及不同软件之间其他形式的音频和视频路由。根据它的官方FAQ,“你可以把它看作是应用程序和库可以使用的驱动之上的多媒体路由层”。

相较于 PulseAudio 专注于消费级音频和 JACK 专注于专业级音频,PipeWire 的目标是为所有级别的用户工作。在其他技术中,PipeWire 通过提供在不同的缓冲区大小之间动态切换的能力来实现这一目标,以适应不同音频应用的不同延迟要求。

在 Debian 10 中,PipeWire 0.2.5 是可用的,它应该不需要手动安装,因为它通常被使用它的应用程序作为一个依赖项带入。

在 Debian 11中,PipeWire 0.3.19 是可用的,并且可以试验性地用来替代 ALSA 用户空间库、PulseAudioJACK。这是一个存在文档但不支持的用例。

在 Debian Testing 和 Debian Unstable 中有更新的 PipeWire 版本。对于这些分发的用户来说,PipeWire 应该更加可靠,在许多用例下可以很好地替代。


安装

在其最基本的形式下,PipeWire 可以简单地通过安装 pipewire 软件包来安装。

在 Debian 10 中,一些插件被分割成独立的软件包。这些插件可以在 libspa-bluetoothlibspa-ffmpeg 软件包中找到。

在 Debian 11 中,不再存在单独的 FFmpeg 插件软件包,蓝牙插件软件包也被移动到了 libspa-0.2-bluetooth。在 libspa-0.2-jack 软件包中有一个 JACK 插件,这是使用 PipeWire 作为 JACK 服务器所需要的(参见下文)。

对于 Debian 11 和更新的版本,PipeWire 可以用来替代 PulseAudio。此外,pipewire-audio-client-libraries 软件包也可用。这个软件包中提供的库允许直接访问 JACK 和 ALSA 的应用程序通过 PipeWire 服务器输出,这允许不同的声音服务器和 API 之间能够进行互操作。

对于 Debian 12 和更新的版本,pipewire-audio-client-librariespipewire-alsapipewire-jack 替代。


配置

作为 PulseAudio/JACK/ALSA 的替代使用

Debian 11

按照 Simon McVittie 的说法,“这不是 Debian 11 支持的方案,被认为是实验性的。”

它可能会破坏某些应用程序,缺少某些功能,或根本不能工作。

用户也可能对 PipeWire 直接替代现有的 Linux 音频解决方案的能力(包括 PulseAudio 和 JACK)感兴趣。潜在的好处包括降低 CPU 使用率,更好地支持蓝牙设备,以及能够更好地整合使用 JACK 和 PulseAudio的应用程序。它已成为其他一些分发中的默认解决方案,特别是在 Fedora 34 和更新的版本中。

这种行为可以在 Debian 11 中实验性地启用。

下面的三个关于 PipeWire 替换现存的音频服务的教程是相互独立的,但如果你打算使用 PipeWire 替换其中的任何一个,仍然强烈建议你使用 PipeWire 替换它们中的全部,以便在不同的应用程序之间进行最好的整合。


PulseAudio

在这种情况下,PipeWire 作为每个用户的音频服务运行,完全取代了 PulseAudio。

创建空文件:

# touch /etc/pipewire/media-session.d/with-pulseaudio

通过复制示例文件来创建 pipewire-pulse 服务:

# cp /usr/share/doc/pipewire/examples/systemd/user/pipewire-pulse.* /etc/systemd/user/

以普通用户(不是root)身份运行这三个命令:

//检查是否有新的服务文件:
systemctl --user daemon-reload
//禁用并停止 PulseAudio 服务:
systemctl --user --now disable pulseaudio.service pulseaudio.socket
//启用并启动新的 pipewire-pulse 服务:
systemctl --user --now enable pipewire pipewire-pulse

以普通用户身份运行以下命令,以检查哪一个服务器正在运行:

LANG=C pactl info | grep '^Server Name'

如果正在运行的是 PipeWire,显示的服务器名称应当是:

PulseAudio (On PipeWire 0.3.19)

确认在 PipeWire 能够在重启后继续工作。如果并非如此,你可能需要通过以下命令来屏蔽 PulseAudio 服务:

systemctl --user mask pulseaudio

这可能需要你进行再次重启,此后你的系统应该只使用 PipeWire,即使再次进行重启后也是如此。这条命令将阻止 PulseAudio 服务被直接激活。如果你想恢复以前的状态,你需要使用 "unmask" 操作对相同的服务执行命令以解除屏蔽。

root

如果您希望以 root 用户身份运行 PipeWire,请删除或注释这一行:

ConditionUser=!root

需要编辑的文件:

"/usr/lib/systemd/user" 中的 "pipewire.socket" 和 "pipewire.service"

"/etc/xdg/systemd/user" 中的 "pipewire-pulse.service" 和 "pipewire-pulse.socket"


ALSA

ALSA 客户端可以被配置为通过 PipeWire 输出。

有些人可能将此描述为 “取代ALSA”,但正如 PipeWire 的 FAQ 所澄清的那样:“不,ALSA 是 Linux 音频堆栈的一个重要部分,它提供了与内核音频驱动的接口。但是,ALSA 用户空间库里有很多东西现在可能已经不需要了,比如效果插件、混音、路由等。PipeWire 使用 ALSA 核心功能的一个小子集来访问硬件。所有其他的功能都应该由 PipeWire 来处理。”

安装 pipewire-audio-client-libraries 软件包,如果它还没有被安装。

创建空文件

# touch /etc/pipewire/media-session.d/with-alsa

从 PipeWire 示例文件复制一个配置文件到你的 ALSA 配置目录:

# cp /usr/share/doc/pipewire/examples/alsa.conf.d/99-pipewire-default.conf /etc/alsa/conf.d/


JACK

JACK 客户端可以被配置为通过 PipeWire 而不是 JACK 输出。

安装 pipewire-audio-client-librarieslibspa-0.2-jack 软件包,如果它们还没有被安装。

创建空文件:

# touch /etc/pipewire/media-session.d/with-jack

要么使用 pw-jack 包装器运行 JACK 客户端,要么复制:

# cp /usr/share/doc/pipewire/examples/ld.so.conf.d/pipewire-jack-*.conf /etc/ld.so.conf.d/

并运行:

# ldconfig

这将在应用程序运行时用 PipeWire 的替代库替换 JACK 服务器库,方法是将动态链接器指向 /usr/lib/x86_64-linux-gnu/pipewire-0.3/jack/ 文件夹。


蓝牙

一般来说,PipeWire 与 Bluez 配合使用,在替代 PulseAudio 的情况下,可以为支持蓝牙的音频设备提供高质量的音频,但有一些注意事项。

至少,你需要安装 libspa-0.2-bluetooth 软件包,删除 pulseaudio-module-bluetooth 软件包,然后重新启动你的计算机或重启 PipeWire 服务,否则设备连接将以 “协议不可用” 而失败。

默认情况下,PipeWire将尝试选择最佳的编解码器。你可以在 /etc/pipewire/media-session.d/bluez-monitor.conf 文件中覆盖这一行为,并调整许多其他相关设置。 你可以直接编辑这个文件,或者将该文件复制到 ~/.config/pipewire/media-session.d/bluez-monitor.conf 中,然后编辑它,以此来存储每个用户的本地修改。

此外,自从 PipeWire 0.3.19 发布以来,已经有许多与蓝牙相关的功能添加和错误修复。Debian Bullseye 中的版本并不代表 PipeWire 目前的状态。


Debian Testing/Unstable

新版本的 PipeWire 将出现在 Debian 12 中,它目前在 Debian Testing/Unstable 中出现,它的兼容性和可靠性都有很大的提高,而且也更容易配置为替代品。

现在有两个会话管理器可用。默认情况下的会话管理器(pipewire-media-session)是原始的,在使用 PipeWire 的基本功能如屏幕共享时是最好的。当使用 PipeWire 作为你的系统的声音服务器时,维护者建议安装更先进的 WirePlumber 代替。这个命令将安装 WirePlumber,同时删除旧的会话管理器:

# apt install wireplumber pipewire-media-session-

然后你需要在 systemd 中启用 WirePlumber (以普通用户身份运行,而不是以root身份):

$ systemctl --user --now enable wireplumber.service

当使用 WirePlumber 时,使用 PipeWire 作为你的声音服务器所需的配置非常少。事实上, WirePlumber 软件包推荐 pipewire-pulse ,所以这可能会自动发生。你只需要手动启用 ALSA 和 JACK 层,这不再需要在你的媒体会话的配置目录中创建一个空文件(因为使用 WirePlumber 时,该目录甚至不存在),但仍然需要从你的 /usr/share/doc/pipewire/examples/ 目录中复制文件,如 Debian 11 的说明中所述。

如果你对自动蓝牙配置文件切换感兴趣(例如,当应用程序需要麦克风访问时,从 A2DP 切换到 HSP/HFP), WirePlumber 在 0.4.8 版本中获得了对它的支持。

与 Debian 11 相比,一个值得注意的变化是,配置目录从 /etc/pipewire/ 移动到了 /usr/share/pipewire/:你可能想摆脱前者以避免混淆。


PulseAudio

安装 pipewire-pulse 软件包,并重新启动。这将配置 PipeWire 激活它的 PulseAudio 替代守护程序。通过运行以下命令验证它是否被激活:

LANG=C pactl info | grep '^Server Name'

如果 PipeWire 配置正确,这将会打印出:

Server Name: PulseAudio (on PipeWire 0.3.XX)

如果它不能正常工作,请参考 Debian 11 的对应教程中关于屏蔽 PulseAudio 服务的相关说明。


ALSA 和 JACK

在撰写本文时,Debian 11 的对应教程中的相关说明仍然适用。

请记住,如果你使用 WirePlumber 而不是 pipewire-media-session,则不需要 "touch" 命令。关于你应该使用哪个会话管理器的更多细节,请参考本节顶部。

如果你正在使用 pipewire-media-session,注意它的配置目录已经从 /etc/pipewire/media-session.d/ 移动到 /usr/share/pipewire/media-session.d,在参照旧的说明时,请根据需要调整路径。


蓝牙

参考 Debian 11 的文档中对应的相关信息。


路由接收端、源端和音频设备

如果你对使用 PipeWire 配置接收端和源端的管道感兴趣,就像你通常使用 PulseAudio 所做的那样,最简单的方法是使用 QjackCtl。

首先,确保你已经正确配置了 PipeWire 以替代 ALSA、JACK PulseAudio。然后,安装 qjackctl 软件包,并运行已被安装的软件。

它应该已经被激活,检测到 PipeWire 是一个正在运行的 JACK 服务器。从其窗口点击 "Graph" 按钮。这将展示你系统上作为音频输入或输出的每个音频设备的图形表示。 此外,它还会显示每个正在输出或接收音频的活动程序,以及所有这些程序之间的连接状况。

你可以通过简单的拖动来创建应用程序、音频硬件或其组合之间的新连接。一些流行的用途是:

天空是极限!

这只有通过 PipeWire 才能实现,否则 QjackCtl 只会显示 JACK 客户端,而忽略了使用 PulseAudio 或 ALSA 的应用程序。然而,PipeWire 把所有这些都集中在一起,允许对可能使用不同 API 的程序进行任意的配置。

同样的任务可以通过 PipeWire 的原生图形工具 qpwgraph 或 PipeWire的命令行工具 pw-link 来完成。这些工具允许在 PipeWire 端口之间创建和销毁链接(换句话说,它们取代了 JACK 的 jack_connectjack_disconnect  工具)。


已知问题

pacmd 失败并报错 “没有运行的 PulseAudio 守护进程”

pacmd 命令失败并报错:

$ pacmd
No PulseAudio daemon running, or not running as session daemon.

pactl 命令在功能上应该是大致相当的,而且能够与 pipewire 后端一起工作。

跳过音频和 “客户端错过了一次唤醒”

至少有一个用户(TheAnarcat)在使用 pipewire 的工作站上运行(borg)备份时遇到了奇怪的 “音量降低” 和 “跳过音频” 问题。日志中出现了 “客户端错过了1次唤醒” 的信息,情况恶化到根本无法播放音频的地步。重新启动 pipewire,问题就解决了。

systemctl --user restart pipewire.service

在高负载系统上音频不稳定

PulseAudio 相比,PipeWire 的延迟较低,在高负载的系统上会导致音频不稳定。

首先用 pw-top 命令查看 quantum ,然后用这个命令增加 quantum 值,直到音频变得更加平滑。

pw-metadata -n settings 0 clock.force-quantum 2048

一旦你找到适合你情况的 quantum 值,你可以通过创建一个内容如下的配置文件 ~/.config/pipewire/pipewire.conf.d/choppy-under-load.conf,并重启与 pipewire 相关的守护程序,使这个值永久化。

context.properties = {
   default.clock.force-quantum = 2048
   default.clock.quantum = 2048
   default.clock.min-quantum = 2048
}


参见

查看 /usr/share/doc/pipewire-audio-client-libraries/README.Debian 文件,阅读关于使用 PipeWire 替代其他音频服务器的 Debian 官方软件包文档。


CategoryHardware | CategorySound | CategorySoftware