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 Media Session
pipewire-media-session 已被弃用,不再推荐使用。 它主要用于测试以及作为构建新会话管理器的示例。
图形界面
- coppwr — 用于 PipeWire 的底层控制和诊断图形界面。
- Helvum — 基于 GTK 的 PipeWire 的 patchbay,灵感来自 JACK 工具 catia。 不保存连线集。
- qpwgraph — 基于 Qt 的 PipeWire 的 Graph/Patchbay,灵感来自 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,通过为 JACK 客户端提供 PulseAudio 兼容的服务器实现和 ABI 兼容的库。 有关更多信息,请参阅博文 PipeWire Late Summer Update 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,使用 Default Sink:(上面)或 Name:(下面)、默认 sink 设备(@DEFAULT_SINK@)或 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%
Source 输入的处理方式类似。 有关更多配置(例如关于模块)的信息,请参阅关于 从 PulseAudio 迁移 和 Pipewire-Pulse 配置 的官方上游 Wiki。
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 需求,以下是用于保存连线集、加载连线集和取消所有连接的 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
的输出,并将默认输入(source)和输出(sink)设备设置为您喜欢的设备,使用 wpctl set-default ID
。 ID
是 sink/source 名称之前的数字。
现在,您可以全面测试您的配置。
在设备配置文件之间切换
某些硬件音频设备(如 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,选择 “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
Linux 版 JamesDSP (以 jamesdspAUR 形式提供) 为 PipeWire 和 PulseAudio 提供开源音效。它使用自己的效果引擎,不依赖于 LADSPA、Calf 等。JamesDSP 最初是作为 Android 设备的音频效果处理器发布的。
使用 LADSPA、LV2 和 VST 插件
如果您想在所有可用的 LADSPA、LV2 和 VST 插件中进行选择,您可以使用 carla 和 pipewire-jack 来应用它们。
启动 Carla 并转到 Settings > Configure Carla > Engine。确保 Audio driver 设置为 JACK,并根据您的需要选择一个进程模式。您也可以使用特定命令运行 Carla 来选择进程模式,例如 carla-rack
用于 Continuous 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。
在 Rack 选项卡中,添加您想要的任何插件。确保它们是 stereo 类型。您可以更改它们的顺序。在 Continuous Rack 进程模式下,列表顶部的插件将是第一个接收音频流的插件,就像在 EasyEffects 中一样。之后,转到 Patchbay 选项卡,将 default_null_sink
L/R 监视器连接到 Carla 输入,然后将 Carla 输出连接到您想要的设备(扬声器、耳机、HDMI 等)的回放。将配置保存到本地文件,例如 ~/Documents/carla_sink_effects.carxp
。Carla 将在打开此文件后自动恢复连接。
您可以在多媒体应用程序正在播放音频时测试效果,例如通过 Firefox 在网站上观看视频。有两种方法可以做到这一点。第一种方法是在 Carla Patchbay 选项卡中,断开所有 Firefox 连接,并将其 L/R 输出链接到 default_null_sink
回放。第二种方法是通过 pavucontrol,找到 Firefox 音频流并将其重定向到 default_null_sink
(这应该会记住连接,以便在下次实例中自动将应用程序重定向到相同的 sink)。
要使用 Continuous Rack 进程模式运行 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/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 上进行 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
,并在 IRC (#pipewire on OFTC) 或邮件列表上寻求帮助时粘贴bin /tmp/pipe.txt
。
蓝牙音频质量低
如果蓝牙播放断断续续,请检查 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
保存设置。现在您应该可以像往常一样使用音量混音器了。
实时音频不起作用
如果 pipewire.service
用户单元 的 状态 中显示 RTKit error: org.freedesktop.DBus.Error.AccessDenied
,则 pipewire 守护进程的优先级未更改为实时。有关此问题,请参阅 [8]。
在同一声卡上同时输出到多个 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/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 音频引擎 的游戏,例如 永恒之柱,会调用 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 月的博客文章