PipeWire
PipeWire 是一个新的底层多媒体框架。它的目标是提供低延迟的音频和视频捕获及播放,并支持 PulseAudio、JACK、ALSA 和基于 GStreamer 的应用程序。
基于该框架的守护进程可以配置为音频服务器(具有 PulseAudio 和 JACK 功能)和视频捕获服务器。
PipeWire 还支持 Flatpak 等容器,并且不依赖于 audio 和 video 用户组。相反,它使用类似 Polkit 的安全模型,请求 Flatpak 或 Wayland 录制屏幕或音频的权限。
安装
安装 官方仓库中的 pipewire 包。对于 multilib 支持,还有 lib32-pipewire。
Pipewire 使用 systemd/User 来管理服务器和自动套接字激活。
可选地,安装 pipewire-docs 来查阅文档。
Pipewire 可以作为其他音频服务器的替代品。有关详细信息,请参阅 #音频。
会话管理器
与 JACK 类似,PipeWire 内部不实现连接逻辑。负责监控新流并将其连接到适当输出设备或应用程序的负担留给了一个称为会话管理器的外部组件。
WirePlumber
WirePlumber 是推荐的会话管理器。它基于模块化设计,具有实现实际管理功能的 Lua 插件。
默认配置文件存储在 /usr/share/wireplumber。自定义 Wireplumber 的推荐方法是在 /etc/wireplumber 或 ~/.config/wireplumber 中添加覆盖特定设置的片段。 [1]。
WirePlumber 在 0.5 版本中将其配置文件格式从 .lua 更改为 .conf。有关迁移说明,请参阅 https://pipewire.pages.freedesktop.org/wireplumber/daemon/configuration/migration.html#config-migration。
PipeWire Media Session
pipewire-media-session 已弃用,不再推荐使用。它主要用于测试和作为构建新会话管理器的示例。
GUI
- Cable — 一个 PyQt 应用程序,用于在运行时动态修改 PipeWire 和 WirePlumber 设置。
- coppwr — PipeWire 的底层控制和诊断 GUI。
- Helvum — 基于 GTK 的 PipeWire 接线板,灵感来自 JACK 工具 catia。不保存线集。
- pwvucontrol — Pipewire 音量控制。pavucontrol 的替代品。
- qpwgraph — 基于 Qt 的 PipeWire 图/接线板,灵感来自 JACK 工具 QjackCtl。保存线集。
- sonusmix — Pipewire 音频路由工具
TUI
- pipemixer — 使用 ncurses 构建的 pipewire 的 TUI 音量控制应用程序。
- wiremix — PipeWire 的简单 TUI 音频混音器。
配置
PipeWire 包在 /usr/share/pipewire 中提供了初始的 配置文件 集。您不应直接编辑这些文件,因为包更新会覆盖您的更改。要配置 PipeWire,您可以将文件从 /usr/share/pipewire 复制到替代的系统范围位置 /etc/pipewire,或复制到用户位置 ~/.config/pipewire。具有更高优先级的目录中同名文件会使类似的文件被忽略。
PipeWire 除了 PulseAudio 配置文件外,还提供了一个自定义的 Pro Audio(请勿与 pro audio 混淆)配置文件,可通过 pavucontrol 选择。
用法
音频
PipeWire 可以用作音频服务器,类似于 PulseAudio 和 JACK。它的目标是通过提供与 PulseAudio 兼容的服务器实现和面向 JACK 客户端的 ABI 兼容库来取代 PulseAudio 和 JACK。有关更多信息,请参阅博文 PipeWire Late Summer Update 2020。
首先,安装 pipewire-audio。根据音频客户端的类型,您可能还需要采取一些额外的步骤。您可能需要为您的音频设备安装额外的固件,请参阅 Advanced Linux Sound Architecture#Firmware。
ALSA 客户端
安装 pipewire-alsa(如果已安装,则删除 pulseaudio-alsa),以便将所有使用 ALSA API 的应用程序通过 PipeWire 进行路由。
PulseAudio 客户端
安装 pipewire-pulse。它将替换 pulseaudio 和 pulseaudio-bluetooth。重启、重新登录或 停止 pulseaudio.service 并 启动 pipewire-pulse.service 用户单元 以查看效果。
通常,不需要进一步的操作,因为用户服务 pipewire-pulse.socket 应该由包自动启用。要检查替换是否正常工作,请对*服务器名称*和默认输入/输出运行以下命令
$ pactl info
...
Server Name: PulseAudio (on PipeWire x.y.z)
...
Default Sink: alsa_output.{bus}-{device}.{profile}
Default Source: alsa_input.{bus}-{device}.{profile}
...
pactl(1) 由 PulseAudio 客户端库包(libpulse)提供,该包作为 pipewire-pulse 的依赖项安装。
设置整体或单个声道音量
要调整输出声道音量,需要使用 pactl get-sink-volume {sink} 指定*接收器*,使用*默认接收器:*(上方)或*名称:*(下方)、默认接收器设备(@DEFAULT_SINK@)或*接收器 #*(例如,下方*1*)值
$ pactl list sinks | grep -B1 -A9 State:
Sink #1
State: RUNNING
Name: alsa_output.pci-0000_2d_00.4.analog-surround-51
...
Driver: PipeWire
...
Mute: no
Volume: front-left: 65536 / 100% / 0.00 dB, front-right: 65536 / 100% / 0.00 dB, rear-left: 65536 / 100% / 0.00 dB, rear-right: 65536 / 100% / 0.00 dB, front-center: 65536 / 100% / 0.00 dB, lfe: 65536 / 100% / 0.00 dB
balance 0.00
提示:如果音频正在播放,请使用 grep(1) 查找 RUNNING,因为其他设备将是 SUSPENDED。
平衡比率会自动计算。要设置默认设备的整体音量,请使用
pactl set-sink-volume @DEFAULT_SINK@ 75%
要设置单个声道,请分别提供每个声道的音量
pactl set-sink-volume @DEFAULT_SINK@ 100% 75% 100% 75% 100% 100%
源输入以类似方式处理。有关进一步的配置(例如关于模块),请参阅官方上游 Wiki 关于 从 PulseAudio 迁移 和 Pipewire-Pulse 配置。
JACK 客户端
安装 pipewire-jack 以获得 JACK 支持。对于 multilib 支持,还有 lib32-pipewire-jack。
pw-jack(1) 可用于启动 JACK 客户端,但技术上并非必需,因为它仅作为 PIPEWIRE_REMOTE、PIPEWIRE_DEBUG 和 PIPEWIRE_LATENCY 环境变量的包装器。
可以通过设置 buffersize/samplerate 的商(等于秒为单位的块延迟)来请求自定义缓冲区大小
PIPEWIRE_LATENCY="128/48000" application
蓝牙设备
如果安装了 pipewire-audio 包,PipeWire 可以处理 蓝牙音频设备。
自动配置文件选择
WirePlumber 默认启用配置文件自动切换。当检测到输入流时,它可以自动在 HSP/HFP 和 A2DP 配置文件之间切换。您可以使用以下命令禁用它
$ wpctl settings --save bluetooth.autoswitch-to-headset-profile false
pipewire-media-session 默认禁用此功能。您可以将 bluez5.autoswitch-profile 属性设置为 true 来启用它
/etc/pipewire/media-session.d/bluez-monitor.conf (or ~/.config/pipewire/media-session.d/bluez-monitor.conf)
...
rules = [
{
...
actions = {
update-props = {
...
bluez5.autoswitch-profile = true
...
用于命令行的 PipeWire 补丁集
qpwgraph 可用于可视化和创建连接,还可以保存和加载补丁集。
对于非 GUI 需求,以下是用于保存线集、加载线集和断开所有连接的 bash 脚本。对于保存和加载,请使用命令行参数指定文件名。
pw-savewires
#!/bin/bash
if [[ "$#" -ne 1 ]]; then
echo
echo 'usage: pw-savewires filename'
echo
exit 1
fi
rm -- "$1" &> /dev/null
link_nodeOutput=''
while IFS= read -r line; do
if [[ "$line" =~ [|] ]];
then
link_nodeInput=`echo $line | cut -d ">" -f 2`
echo "Saving $link_nodeOutput, ${link_nodeInput//' '}"
echo "$link_nodeOutput ${link_nodeInput//' '}" >> "$1"
else
link_nodeOutput="$line"
fi
done < <(pw-link -lo)
pw-loadwires
#!/bin/bash
if [[ "$#" -ne 1 ]]; then
echo
echo 'usage: pw-loadwires filename'
echo
exit 1
fi
while IFS= read -r line; do
echo "Connecting $line"
pw-link $line
done < <(cat -- "$1")
pw-dewire
#!/bin/bash
link_nodeOutput=''
while IFS= read -r line; do
if [[ "$line" =~ [|] ]];
then
link_nodeInput=`echo $line | cut -d ">" -f 2`
echo "Removing $link_nodeOutput, ${link_nodeInput//' '}"
pw-link -d $link_nodeOutput ${link_nodeInput//' '}
else
link_nodeOutput="$line"
fi
done < <(pw-link -lo)
与网络上的计算机共享音频设备
PipeWire 支持使用多种机制通过网络共享音频,包括
- AES67
- RTP
- Apple Airplay(不含 DRM 功能)
- JACK (netjack2)
- Roc
- PipeWire 原生 RTP
- PulseAudio 的网络协议
- Snapcast
PipeWire wiki 包含一个 概述和比较页面,介绍不同的网络协议。
下面将介绍 Pulse Tunnel 方法。PipeWire 的 PulseAudio 实现支持 网络流式传输。在网络上共享音频的一种简单方法是使用 Avahi 守护进程进行发现。要启用此功能,请安装 pipewire-zeroconf 包。
确保 avahi-daemon.service 在所有将共享音频的计算机上运行(如果使用 防火墙,则 UDP 端口 5353 是打开的)。
要共享本地音频设备,请在主机上加载相应的模块(确保使用本地 IP 地址)
$ pactl load-module module-native-protocol-tcp listen=192.168.1.10 $ pactl load-module module-zeroconf-publish
然后在客户端加载发现模块
$ pactl load-module module-zeroconf-discover
也可以通过创建专用配置文件自动加载模块
/etc/pipewire/pipewire-pulse.conf.d/50-network-party.conf (or ~/.config/pipewire/pipewire-pulse.conf.d/50-network-party.conf)
pulse.cmd = [
{ cmd = "load-module" args = "module-native-protocol-tcp listen=192.168.1.10" }
{ cmd = "load-module" args = "module-zeroconf-discover" }
{ cmd = "load-module" args = "module-zeroconf-publish" }
]
将音频流式传输到 AirPlay 接收器
可以将音频流式传输到假装是 AirPlay 接收器 的设备。要启用此功能,请加载 RAOP Discover 模块
$ pactl load-module module-raop-discover
也可以通过创建专用配置文件自动加载此模块
/etc/pipewire/pipewire.conf.d/raop-discover.conf (or ~/.config/pipewire/pipewire.conf.d/raop-discover.conf)
context.modules = [
{
name = libpipewire-module-raop-discover
args = { }
}
]
某些扬声器的 AirPlay 实现(如 Sonos AirPlay 2 扬声器)可能需要您在源设备上为入站 UDP 流量打开 6001 和 6002 端口。
通过 Roc 将音频流式传输到机器之间
Roc streaming 是一种具有前向纠错功能的实时音频网络协议。它易于设置,因为 Pipewire 默认支持它。
请记住安装 pipewire-roc
在目标/主机/DAC 上
~/.config/pipewire/pipewire.conf.d/
context.modules = [
{ name = libpipewire-module-roc-source
args = {
local.ip = 0.0.0.0
roc.resampler.backend = default
roc.resampler.profile = default
roc.latency-tuner.backend = default
roc.latency-tuner.profile = default
fec.code = default
sess.latency.msec = 100
local.source.port = 10001
local.repair.port = 10002
local.control.port = 10003
}
}
]
有关更多选项,请参阅 Pipewire 参考。
在发送方/客户端上
~/.config/pipewire/pipewire.conf.d/roc-sink.conf
context.modules = [
{ name = libpipewire-module-roc-sink
args = {
fec.code = default
remote.ip = <IP address of host>
remote.source.port = 10001
remote.repair.port = 10002
remote.control.port = 10003
sink.props = {
node.name = "my-roc-sink"
node.description = "my-roc-sink"
}
}
}
]
有关更多选项,请参阅 Pipewire 参考。
在两台机器上为当前用户重启 pipewire
$ systemctl --user restart pipewire
在原生 JACK 上运行 PipeWire
如果需要,PipeWire 还可以作为 JACK 客户端在原生 JACK 守护进程之上运行。
有关更多信息和附加配置(例如可用通道),请参阅 JACK and PipeWire (PipeWire wiki) 和 JACK Bridge (PipeWire wiki)。
要使用它,请安装 pipewire-jack-client 并启动 JACK。Pipewire 应该会自动桥接。
可以手动加载它(如 pactl(1) 所解释)就像 PulseAudio 模块一样:在启动 JACK 之前 pactl load-module module-jackdbus-detect。
使用 ALSA dmix 设备作为 PipeWire 接收器
可以将 PipeWire 服务器(或多个,每个用户一个)输出到 ALSA,通过 ALSA dmix 设备。这使您能够使用 ALSA 作为主要的音频输出系统,同时能够使用非 ALSA 设备,例如蓝牙耳机。
ALSA dmix 设置
假设您有两个声卡,PCH 和 HDMI
/proc/asound/cards
0 [PCH ]: HDA-Intel - HDA Intel PCH
HDA Intel PCH at 0xdff40000 irq 146
1 [HDMI ]: HDA-Intel - HDA ATI HDMI
HDA ATI HDMI at 0xdfe60000 irq 147
并且您的 PCM 看起来像
/proc/asound/pcm
00-00: ALC1220 Analog : ALC1220 Analog : playback 1 : capture 1 00-02: ALC1220 Alt Analog : ALC1220 Alt Analog : capture 1 01-03: HDMI 0 : HDMI 0 : playback 1 01-07: HDMI 1 : HDMI 1 : playback 1 01-08: HDMI 2 : HDMI 2 : playback 1 01-09: HDMI 3 : HDMI 3 : playback 1 01-10: HDMI 4 : HDMI 4 : playback 1 01-11: HDMI 5 : HDMI 5 : playback 1
并假设您的 ALSA 配置如下
/etc/asound.conf
ctl.!default {
type hw
card PCH
}
pcm.!default {
type plug
slave.pcm "dmix:PCH,0"
}
pcm.dhdmi {
type plug
slave.pcm "dmix:HDMI,9"
}
在此特定示例中,dmix 设备将是 dmix:PCH,0 和 dmix:HDMI,9。
PipeWire dmix 设置
首先,通过禁用 monitor.alsa 功能来阻止 WirePlumber 监视和添加硬件 ALSA 设备
/etc/wireplumber/wireplumber.conf.d/disable-alsa-monitor.conf (or ~/.config/wireplumber/wireplumber.conf.d/disable-alsa-monitor.conf)
wireplumber.profiles = {
main = {
monitor.alsa = disabled
}
}
现在,配置 PipeWire 使用 dmix 设备。默认配置文件(/usr/share/pipewire/pipewire.conf)包含一个 注释掉的示例,您可以使用它作为基础。
将您自己的元素添加到 context.objects 数组
/etc/pipewire/pipewire.conf.d/alsa-dmix.conf (or ~/.config/pipewire/pipewire.conf.d/alsa-dmix.conf)
context.objects = [
# We do not start with dmix, but with an input device.
# Do not forget to add an input device.
# On a friend's Laptop, I saw Zoom having a nervous
# breakdown and endlessly crying because no input device
# was configured! You have been warned.
{ factory = adapter
args = {
factory.name = api.alsa.pcm.source
node.name = "alsa-mic-internal" # name of pulse device (mpv)
node.description = "Mic Internal" # name of pulse device (pavucontrol)
media.class = "Audio/Source"
api.alsa.path = "hw:PCH,0"
}
}
# Okay, now we add our dmix PCMs
{ factory = adapter
args = {
factory.name = api.alsa.pcm.sink # sink for dmix
node.name = "alsa-dmix-internal" # name of pulse device (mpv)
node.description = "PCM Internal" # name of pulse device (pavucontrol)
media.class = "Audio/Sink" # Sink for dmix
api.alsa.path = "dmix:PCH,0"
}
}
{ factory = adapter
args = {
factory.name = api.alsa.pcm.sink # sink for dmix
node.name = "alsa-dmix-hdmi" # name of pulse device (mpv)
node.description = "PCM HDMI" # name of pulse device (pavucontrol)
media.class = "Audio/Sink" # Sink for dmix
# remember this is a non-default dmix from /etc/asound.conf
api.alsa.path = "dmix:HDMI,9"
}
}
]
作为用户(非 root),请查看 wpctl status 的输出,并使用 wpctl set-default ID 设置您喜欢的默认输入(源)和输出(接收器)设备。ID 是接收器/源名称前面的数字。
现在,您可以完全测试您的配置。
在设备配置文件之间切换
一些硬件音频设备,例如 snd_hda_intel,根据设备运行的配置文件而具有不同的功能。对于 snd_hda_intel,有单独的 HDMI 和模拟输出配置文件。
使用 WirePlumber 切换到 HDMI
$ wpctl set-profile <device-ID> 3 $ wpctl status
... ├─ Sinks: │ * 53. Built-in Audio Digital Stereo (HDMI) [vol: 1.00] ...
使用 WirePlumber 切换到模拟
$ wpctl set-profile <device-ID> 1 $ wpctl status
... ├─ Sinks: │ * 51. Built-in Audio Analog Stereo [vol: 0.60] ...
多用户音频共享
有时让其他用户连接到您的 PipeWire 实例会很有用。例如,如果您通过 Xephyr 登录到另一个用户的帐户,并且希望在 Xephyr 会话中播放的音频从由外部用户管理的扬声器输出。
一种方法是配置外部用户的 pipewire-pulse 配置以侦听 localhost TCP 连接。
在外部用户的家庭目录下创建类似的文件
~/.config/pipewire/pipewire-pulse.conf.d/pulse-server.conf
pulse.properties = {
server.address = [
"unix:native"
"tcp:127.0.0.1:4713" # Now the outer user's pipewire server listens on the IP4 loopback
]
}
然后在内部用户的会话中设置环境变量 PULSE_SERVER=tcp:127.0.0.1:4713。例如,在内部用户启动 Xephyr 之前 export 它。有关更多信息和替代设置,请参阅 此论坛主题。
WebRTC 屏幕共享
大多数应用程序过去都依赖 X11 来捕获桌面(或单个应用程序),例如在网页浏览器中使用 WebRTC(例如 Google Meet)时。在 Wayland 上,屏幕共享机制通过 XDG Desktop Portal 和 PipeWire 处理,这使得在 Wayland 下以细粒度的访问控制共享内容成为可能。
Firefox (84+) 和 Chromium (110+) 默认支持此方法,而较旧版本的 Chromium (73+) 需要通过在 URL chrome://flags/#enable-webrtc-pipewire-capturer 设置相应的(实验性)标志或通过 CLI 参数 --enable-features=WebRTCPipeWireCapturer 来启用 WebRTC PipeWire 支持。
obs-studio (27+) 通过使用新的 PipeWire 捕获源来支持此方法。
视频
尽管该软件尚未达到生产就绪状态,但可以安全地进行尝试。大多数依赖 GStreamer 处理(例如)视频流的应用程序应使用 PipeWire GStreamer 插件开箱即用,请参阅 GStreamer#PipeWire。因此,像 cheese 这样的应用程序已经能够使用它共享视频输入。
使用 pipewire-v4l2,应该还可以使用 pw-v4l2 脚本来预加载一个库(/lib/pipewire-0.3/v4l2/libpw-v4l2.so),该库会拦截 v4l2 调用并通过 pipewire 路由视频。
音频后处理
Pipewire module-filter-chain
Pipewire 有一个名为 filter-chain 的内部模块,它可以创建节点来处理音频输入和输出。请参阅 /usr/share/pipewire/filter-chain/ 目录中的示例,包括均衡、虚拟环绕声、LADSPA 插件和通道混合。
LADSPA
您可以从官方仓库安装许多 LADSPA 插件,并在 Pipewire 过滤器链中使用它们。要列出特定文件提供的插件标签和可用控件,请使用 ladspa 包中的 analyseplugin。
$ analyseplugin /usr/lib/ladspa/lsp-plugins-ladspa.so
系统范围的参数化均衡
PipeWire filter-chain 支持参数化均衡 [3]。在 /etc/pipewire/pipewire.conf.d/(或 ~/.config/pipewire/pipewire.conf.d/)中创建一个配置文件,然后使用以下示例编辑它以包含所需的参数
context.modules = [
{
name = libpipewire-module-filter-chain
args = {
node.description = "Equalizer Sink"
media.name = "Equalizer Sink"
filter.graph = {
nodes = [
{
type = builtin
name = eq
label = param_eq
config = {
filters = [
{ type = bq_peaking, freq = 100, gain = 0.0, q = 1.0 },
{ type = bq_peaking, freq = 500, gain = 0.0, q = 1.0 },
{ type = bq_peaking, freq = 2000, gain = 0.0, q = 1.0 },
]
}
}
]
links = []
}
audio.channels = 2
audio.position = [ FL FR ]
capture.props = {
node.name = "effect_input.eq"
media.class = Audio/Sink
}
playback.props = {
node.name = "effect_output.eq"
node.passive = true
}
}
}
]
您可以使用任意数量的过滤器。
如果您需要前置放大器,请在频率 0 处应用 bq_highshelf 过滤器,例如
{ type = bq_highshelf, freq = 0, gain = -5.0, q = 1.0 },
重启 Pipewire,选择“Equalizer Sink”作为您的默认声音输出设备;这将应用于所有应用程序。
或者,您可以使用 filename 属性代替指定 filters 数组,该属性指向从 AutoEQ 项目或 Squiglink 生成的参数化均衡配置文件,例如
config = {
filename = "/path/to/parametric.txt"
}
EasyEffects
EasyEffects(原 PulseEffects,带 GTK)是一个 Qt 工具,为单个应用程序输出流和麦克风输入流提供各种音频效果和过滤器。值得注意的效果包括输入/输出均衡器、输出响度均衡和低音增强、输入去齿音器和降噪插件。有关效果的完整列表,请参阅 GitHub 页面。
为了使用 EasyEffects,请安装 easyeffects。有关预设配置的集合,请参阅 社区预设。有关为耳机算法生成的 EQ 预设的集合,请参阅 AutoEq。
NoiseTorch
NoiseTorch 是另一种降噪方式,打包在 noisetorchAUR 中。还有 noisetorch-gitAUR。
启动后,可以为选定的麦克风加载模块。可以调整语音激活阈值,该阈值应设置为最高级别,以不滤除任何实际语音。
您可以使用 systemd 自动启动音频处理,请参阅 [4]。请注意,如果从 AUR 安装,noisetorch 二进制文件的路径会不同。
语音降噪
安装 noise-suppression-for-voice 包。
然后按照 GitHub 上的说明进行操作。
JamesDSP
JamesDSP for Linux (可用作 jamesdspAUR) 为 PipeWire 和 PulseAudio 提供开源音效。它使用自己的效果引擎,并且不依赖于 LADSPA、Calf 等。JamesDSP 最初是作为 Android 设备的音频效果处理器发布的。
使用 LADSPA, LV2 和 VST 插件
如果您想在可用的 LADSPA、LV2 和 VST 插件的完整列表中进行选择,可以使用 carla 和 pipewire-jack 来应用它们。
启动 Carla 并转到“设置”>“配置 Carla”>“引擎”。确保“音频驱动程序”设置为“JACK”,并根据您的需求选择一个处理模式。您也可以通过运行带有特定命令的 Carla 来选择处理模式,例如,对于“连续机架”模式,使用 carla-rack。
您可以手动连接应用程序输出到 Carla,但如果您想让多个应用程序通过 Carla,最好在应用程序和 Carla 之间创建一个虚拟设备,并可选择将其用作默认设备。首先,创建一个名为 default_null_sink 的新 null sink。
/etc/pipewire/pipewire.conf.d/10-default-null-sink.conf (or ~/.config/pipewire/pipewire.conf.d/10-default-null-sink.conf)
context.objects = [
{
factory = adapter
args = {
factory.name = support.null-audio-sink
node.name = "default_null_sink"
media.class = Audio/Sink
audio.position = [ FL FR ]
monitor.channel-volumes = true
monitor.passthrough = true
}
}
]
重新启动 PipeWire 以应用更改。
或者,您可以使用 pw-cli(1) 创建一个临时的虚拟设备,或者,如果安装了 pipewire-pulse,则使用 pactl(1)。有关详细信息,请参阅 PipeWire wiki。
在“机架”选项卡中,添加您想要的任何插件。确保它们是“立体声”类型。您可以更改它们的顺序。在“连续机架”处理模式下,列表顶部的插件将是第一个接收音频流的插件,就像在 EasyEffects 中一样。之后,转到“补丁面板”选项卡,并将 default_null_sink 的 L/R 监视器连接到 Carla 输入,然后将 Carla 输出连接到您所需的设备(扬声器、耳机、HDMI 等)的播放设备。将配置保存到本地文件,例如 ~/Documents/carla_sink_effects.carxp。Carla 打开此文件后将自动恢复连接。
在多媒体应用程序正在播放音频时(例如,通过 Firefox 在网站上观看视频),您可以测试效果。有两种方法可以做到这一点。第一种方法是在 Carla 的“补丁面板”选项卡中,断开所有 Firefox 连接,然后将其 L/R 输出链接到 default_null_sink 的播放设备。第二种方法是通过 pavucontrol,找到 Firefox 音频流并将其重定向到 default_null_sink(这应该会记住连接,以便在下次启动时自动将应用程序重定向到同一个 sink)。
要使用“连续机架”处理模式运行 Carla 并在启动时加载保存的文件,请创建 systemd 用户服务。
~/.config/systemd/user/jack-carla-rack.service
[Unit] Description=Load Carla Rack JACK host [Service] Environment=PIPEWIRE_LINK_PASSIVE=true Type=exec ExecStart=/usr/bin/carla-rack --no-gui %h/Documents/carla_sink_effects.carxp [Install] WantedBy=default.target
然后 启用 jack-carla-rack.service 用户单元。
请注意,如果您将 default_null_sink 设置为系统设置中的默认设备,所有应用程序都将被重定向到它,音量键将更改其级别,而不是扬声器的级别。如果您想控制扬声器音量,请在系统设置中将其保留为默认设置,并在 pavucontrol 中将您想要的应用程序重定向到 default_null_sink(Pipewire 兼容层将记住连接,以便在同一应用程序的下一个实例上自动重定向)。
故障排除
音频
PipeWire 未检测到麦克风
PipeWire 的 alsa-monitor 模块默认使用 alsa-card-profiles 来检测设备。如果这不适用于您,请尝试在 wireplumber 中关闭 api.alsa.use-acp,或选择性地打开 api.alsa.use-ucm。
/etc/wireplumber/wireplumber.conf.d/alsa-config.conf (or ~/.config/wireplumber/wireplumber.conf.d/alsa-config.conf)
monitor.alsa.properties = {
# Use ALSA-Card-Profile devices. They use UCM or the profile
# configuration to configure the device and mixer settings.
# alsa.use-acp = true
# Use UCM instead of profile when available. Can be disabled
# to skip trying to use the UCM profile.
alsa.use-ucm = true
}
/etc/pipewire/media-session.d/alsa-monitor.conf (or ~/.config/pipewire/media-session.d/alsa-monitor.conf)
...
rules = [
{
...
actions = {
update-props = {
...
api.alsa.use-acp = false
...
然后,重启 WirePlumber 并检查可用设备。
$ pw-record --list-targets
Available targets ("*" denotes default): 62
58: description="Built-in Audio" prio=1872
60: description="Built-in Audio" prio=2000
* 62: description="Built-in Audio (Loopback PCM)" prio=1984
在 此 PipeWire issue 中提出的一个替代解决方案是手动添加麦克风。首先,确保麦克风被 ALSA 检测到。
$ arecord -l
**** List of CAPTURE Hardware Devices **** card card_number: card_name, device device_number: device_name ...
从列表中选择您的麦克风,并进一步测试麦克风,运行以下命令。
$ arecord --duration=5 --format=dat --device=hw:card_number,device_number test-mic.wav # record from the mic $ aplay test-mic.wav # play it
如果麦克风在 arecord 下工作,但在 PipeWire 中未检测到,请尝试添加一个配置文件以手动添加此设备。
/etc/pipewire/pipewire.conf.d/microphone.conf (or ~/.config/pipewire/pipewire.conf.d/microphone.conf)
context.objects = [
{ factory = adapter
args = {
factory.name = api.alsa.pcm.source
node.name = "microphone"
node.description = "Undetected Microphone"
media.class = "Audio/Source"
api.alsa.path = "hw:card_number,device_number"
}
}
]
然后重启 PipeWire 以重新加载配置。
连接新设备时声音未自动切换
要自动切换到新连接的设备,请创建此文件。
/etc/pipewire/pipewire-pulse.conf.d/switch-on-connect.conf (or ~/.config/pipewire/pipewire-pulse.conf.d/switch-on-connect.conf)
pulse.cmd = [
{ cmd = "load-module" args = "module-switch-on-connect" }
]
然后使用 重启 pipewire-pulse.service 和 systemctl --user,并检查 module-switch-on-connect 是否已加载。
连接到蓝牙设备后没有声音
截至 2020-12-07,如果连接蓝牙设备后没有声音,您可能需要切换默认 sink 或/和将 sink 输入移动到正确的 sink。使用 pactl list sinks 列出可用 sink,并使用 pactl set-default-sink 将默认 sink 切换到蓝牙设备。这可以通过 udev 使用类似于此脚本的脚本来自动化。
有关该问题的讨论,请参阅这篇 Reddit 帖子。根据脚本作者的说法,耳机配置文件 (HSP) 可能仍然存在问题。
mpv, vlc, totem 没有声音,但网页浏览器和 GNOME 扬声器测试有声音
条件描述
验证此问题状况的最佳工具是使用 mpv 在预期能够工作的已安装编解码器的文件上进行测试。
$ mpv --ao=alsa test_file.mpv $ mpv --ao=pcm test_file.mpv $ mpv --ao=jack test_file.mpv $ mpv --ao=pulse test_file.mpv $ mpv --ao=openal test_file.mpv
如果上述测试中的一个或全部产生声音,而使用 pipewire 选项进行相同的测试时不产生声音,则此配方适用。
$ mpv --ao=pipewire test_file.mpv
GNOME 桌面扬声器测试和网页浏览器“YouTube”产生有效的声音结果。
在 GNOME 中切换输入、静音、取消静音、更改音量无法解决问题。
pactl list sinks 报告的 Sink 状态为“SUSPENDED”无关紧要,因为当通过网页浏览器播放视频时,状态会正确更改。
使用 pactl info 未发现明显问题。
检查相关的 systemd 单元日志未发现明显问题。
问题原因
似乎从 pipewire 到硬件的路径被静音或以某种方式更改了。原始作者不知道如何使用命令行工具识别和指出问题。
解决方案
安装 pavucontrol 包。运行 pavucontrol,在“配置”选项卡中选择适当的源,然后在“输出设备”选项卡中再次选择它,然后在 mpv --ao=pipewire test.mp4 视频运行时使用静音按钮静音和取消静音源。
在另一种情况下,删除 ~/.local/state/wireplumber/ 并重新启动解决了相同的问题。
低音量
用 Pipewire 替换 PulseAudio 后,声音可能工作正常,但在重启后,音量会变得无法忍受地低。
打开 alsamixer,使用 F6 选择正确的声卡,并确保 ALSA 音量设置为 100%。alsactl 应在重启后保持此设置。
增加 RLIMIT_MEMLOCK
Dec 13 11:11:11 HOST pipewire-pulse[99999]: Failed to mlock memory 0x7f4f659d8000 32832: This is not a problem but for best performance, consider increasing RLIMIT_MEMLOCK
安装 realtime-privileges 并将您的用户添加到 realtime 组。
或者,将 memlock 从 64kB 增加到 128kB 似乎足以解决此问题。如果您在 systemd/User 下运行 pipewire-pulse,请在 /etc/security/limits.d/username.conf 中添加
username soft memlock 64 username hard memlock 128
到 /etc/security/limits.d/username.conf。
更改默认采样率
默认情况下,PipeWire 设置固定的全局采样率 48kHz。如果您需要更改它,可以设置一个新的默认值(尽管不推荐)。
/etc/pipewire/pipewire.conf (or ~/.config/pipewire/pipewire.conf)
...
context.properties = {
...
default.clock.rate = sample_rate
...
但是,这不被推荐,因为它会影响延迟,因为量化值不会自动重新计算。如果您想保持相同的比例,则必须自己更改它们。引用文档
- 默认时钟速率决定了最小/最大/默认量化的实时持续时间。更改默认时钟速率时,您可能需要更改量化值以保持量化的相同持续时间。
请记住,流的速率将保持不变。PipeWire 在这里所做的只是重新采样以满足您的新速率。因此,本应保持不变的 48kHz 流现在将被重新采样。
如果您拥有能够处理不同采样率的设备,则更推荐保留默认设置并按照此处所示进行操作: #Changing the allowed sample rate(s)
更改允许的采样率
PipeWire 还可以动态更改 DAC 支持的输出采样率。采样率遵循正在播放的音频流的采样率。
/etc/pipewire/pipewire.conf (or ~/.config/pipewire/pipewire.conf)
...
context.properties = {
...
default.clock.allowed-rates = [ sample_rate_1 sample_rate_2 sample_rate_3 ... ]
...
例如,[ 44100 88200 176400 48000 96000 192000 ]。
假设默认采样率为 48000,这是默认值。通常,如果一个流以 44100Hz 输出音频(例如,音乐播放器以 CD 质量播放歌曲),Pipewire 将流重新采样到 48kHz。但是,如果您在此列表中包含 44100,Pipewire 将执行以下操作:Pipewire 将看到流的频率为 44100Hz,然后检查 44100 是否在允许的速率中,并且接收的输出设备(即 DAC)是否支持该速率。在这种情况下,DAC 将无损播放歌曲。 如果速率不在列表中或 DAC 不支持该速率,PipeWire 将简单地回退到将流重新采样到默认采样率。
根据开发人员的说法:“PipeWire 最多支持 16 种不同的采样率,并在可能时切换”。这意味着,使用上述配置,当支持时不会进行重新采样。自从 PipeWire 0.3.61 起,最多可以配置 32 种不同的采样率。
获取允许的采样率
请查阅您的硬件手册以了解 DAC 的支持值。内核驱动程序编解码器支持的速率可以用以下命令列出。
$ grep -E 'Codec|Audio Output|rates' /proc/asound/card*/codec#*
如果您的 DAC 未报告编解码器信息,您可以尝试像这样获取支持的速率。
$ grep -m1 -Hn "" /proc/asound/card?/stream? | tee /dev/tty | awk -F':' '{print $1}' | xargs grep 'Rates'
检查当前使用的采样率
要检查某个声卡的输出采样率,请运行
$ grep rate: /proc/asound/card?/pcm??/sub?/hw_params
/proc/asound/card1/pcm0p/sub0/hw_params:rate: 96000 (96000/1)
在 pcm0p 或 pcm0c 中,c 代表“捕获”(capture),p 代表“播放”(playback)。
命令
$ pw-top
也显示了每个声卡和音频流当前使用的采样率。
音质
无损
PipeWire 可以轻松配置无损输出(无重新采样)。您只需要进行以下设置,这已在此处描述: #Changing the allowed sample rate(s)。有关更多背景信息,请阅读该部分。这些是您会遇到的行业标准速率,即 CD 质量系列(44100Hz、88200Hz、176400Hz)和 DVD 质量系列(48kHz、96kHz、192kHz)。大多数音频流将采用其中一种速率。只要您选择的播放器是主流,并且您的 DAC 支持该速率,PipeWire 就会使用它。确保您的播放器是唯一正在播放的流,否则可能会发生重新采样,因为所有其他内容都将被重新采样以匹配主图的采样率。
/etc/pipewire/pipewire.conf (or ~/.config/pipewire/pipewire.conf)
...
context.properties = {
...
default.clock.allowed-rates = [ 44100 88200 176400 48000 96000 192000 ]
...
重采样
如果您使用 PulseAudio 并带有 resample-method = speex-float-10 或 soxr-vhq,那么您可以考虑将 resample.quality 设置为 10 或最高值 14。
/etc/pipewire/client.conf.d/resample.conf (or ~/.config/pipewire/client.conf.d/resample.conf)
stream.properties = {
resample.quality = 10
}
不要忘记 重启 pipewire.service 和 pipewire-pulse.socket 用户单元(如果您希望您的配置更改生效,切勿忘记 pipewire-pulse.socket)。
10 和 14 之间的音质差异非常小,但 CPU 负载差异是 2-3 倍。4、10、14 之间的延迟差异仍有待任何人调查。在 Ryzen 2600 上,44100→48000 Hz 的 resample.quality = 14 会导致 pipewire 或 pipewire-pulse 进程占用 4.0% 的单个 CPU 核心负载。
您可以在此处比较重采样器: https://src.infinitewave.ca/ (不要注意 18 KHz 以上和 120 dB 以上的内容)。speex 被列为“Xiph.org Speex”。
PipeWire 使用自己的重采样算法,称为 Spa。与 SoX 的 sox、Speex 的 speexenc 一样,PipeWire 也包含其独立版本:spa-resample。用法
$ spa-resample -q 14 -f s24 -r 48000 input16bit44100orAnythingElse.wav output24bit48000hz.wav
通过创建自己的 sink,可能以某种方式使用其他重采样器。或者,只需在您的音乐播放器中使用插件(例如,Qmmp 有 SoX 插件)。
重新连接后外部声卡未激活
检查 ~/.config/pipewire/media-session.d/default-profile 是否有任何条目默认配置文件为“off”并将其删除。如果这无效,请删除 ~/.config/pipewire/media-session.d/ 中的所有文件,然后 重启 pipewire.service 用户单元。
没有声音或 pactl info 显示失败:连接被拒绝
这意味着应用程序无法连接到 PipeWire-Pulse 服务,请检查 pipewire-pulse.service 用户单元是否正在运行。
如果这不能解决问题,请运行 strace -f -o /tmp/pipe.txt pactl info 并在寻求帮助时粘贴 /tmp/pipe.txt 的内容到 pastebin,例如在 IRC(OFTC 上的 #pipewire)或邮件列表中。
蓝牙音频质量低
如果蓝牙播放断断续续,请检查 pipewire.service 用户单元的单元状态是否存在类似如下的错误。
Feb 17 18:23:01 HOST pipewire[249297]: (bluez_input.18:54:CF:04:00:56.a2dp-sink-60) client too slow! rate:512/48000 pos:370688 status:triggered
如果出现这些错误,请使用 pactl list sinks 检查当前选定的编解码器,并通过将 bluez5.codec 设置为 sbc aac ldac aptx aptx_hd 中的一个来尝试更改它。您也可以尝试 mSBC 支持(修复 Sony 1000XM3 的麦克风,例如 Headphones WH-1000XM3 和 Earbuds WF-1000XM3),以及 SBC-XQ 编解码器。
使用 wireplumber
/etc/wireplumber/wireplumber.conf.d/bluez-config.conf (or ~/.config/wireplumber/wireplumber.conf.d/bluez-config.conf)
monitor.bluez.properties = {
bluez5.enable-sbc-xq = true
bluez5.enable-msbc = true
bluez5.codecs = [ sbc sbc_xq ]
}
/etc/pipewire/media-session.d/bluez-monitor.conf (or ~/.config/pipewire/media-session.d/bluez-monitor.conf)
...
properties = {
...
bluez5.enable-msbc = true
bluez5.enable-sbc-xq = true
bluez5.codecs = [sbc sbc_xq]
...
通过重启 pipewire.service 用户单元来重启 PipeWire 以使更改生效。
开始播放时有明显音频延迟或可听见的爆音/噼啪声
这是由于节点在不活动时暂停引起的。
使用 wireplumber,创建一个新文件以覆盖默认配置。
/etc/wireplumber/wireplumber.conf.d/disable-suspension.conf (or ~/.config/wireplumber/wireplumber.conf.d/disable-suspension.conf)
monitor.alsa.rules = [
{
matches = [
{
# Matches all sources
node.name = "~alsa_input.*"
},
{
# Matches all sinks
node.name = "~alsa_output.*"
}
]
actions = {
update-props = {
session.suspend-timeout-seconds = 0
}
}
}
]
# bluetooth devices
monitor.bluez.rules = [
{
matches = [
{
# Matches all sources
node.name = "~bluez_input.*"
},
{
# Matches all sinks
node.name = "~bluez_output.*"
}
]
actions = {
update-props = {
session.suspend-timeout-seconds = 0
}
}
}
]
重启 pipewire.service 和 wireplumber.service 以应用更改。
除了完全禁用暂停外,您还可以将超时值更改为源暂停前所需的延迟秒数。
某些设备会自己检测静音和暂停。对它们而言,仅禁用节点暂停将不起作用。可以通过添加少量噪声来解决它们,使输出永远不会完全静音。
.../disable-suspension.conf
...
session.suspend-timeout-seconds = 0, # 0 disables suspend
dither.method = "wannamaker3", # add dither of desired shape
dither.noise = 2, # add additional bits of noise
...
可能需要调整 dither.noise 和 dither.method 参数,以使噪声足够安静,同时又足够大声以防止检测到静音。请参阅 PipeWire 文档。
通过编辑 /etc/pipewire/media-session.d/*-monitor.conf(取决于延迟发生的位置)并将属性 session.suspend-timeout-seconds 改为 0 来禁用此功能,或者尝试其他值来查看效果。
或者,您可以注释掉 /etc/pipewire/media-session.d/media-session.conf 中的 suspend-node 行。
重启 pipewire.service 和 pipewire-pulse.service 以应用这些更改,或者选择重启。
音频在多个流开始播放时中断
该问题通常可以通过读取 pipewire-pulse.service 用户单元的日志并找到类似以下的行来诊断。
pipewire-pulse[21740]: pulse-server 0x56009b9d5de0: [Nightly] UNDERFLOW channel:0 offset:370676 underrun:940
根据官方 PipeWire 故障排除指南,为 wireplumber 解决此问题。
/etc/wireplumber/wireplumber.conf.d/alsa-config.conf (or ~/.config/wireplumber/wireplumber.conf.d/alsa-config.conf)
monitor.alsa.rules = [
{
matches = [
{
node.name = "~alsa_output.*"
}
]
actions = {
update-props = {
api.alsa.period-size = 1024
api.alsa.headroom = 8192
}
}
}
]
/etc/pipewire/media-session.d/alsa-monitor.conf (or ~/.config/pipewire/media-session.d/alsa-monitor.conf
api.alsa.headroom = 1024
如果您遇到由于内核页面锁定或延迟调度引起的音频卡顿,请参阅 Gaming#Tweaking kernel parameters for response time consistency。
音频失真
- 对于麦克风,尝试在运行
alsamixer后导航到出现问题的声卡,并使用箭头键降低任何“Mic Boost”或“Internal Mic Boost”选项。 - 遵循#Changing the default sample rate,将采样率降低到
44100(44.1 kHz)。
待机后出现音频问题
如果在从睡眠中唤醒机器后声音丢失或有其他杂音,重新初始化 ALSA 可能会有帮助。
# alsactl init
USB DAC(例如 Schiit DACs)的高延迟
更改采样率或格式可能有助于降低某些 DAC(如 Schiit Hel 2)的延迟。[5]
将默认配置文件 /usr/share/pipewire/media-session.d/alsa-monitor.conf 复制到 /etc/pipewire/media-session.d/ (或 ~/.config/pipewire/media-session.d/)。然后添加一个类似下面的新规则块。
/etc/pipewire/media-session.d/alsa-monitor.conf (or ~/.config/pipewire/media-session.d/alsa-monitor.conf)
...
rules = {
...
{
matches = [
{
node.name = "alsa_output.name-of-node"
}
]
actions = {
update-props = {
audio.format = "S24_3LE"
audio.rate = 96000
# Following value should be doubled until audio does not cut out or other issues stop occurring
api.alsa.period-size = 128
...
对于 wireplumber
/etc/wireplumber/wireplumber.conf.d/update-rate-and-format.conf (or ~/.config/wireplumber/wireplumber.conf.d/update-rate-and-format.conf)
monitor.alsa.rules = [
{
matches = [
{
node.name = "alsa_output.name-of-node"
}
]
actions = {
update-props = {
audio.format = "S24_3LE"
audio.rate = 96000
# Following value should be doubled until audio does not cut out or other issues stop occurring
api.alsa.period-size = 128
}
}
}
]
节点 alsa_output.name-of-node 可以使用 pw-top 获取。
您的 DAC 可能支持不同的格式或采样率。您可以通过查询 ALSA 来检查您的 DAC 支持什么。
首先获取 DAC 的声卡编号。
$ aplay -l
... card 3: S2 [Schiit Hel 2], device 0: USB Audio [USB Audio] Subdevices: 0/1 Subdevice #0: subdevice #0 ...
所以在这个例子中,它将是卡 3。获取所有支持的采样率和格式。
$ cat /proc/asound/cardX/streamX
...
Playback:
...
Interface 1
Altset 1
Format: S16_LE
Channels: 2
Endpoint: 0x05 (5 OUT) (ASYNC)
Rates: 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000
Data packet interval: 125 us
Bits: 16
...
Interface 1
Altset 2
Format: S24_3LE
Channels: 2
Endpoint: 0x05 (5 OUT) (ASYNC)
Rates: 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000
Data packet interval: 125 us
Bits: 24
...
Interface 1
Altset 3
Format: S32_LE
Channels: 2
Endpoint: 0x05 (5 OUT) (ASYNC)
Rates: 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000
Data packet interval: 125 us
Bits: 32
...
...
在这种情况下,S16_LE, S24_3LE, S32_LE 是支持的格式,而 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000 是所有格式支持的采样率。
USB DAC 在达到 30% 音量前没有声音
一些 USB DAC 在达到一定音量级别前没有声音输出[6]。通常,这在 15% 到 30% 之间,这可能导致初始音量过大且无法维持低音量。解决方法是通过为设备设置 api.alsa.soft-mixer 为 true 来忽略硬件混音器音量控制。
要使用 wireplumber 实现这一点,请使用
/etc/wireplumber/wireplumber.conf.d/alsa-soft-mixer.conf (or ~/.config/wireplumber/wireplumber.conf.d/alsa-soft-mixer.conf)
monitor.alsa.rules = [
{
matches = [
{
device.name = "alsa_card.name-of-device"
}
]
actions = {
update-props = {
# Do not use the hardware mixer for volume control. It
# will only use software volume. The mixer is still used
# to mute unused paths based on the selected port.
api.alsa.soft-mixer = true
}
}
}
]
请参阅 WirePlumber#Obtain_interface_name_for_rules_matching 来查找替换 "alsa_card.name-of-device" 的正确值。
或者,您可以指定 "~alsa_card.*" 将规则应用于所有音频设备。
然后,重启 pipewire,例如通过运行 systemctl --user restart pipewire。在 alsamixer 中设置主音量,然后以 root 身份运行 alsactl store 来保存设置。您现在应该可以正常使用音量混音器了。
实时音频不起作用
如果在 pipewire.service 用户单元的状态中看到 RTKit error: org.freedesktop.DBus.Error.AccessDenied,则意味着 pipewire 守护进程的优先级未更改为实时。有关此问题,请参阅 [7]。
同时输出到同一声卡上的多个 sink
创建 /usr/share/alsa-card-profile/mixer/profile-sets/default.conf 的副本,以便更改能够跨更新保留。这里我们定义一个配置文件,将模拟和 HDMI 的两个默认映射连接起来。
/usr/share/alsa-card-profile/mixer/profile-sets/multiple.conf
[General] auto-profiles = no [Mapping analog-stereo] device-strings = front:%f channel-map = left,right paths-output = analog-output analog-output-lineout analog-output-speaker analog-output-headphones analog-output-headphones-2 paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic analog-input-dock-mic analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line analog-input-headphone-mic analog-input-headset-mic priority = 15 [Mapping hdmi-stereo] description = Digital Stereo (HDMI) device-strings = hdmi:%f paths-output = hdmi-output-0 channel-map = left,right priority = 9 direction = output [Profile multiple] description = Analog Stereo Duplex + Digital Stereo (HDMI) Output output-mappings = analog-stereo hdmi-stereo input-mappings = analog-stereo
然后配置您的会话管理器,以便为匹配的设备使用新的声卡配置文件。识别信息可以使用 pw-dump 或 wpctl 找到。
对于 wireplumber
/etc/wireplumber/wireplumber.conf.d/alsa-custom.conf (or ~/.config/wireplumber/wireplumber.conf.d/alsa-custom.conf)
monitor.alsa.rules = [
{
matches = [
{
device.nick = "HDA Intel PCH"
}
]
actions = {
update-props = {
api.alsa.use-acp = true
api.acp.auto-profile = false
api.acp.auto-port = false
device.profile-set = "multiple.conf"
device.profile = "multiple"
}
}
}
]
/etc/pipewire/media-session.d/alsa-monitor.conf (or ~/.config/pipewire/media-session.d/alsa-monitor.conf)
rules = [
{
matches = [ { alsa.card_name = "HDA Intel PCH" } ]
actions = {
update-props = {
api.alsa.use-acp = true
device.profile-set = "multiple.conf"
device.profile = "multiple"
api.acp.auto-profile = false
api.acp.auto-port = false
}
}
}
]
Discord 没有通知声音
这可能是由 min.quantum 太低引起的,尝试将其设置为大于 700。您可以通过将以下规则添加到 pipewire-pulse.conf 的 pulse.rules 部分来为 Discord 单独创建覆盖。
/etc/pipewire/pipewire-pulse.conf (or ~/.config/pipewire/pipewire-pulse.conf)
...
pulse.rules = [
...
{
# Discord notification sounds fix
matches = [ { application.process.binary = "Discord" } ]
actions = {
update-props = {
pulse.min.quantum = 1024/48000 # 21ms
}
}
}
...
PipeWire 下 FMOD 游戏崩溃
一些使用旧版本 FMOD 音频引擎的游戏,例如 Pillars of Eternity,会调用 pulseaudio --check 并在 PulseAudio 二进制文件不存在时崩溃。一种解决方法是将 /bin/pulseaudio 符号链接到 /bin/true。[8]
# ln -s /bin/true /bin/pulseaudio
请注意,如果您想重新安装 PulseAudio,则需要删除该符号链接。
自动切换不起作用
如果自动切换不起作用,这可能是 WirePlumber 状态的问题。正如此评论所建议的那样,您可以删除 WirePlumber 的本地状态并重新启动守护进程,看看是否有帮助。
$ rm -r ~/.local/state/wireplumber/
然后 重启 wireplumber.service 用户单元。
挂起后,在负载下缺少实时优先级/噼啪声
由于 rtkit 中2011 年的 bug,挂起事件会导致 PipeWire 的实时优先级被撤销且未恢复。要禁用导致此问题的保护,请编辑 rtkit-daemon.service。
/etc/systemd/system/rtkit-daemon.service.d/override.conf
[Service] ExecStart= ExecStart=/usr/lib/rtkit-daemon --no-canary
然后重启 rtkit-daemon.service 单元和 pipewire.service 用户单元,以及媒体会话服务。
流式传输到 RAOP 设备(Sonos 等)时没有声音
使用 Avahi 或 systemd-resolved 设置 mDNS 主机名解析。
KDE Plasma 中未显示声音设备
PipeWire 客户端(包括桌面环境)可能依赖 XDG_RUNTIME_DIR 环境变量来连接到 PipeWire 守护进程。[9] 如果在登录后立即遇到没有声音设备的问题,可能是因为此变量被手动设置为错误的路径。
虽然可以通过手动重启 PipeWire 来解决此问题,但仍可能出现其他问题,例如在 Chromium 中无法共享屏幕(出现 pipewire context failed)。XDG_RUNTIME_DIR 由 pam_systemd(8) 自动设置,因此您应该删除初始化文件中设置它的所有实例。
SDDM 和 LightDM 用户登录时设备音量未恢复
如果您使用 SDDM 或 LightDM,并且发现登录后音频音量未正确恢复,请为显示管理器用户屏蔽 PipeWire,因为显示管理器下的 WirePlumber 可能会干扰您用户的 WirePlumber 会话。
# systemctl --user -M user@ mask pipewire.socket
将 user 替换为 SDDM 的 sddm 或 LightDM 的 lightdm。
有关更多详细信息,请参阅这篇 Debian Wiki 文章。
终端响铃不起作用
从 PipeWire 的角度来看,必须加载 x11.bell 模块。这应该是配置的默认值(另请参阅上面提到的配置文件)。检查您是否已安装 pipewire-x11-bell 包。此外,您的窗口管理器可能会影响终端响铃,例如,对于 xfwm,请在 xfwm-terminal 设置中检查“Audible bell”是否已激活。现在,重启 pipewire 服务。
$ systemctl --user restart pipewire
您可以使用以下命令尝试终端响铃是否有效:
$ echo $'\a'
第一次播放尝试后没有声音
当 PipeWire 使用套接字激活启动时,一些 PipeWire 原生应用程序可能会尝试在 WirePlumber 配置节点之前播放音频,从而导致错误,例如。
$ mpv -v /path/to/file
[ao/pipewire] PipeWire does not have any audio sinks, skipping [ao] Failed to initialize audio driver 'pipewire'
$ journalctl --user -u mpd.service
output: Failed to play on "PipeWire" (pipewire): no target node available exception: Failed to open audio output
作为一种变通方法,您可以 启用 pipewire.service 用户单元。
视频
OBS(等)什么都不显示,即使它们要求窗口/屏幕
如果您确定已安装 xdg-desktop-portal 以及 xdg-desktop-portal-gtk 或 xdg-desktop-portal-kde,请检查守护进程的运行状态。
在 OBS 中,如果一切正常,您应该在 stdout 中看到这个。
... info: [pipewire] desktop selected, setting up screencast info: [pipewire] created stream 0x5632d7456850 info: [pipewire] playing stream…
对于多显示器设置,slurp 包可以捕获所有屏幕。
参见
- Wiki — Freedesktop GitLab 上的 PipeWire Wiki
- Pipewire Update Blog Post — 2018 年 1 月的博客文章,概述了当时 PipeWire 的状态
- PipeWire Late Summer Update 2020 — 2020 年 9 月的博客文章