PipeWire
PipeWire 是一个新的底层多媒体框架。 它的目标是为音频和视频提供捕获和回放功能,并具有最小的延迟,并支持基于 PulseAudio、JACK、ALSA 和 GStreamer 的应用程序。
基于该框架的守护程序可以配置为同时作为音频服务器(具有 PulseAudio 和 JACK 功能)和视频捕获服务器。
PipeWire 还支持像 Flatpak 这样的容器,并且不依赖于 audio
和 video
用户组。 相反,它使用类似 Polkit 的安全模型,要求 Flatpak 或 Wayland 授予录制屏幕或音频的权限。
安装
安装 来自官方仓库的 pipewire 软件包。 还有 lib32-pipewire 用于 multilib 支持。
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 媒体会话
pipewire-media-session 已被弃用,不再推荐使用。 它主要是为测试和作为构建新会话管理器的示例而实现的。
图形用户界面 (GUI)
- coppwr — PipeWire 的低级别控制和诊断 GUI。
- Helvum — 基于 GTK 的 PipeWire 连线工具,灵感来自 JACK 工具 catia。 不保存连线设置。
- qpwgraph — 基于 Qt 的 PipeWire 图形/连线工具,灵感来自 JACK 工具 QjackCtl。 保存连线设置。
- pwvucontrol — Pipewire 音量控制。 pavucontrol 的替代品。
- sonusmix — Pipewire 音频路由工具
配置
PipeWire 软件包在 /usr/share/pipewire
中提供了一组初始配置文件。 您不应直接编辑这些文件,因为软件包更新将覆盖您的更改。 要配置 PipeWire,您可以将文件从 /usr/share/pipewire
复制到备用的系统级位置 /etc/pipewire
,或用户位置 ~/.config/pipewire
。 目录中具有更高优先级的同名文件会使类似的优先级较低的文件被忽略。 [2]
配置文件
除了 PulseAudio 配置文件之外,Pipewire 还引入了自定义的“专业音频”配置文件,可以通过 pavucontrol 进行选择。 其效果在 PipeWire wiki 中进行了描述。
用法
音频
PipeWire 可以用作音频服务器,类似于 PulseAudio 和 JACK。 它的目标是取代 PulseAudio 和 JACK,通过为 JACK 客户端提供 PulseAudio 兼容的服务器实现和 ABI 兼容的库。 有关更多信息,请参见博客文章 PipeWire 2020 年夏末更新。
首先,安装 pipewire-audio。 根据音频客户端的类型,您可能还需要采取一些额外的步骤。 您可能需要为您的音频设备安装额外的固件,请参阅 高级 Linux 声音架构#固件。
ALSA 客户端
安装 pipewire-alsa(如果已安装,则删除 pulseaudio-alsa),以通过 PipeWire 路由所有使用 ALSA API 的应用程序。
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
} 指定接收器 (sink),其中 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 状态。
平衡 (balance) 比率会自动计算。要设置默认设备的整体音量,请使用
pactl set-sink-volume @DEFAULT_SINK@ 75%
要设置单独的声道,请分别提供每个声道的音量
pactl set-sink-volume @DEFAULT_SINK@ 100% 75% 100% 75% 100% 100%
源 (source) 输入的处理方式类似。有关更多配置(例如关于模块),请参阅官方上游 Wiki 关于 从 PulseAudio 迁移 和 Pipewire-Pulse 配置 的内容。
JACK 客户端
安装 pipewire-jack 以获得 JACK 支持。还有 lib32-pipewire-jack 用于 multilib 支持。
pw-jack(1) 可用于启动 JACK 客户端,但从技术上讲不是必需的,因为它仅充当 PIPEWIRE_REMOTE
、PIPEWIRE_DEBUG
和 PIPEWIRE_LATENCY
环境变量的包装器。
可以通过设置缓冲区大小/采样率的商(等于以秒为单位的块延迟)来请求自定义缓冲区大小
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 需求,以下是用于保存线组 (wiresets)、加载线组和取消所有连接的 bash 脚本。对于保存和加载,请使用命令行参数指定文件名。
pw-savewires
#!/bin/bash if [[ "$#" -ne 1 ]]; then echo echo 'usage: pw-savewires filename' echo exit 0 fi rm $1 &> /dev/null while IFS= read -r line; do link_on=`echo $line | cut -f 4 -d '"'` link_op=`echo $line | cut -f 6 -d '"'` link_in=`echo $line | cut -f 8 -d '"'` link_ip=`echo $line | cut -f 10 -d '"'` echo "Saving: " "'"$link_on:$link_op"','"$link_in:$link_ip"'" echo "'"$link_on:$link_op"','"$link_in:$link_ip"'" >> $1 done < <(pw-cli dump short link)
pw-loadwires
#!/bin/python import sys import csv import os if len(sys.argv) < 2: print('\n usage: pw-loadwires filename\n') quit() with open(sys.argv[1], newline='') as csvfile: pwwreader = csv.reader(csvfile, delimiter=',', quotechar='"') for row in pwwreader: print('Loading: ' + row[0] + ' --> ' + row[1]) process = os.popen('pw-link ' + row[0] + ' ' + row[1])
pw-dewire
#!/bin/bash while read -r line; do echo 'Dewiring: ' $line '...' pw-link -d $line done < <(pw-cli dump short link {{!}} grep -Eo '^[0-9]+')
与网络上的计算机共享音频设备
虽然 PipeWire 本身不是网络透明的,但其 Pulse 实现支持 网络流。在网络上的计算机之间共享音频的一种简单方法是使用 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。
在原生 JACK 之上运行 PipeWire
如果需要,PipeWire 也可以作为原生 JACK 守护进程之上的 JACK 客户端运行。
有关更多信息和附加配置(例如可用声道),请参阅 JACK 和 PipeWire (PipeWire wiki) 和 JACK Bridge (PipeWire wiki)。
要使用它,请安装 pipewire-jack-client 并启动 JACK。Pipewire 应该会自动桥接。
它可以像 PulseAudio 模块一样手动加载(如 pactl(1) 所述):在启动 jack 之前使用 pactl load-module module-jackdbus-detect
。
将 ALSA dmix 设备用作 PipeWire 接收器
可以使 PipeWire 服务器(或每个用户的多个服务器)通过 ALSA dmix 设备 输出到 ALSA。这允许您使用 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/10-disable-alsa-monitor.conf (or ~/.config/wireplumber/wireplumber.conf.d/10-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] ...
WebRTC 屏幕共享
大多数应用程序过去都依赖 X11 来捕获桌面(或单个应用程序),例如在 Web 浏览器中使用 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 插件和声道混合。
系统级参数均衡
将 /usr/share/pipewire/filter-chain/sink-eq6.conf
复制到 /etc/pipewire/pipewire.conf.d/
(或 ~/.config/pipewire/pipewire.conf.d/
)。
然后编辑 sink-eq6.conf
以加入所需的参数。对于耳机,这些参数可以从 Oratory1990 的数据库 或(如果未在其中列出)AutoEQ 项目 中获得。
如果您需要前置放大器 (pre-amp),请修改 eq_band_1
以应用频率为 0Hz 且负增益的 bq_highshelf
滤波器(支持 -120 到 +20dB 的增益)
label = bq_highshelf control = { "Freq" = 0 "Q" = 1.0 "Gain" = -7.5 }
对于超过 6 个频段,请向 nodes
列表添加更多条目,并添加相应的 links
将一个滤波器 ":Out" 连接到下一个滤波器 ":In",例如增加到 11 个频段(前置放大器 + 10)
{ output = "eq_band_6:Out" input = "eq_band_7:In" } { output = "eq_band_7:Out" input = "eq_band_8:In" } { output = "eq_band_8:Out" input = "eq_band_9:In" } { output = "eq_band_9:Out" input = "eq_band_10:In" } { output = "eq_band_10:Out" input = "eq_band_11:In" }
重启 Pipewire,选择“Equalizer Sink”作为您的默认声音输出设备;这将应用于所有应用程序。
EasyEffects
EasyEffects(以前的 PulseEffects)是一个 GTK 实用程序,它为单独的应用程序输出流和麦克风输入流提供大量音频效果和滤波器。值得注意的效果包括输入/输出均衡器、输出响度均衡和低音增强、输入齿音消除器和降噪插件。有关完整的效果列表,请参阅 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 来检测设备。如果这对你不起作用,请尝试关闭 api.alsa.use-acp
,或者可选地打开 api.alsa.use-ucm
在 wireplumber 中
/etc/wireplumber/wireplumber.conf.d/50-alsa-config.conf (or ~/.config/wireplumber/wireplumber.conf.d/50-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 问题中建议的另一种解决方案是手动添加麦克风。首先,确保麦克风被 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" } ]
然后使用 systemctl --user 重启 pipewire-pulse.service
,并检查 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 中没有声音,但在 Web 浏览器和 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 桌面扬声器测试和 Web 浏览器 “youtube” 产生有效的声音结果。
在 Gnome 中切换输入、静音、取消静音、更改音量都不能解决问题。
pactl list sinks
报告的 Sink 状态为 “SUSPENDED” 无需担心,因为通过 Web 浏览器运行视频时状态会正确更改。
使用 pactl info
没有指出任何明显的问题。
检查相关的 systemd
单元日志没有指出任何明显的问题。
问题原因
似乎从 pipewire
到硬件的路径不知何故被静音了。原始作者不知道如何使用命令行工具识别和指出问题。
解决方案
安装 pavucontrol 软件包。运行 pavucontrol
,选择适当的源,然后在 mpv --ao=pipewire test.mp4
视频运行时,使用 静音 按钮静音和取消静音源。
音量低
将 PulseAudio 替换为 Pipewire 后,声音可能工作正常,但在重启后,音量变得无法忍受的低。
打开 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
,请添加
username soft memlock 64 username hard memlock 128
到 /etc/security/limits.d/username.conf
更改默认采样率
默认情况下,PipeWire 设置固定的全局采样率为 48kHz。如果你需要更改它(例如,你拥有支持更高值的 DAC),你可以设置新的默认值
/etc/pipewire/pipewire.conf (or ~/.config/pipewire/pipewire.conf)
... context.properties = { ... default.clock.rate = sample_rate ...
更改允许的采样率
PipeWire 还可以动态更改你的 DAC 支持的输出采样率。采样率跟随正在播放的音频流的采样率。
~/.config/pipewire/pipewire.conf
... context.properties = { ... default.clock.allowed-rates = [ sample_rate_1 sample_rate_2 sample_rate_3 ... ] ...
例如,[ 44100 48000 88200 96000 ]
。
根据 开发人员 的说法:“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
也显示每张卡和音频流当前使用的采样率。
default.clock.allowed-rates
后不会切换到更高的速率,则可能意味着系统无法读取 DAC 支持的速率。在这种情况下,你仍然可以尝试设置 default.clock.rate
音质(重采样质量)
如果你使用 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 显示 Failure: Connection refused
这意味着应用程序无法连接到 PipeWire-Pulse 服务,请检查 pipewire-pulse.service
用户单元 是否正在运行。
如果这不能解决问题,请运行 strace -f -o /tmp/pipe.txt pactl info
并将 /tmp/pipe.txt
粘贴到 pastebin,同时在 IRC (#pipewire on OFTC) 或邮件列表中寻求帮助。
蓝牙音频质量低
如果蓝牙播放断断续续,请检查 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.codecs
设置为 sbc aac ldac aptx aptx_hd
之一来更改它。您也可以尝试 mSBC 支持(修复 Sony 1000XM3 上的麦克风问题,即 Headphones WH-1000XM3 和 Earbuds WF-1000XM3)和 SBC-XQ 编解码器。
使用 wireplumber
/etc/wireplumber/wireplumber.conf.d/51-bluez-config.conf (or ~/.config/wireplumber/wireplumber.conf.d/51-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/51-disable-suspension.conf (or ~/.config/wireplumber/wireplumber.conf.d/51-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
以应用更改。
除了完全禁用挂起之外,您还可以将超时值更改为源挂起前的所需延迟秒数。
某些设备实现了它们自己的静音和挂起检测。对于它们来说,仅禁用节点挂起不起作用。可以通过添加少量噪声来解决它们,使其输出永远不会完全静音
.../51-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/50-alsa-config.conf (or ~/.config/wireplumber/wireplumber.conf.d/50-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” 选项。 - 按照#更改默认采样率中的说明,将采样率降低到
44100
(44.1 kHz)。
待机后音频问题
如果在机器从睡眠状态唤醒后声音丢失或变得混乱,则可能有助于重新初始化 ALSA
# alsactl init
USB DAC 的高延迟(例如 Schiit DAC)
更改采样率或格式可能有助于减少某些 DAC 的延迟,例如 Schiit Hel 2。[5] 使用 pipewire-media-session 中的匹配规则,我们可以为设备设置属性。[6][死链接 2024-07-30 ⓘ]
将默认配置文件 /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 ...
可以使用 pw-top
获取 alsa_output.name-of-node
节点。
您的 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 在达到一定音量级别之前不会有声音输出 [7]。通常,这大约在 25% - 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.*" } ] 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 } } } ]
然后,重启 pipewire。在 alsamixer
中设置您的主音量,然后以 root 身份运行 alsactl store
保存设置。您现在应该可以像往常一样使用音量混音器了。
实时音频无法工作
如果 pipewire.service
用户单元 的状态中显示 RTKit error: org.freedesktop.DBus.Error.AccessDenied
,则 PipeWire 守护进程的优先级未更改为实时。有关此问题,请参阅 [8]。
在同一声卡上同时输出到多个 sink
复制 /usr/share/alsa-card-profile/mixer/profile-sets/default.conf
的副本,以便更改在更新后仍然保留。这里我们定义一个配置文件,将 Analog 和 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/51-alsa-custom.conf (or ~/.config/wireplumber/wireplumber.conf.d/51-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 } } } ...
FMOD 游戏在 PipeWire 下崩溃
某些使用旧版本 FMOD 音频引擎 的游戏,例如 Pillars of Eternity,会调用 pulseaudio --check
,如果 PulseAudio 二进制文件不存在则会崩溃。一种解决方法是将 /bin/pulseaudio
符号链接到 /bin/true
。[9]
# ln -s /bin/true /bin/pulseaudio
请注意,如果您希望重新安装 PulseAudio,则需要删除该符号链接。
自动切换不起作用
如果自动切换不起作用,则可能是 WirePlumber 状态的问题。正如 此评论 所建议的那样,您可以删除 WirePlumber 的本地状态并重启守护进程,看看是否有帮助
$ rm -r ~/.local/state/wireplumber/
然后重启 wireplumber.service
用户单元。
挂起后实时优先级丢失/负载下出现噼啪声
由于 rtkit 中的一个 2011 年的错误,挂起事件导致 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 守护进程。[10] 如果您在登录后立即遇到没有声音设备的情况,可能是因为此变量已被手动设置为错误的路径。
虽然可以通过手动重启 PipeWire 来解决此问题,但仍可能发生其他问题,例如无法在 Chromium 中共享屏幕(出现 pipewire context failed
)。XDG_RUNTIME_DIR
由 pam_systemd(8) 自动设置,因此您应该删除在初始化文件中设置它的任何实例。
SDDM 用户的设备音量在登录时未恢复
如果您使用 SDDM 并注意到您的音频音量级别在登录后未正确恢复,请屏蔽 SDDM 的 Pipewire,因为在 SDDM 下运行的 Wireplumber 可能会干扰您用户的 Wireplumber 会话。
# systemctl --user -M sddm@ mask pipewire.socket
有关更多详细信息,请参阅此 Debian Wiki 文章。
终端响铃不起作用
从 PipeWire 的角度来看,必须加载模块 x11.bell。这应该是配置默认值(另请参阅上面提到的配置文件)。检查您是否已安装软件包 pipewire-x11-bell。此外,您的窗口管理器可能会影响终端响铃,例如,对于 xfwm,请在 xfwm-terminal 设置中检查是否激活了 “可听响铃”。现在,重启 pipewire 服务
$ systemctl --user restart pipewire
您可以使用以下命令尝试终端响铃是否有效
$ echo $'\a'
视频
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 更新博客文章 — 2018 年 1 月的博客文章,概述了当时 PipeWire 的状态
- PipeWire 2020 年夏末更新 — 2020 年 9 月的博客文章