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 媒体会话
pipewire-media-session 已被弃用,不再推荐使用。 它主要用于测试,并作为构建新会话管理器的示例。
图形界面
- 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 还带来了自定义的“Pro Audio”配置文件,可以通过 pavucontrol 选择。 其效果在 PipeWire wiki 中描述。
使用
音频
PipeWire 可以用作音频服务器,类似于 PulseAudio 和 JACK。 它的目标是通过提供 PulseAudio 兼容的服务器实现和 JACK 客户端的 ABI 兼容库来取代 PulseAudio 和 JACK。 有关更多信息,请参见博客文章 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
} 指定输出,使用默认输出:(上面)或名称:(下面)的值,默认输出设备(@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,因为其他设备将处于暂停状态。
平衡比率是自动计算的。 要设置默认设备的整体音量,请使用
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 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 本身不是网络透明的,但其脉冲实现支持 网络流式传输。 在网络上的计算机之间共享音频的一种简单方法是使用 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 发现模块
$ 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 来捕获桌面(或单个应用程序),例如在网页浏览器中使用 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 项目 中获取,如果未在其中列出。
如果您需要前置放大器,请修改 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,选择“均衡器输出”作为您的默认声音输出设备; 这应适用于所有应用程序。
EasyEffects
EasyEffects(以前的 PulseEffects)是一个 GTK 实用程序,它为各个应用程序输出流和麦克风输入流提供大量音频效果和滤波器。 值得注意的效果包括输入/输出均衡器、输出响度均衡和低音增强、输入齿音消除器和降噪插件。 有关效果的完整列表,请参阅 GitHub 页面。
为了使用 EasyEffects,请安装 easyeffects。 有关预设配置的集合,请参阅 社区预设。 有关耳机算法生成的 EQ 预设集合,请参阅 AutoEq。
NoiseTorch
NoiseTorch 是降噪的另一种方法,与 noisetorchAUR 一起打包。 还存在 noisetorch-gitAUR。
启动后,可以为选定的麦克风加载模块。 可以调整语音激活阈值,应将其设置为最高级别,而不是过滤掉任何实际语音。
您可以使用 systemd 自动启动音频处理,请参阅 [4]。 请注意,如果从 AUR 安装,noisetorch 二进制路径会有所不同。
语音降噪
安装 noise-suppression-for-voice 软件包。
然后只需按照 GitHub 上的说明进行操作即可。
JamesDSP
适用于 Linux 的 JamesDSP(可作为 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 输出。
/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
(这应该记住连接,以便在下一个实例中自动将应用程序重定向到同一输出)。
要使用连续机架进程模式运行 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
,或者在 wireplumber 中选择性地开启 api.alsa.use-ucm
/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
视频运行时,使用“静音”按钮静音和取消静音源。
音量过低
用 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
,请添加到
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
也显示每张卡和音频流当前使用的采样率。
声音质量(重采样质量)
如果您使用 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 上,resample.quality = 14
在 44100→48000 Hz 时会导致 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
,同时在 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 ...
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 在达到一定音量级别 [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
保存设置。您现在应该可以像往常一样使用您的音量混音器。
实时音频不工作
如果 RTKit error: org.freedesktop.DBus.Error.AccessDenied
出现在 pipewire.service
用户单元 的 状态 中,则 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 设置中检查是否激活了 “Audible bell”。现在,重启 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 月的博客文章