PipeWire
PipeWire 是一个新的底层多媒体框架。 它旨在以最低的延迟为音频和视频提供录制和播放功能,并支持基于 PulseAudio、JACK、ALSA 和 GStreamer 的应用程序。
基于该框架的守护进程可以配置为音频服务器(具有 PulseAudio 和 JACK 特性)和视频录制服务器。
PipeWire 还支持像 Flatpak 这样的容器,不依赖于 audio 和 video 用户组。 相反,它采用了类似于 Polkit的安全模式,向 Flatpak 或 Wayland 请求许可以录制屏幕或音频。
安装
可以从官方软件库安装 pipewire包 程序。 也有lib32-pipewire包 的32位库对于 multilib 进行支持
可以选择安装 pipewire-docs包 来查看文档。
Pipewire 可以作为其他音频服务器的直接替代品。更多详细信息请参见#声音。
会话(Session)管理
像 JACK一样,PipeWire 内部没有实现连接逻辑。 监视新 streams 并将其连接到适当的输出设备或应用程序的负担留给称为会话管理器的外部组件。
WirePlumber
WirePlumber 是推荐的会话管理器,采用模块化设计,通过 Lua 插件实现实际管理功能。
默认配置文件位于 /usr/share/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包 已弃用且不再推荐使用,该组件主要作为测试用例和会话管理器开发参考。
启动
Pipewire 使用 systemd/用户 来管理服务器,并利用套接字激活在需要时自动启动。
要在登录时启动 PipeWire,请启用 pipewire.service, pipewire-pulse.service and wireplumber.service user units.
GUI图形界面
- Cable — 一款可在运行时动态修改 PipeWire 与 WirePlumber 配置的 PyQt 应用程序
- coppwr — PipeWire 底层控制与诊断工具
- Helvum — 基于 GTK 的 PipeWire 接插板工具,灵感源自 JACK 的 catia。不支持连线保存
- pwvucontrol — PipeWire 音量控制工具,可作为 pavucontrol 替代品
- qpwgraph — 基于 Qt 的 PipeWire 路由接插板,灵感源自 JACK 的 QjackCtl。支持连线保存
- Simple Wireplumber GUI — 一个简单的 PipeWire GTK4 图形界面工具。如果使用 PipeWire 作为音频服务器,并使用 WirePlumber 作为会话和策略管理器,则可以通过此工具轻松重命名音频设备并查看其属性。
- sonusmix — PipeWire 音频路由工具
- Pipewire Control Center — 基于 GTK4/libadwaita 的 PipeWire 控制中心,支持通过效果链将应用程序的音频信号路由至任意输出设备,并提供参数均衡器、实时电平表、麦克风降噪、音频接线板、音频监测、虚拟设备、滤波器链、HRIR 环绕声及附加配置文件等功能。
TUI
- pipemixer — 一个使用ncurses构建的、用于PipeWire的TUI音量控制应用程序。
- wiremix — 一个用于PipeWire的简单TUI音频混音器。
配置
PipeWire 软件包在 /usr/share/pipewire 中提供了一组初始配置文件。不应直接编辑这些文件,因为包更新将覆盖所做的更改。要配置 PipeWire,可以将文件从 /usr/share/pipewire 复制到备用系统配置目录位置 /etc/pipewire或用户目录 ~/.config/pipewire。具有较高优先级的目录中的同名文件会使类似文件被忽略。 [2]
Pipewire 带来了一个PulseAudio 配置以外的自定义的 "Pro Audio" 配置文件(不要与专业音频 混淆), 可通过 pavucontrol进行选择。其效果如下所述:https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/FAQ#what-is-the-pro-audio-profile
用法
声音
PipeWire 可以用作音频服务器,类似于 PulseAudio 和 JACK,它旨在通过为JACK客户端提供PulseAudio兼容的服务器实现和ABI兼容库来取代PulseAudio和JACK。有关详细信息,请参阅博客文章PipeWire Late Summer Update 2020。
首先,安装 pipewire-audio包。然后根据音频客户端的类型,可能还需要执行一些额外的步骤。您可能需要为您的音频设备安装额外的固件,请参阅ALSA#固件。
ALSA 客户端
安装 pipewire-alsa包 (如果安装了pulseaudio-alsa包需要删掉它) 以使用 ALSA API 通过 PipeWire 路由所有应用程序。
PulseAudio 客户端
安装 pipewire-pulse包。它将代替 pulseaudio包 和 pulseaudio-bluetooth包。重新启动、重新登录或 start pipewire-pulse.service user unit 以查看效果。
通常,不需要进一步的操作,应用应作为用户服务自动启用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: 或下文 Name: 的值
- 默认设备占位符 @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(已挂起)。
balance(声道平衡)数值会自动计算。设置默认设备的整体音量:
pactl set-sink-volume @DEFAULT_SINK@ 75%
独立设置各声道音量(需提供每个声道的百分比):
pactl set-sink-volume @DEFAULT_SINK@ 100% 75% 100% 75% 100% 100%
Source(输入设备)的操作方式类似。更多配置(如模块加载)请参考上游维基: Migration from PulseAudio Pipewire-Pulse Configuration.
JACK 客户端
安装 pipewire-jack包 以获取 JACK 支持。还有 lib32-pipewire-jack包 用于 multilib 支持。
pw-jack(1) 可以用来启动 JACK 客户端, 但从技术上讲它不是必需的, 因为它只用作 PIPEWIRE_REMOTE、PIPEWIRE_DEBUG 和 PIPEWIRE_LATENCY 环境变量的包装器。
可以通过设置 缓冲区大小/采样率 的商(等于以秒为单位的块延迟)来请求自定义缓冲区大小:
PIPEWIRE_LATENCY="128/48000" application
蓝牙设备
如果安装了 pipewire-pulse包 软件包,PipeWire 将自动处理蓝牙音频设备。
自动化 profile 切换
pipewire-media-session包 和 WirePlumber 都可以在检测到输入流时自动在 HSP/HFP 和 A2DP 配置文件之间切换。
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 支持使用多种机制通过网络共享音频,包括:
- AES67
- RTP
- Apple Airplay (without DRM features)
- JACK (netjack2)
- Roc
- PipeWire Native RTP
- PulseAudio's network protocol
- Snapcast
PipeWire维基上有一个页面,概述并比较了不同的网络协议。
下文将介绍 Pulse Tunnel(Pulse 音频隧道) 方案。PipeWire 的 PulseAudio 兼容层支持 网络音频串流。在网络上的计算机之间共享音频的一种简单方法是使用 Avahi 守护程序进行发现。要启用此功能,请安装 pipewire-zeroconf包 软件包。
确保所有要共享声音的计算机上的 avahi-daemon.service 正在运行(如果使用 firewall,则要保证 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-zeroconf-publish.conf (or ~/.config/pipewire/pipewire-pulse.conf.d/50-zeroconf-publish.conf)
pulse.cmd = [
{ cmd = "load-module" args = "module-native-protocol-tcp listen=192.168.1.10" }
{ cmd = "load-module" args = "module-zeroconf-publish" }
]
客户端:
/etc/pipewire/pipewire-pulse.conf.d/50-zeroconf-discover.conf (or ~/.config/pipewire/pipewire-pulse.conf.d/50-zeroconf-discover.conf)
pulse.cmd = [
{ cmd = "load-module" args = "module-zeroconf-discover" }
]
将音频串流到 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 地址>
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 官方文档。
node.description 用于设置 pulsemixer 显示的设备名称;node.name 供 pactl 工具读取。建议两项均进行配置。在两台设备上 重启 pipewire.service 用户单元。
在本地 JACK 上运行 PipeWire
如果需要,PipeWire 也可以作为 JACK 客户端在本机 JACK 守护程序之上运行。
请参阅 JACK 和 PipeWire (PipeWire wiki) 和 -JACK#jack-bridge JACK 桥(PipeWire wiki) 了解更多信息和附加配置(例如可用通道)。
要使用它,请安装 pipewire-jack-client包 并启动 JACK。Pipewire 应该会被自动桥接。
它可以在启动 jack 之前像 PulseAudio 模块一样手动加载(在pactl(1)解释):pactl load-module module-jackdbus-detect。
使用 ALSA dmix 设备作为 PipeWire 接收器
可以通过 ALSA dmix devices 将 PipeWire 服务器(或每个用户多个)输出到 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/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,使其监听本地 TCP 连接。
在外部用户家目录下新建如下配置文件:
~/.config/pipewire/pipewire-pulse.conf.d/pulse-server.conf
pulse.properties = {
server.address = [
"unix:native"
"tcp:127.0.0.1:4713" # 此时外部用户的 pipewire 服务会监听 IPv4 本地回环地址
]
}
之后在内层用户会话中设置环境变量 PULSE_SERVER=tcp:127.0.0.1:4713。比如以内层用户身份启动 Xephyr 前执行导出该变量。更多说明与其他配置方案可参阅该论坛帖子
WebRTC 屏幕共享
大多数应用程序过去依赖 X11 来捕获桌面(或单个应用程序),例如在网络浏览器中使用 WebRTC 时(例如在 Google Hangouts 上)。 在 Wayland 上,屏幕共享机制由 XDG Desktop Portal 配合 PipeWire 实现,能够通过细粒度的访问控制在 Wayland 下共享内容
Firefox (84+) 默认支持此方法,而在 Chromium (73+) 上,需要通过设置启用 WebRTC PipeWire 支持 URL chrome://flags/#enable-webrtc-pipewire-capturer 处的相应(实验)标志,或者使用CLI参数 --enable-features=WebRTCPipeWireCapturer。
obs-studio包 (27+) 通过使用新的 PipeWire 捕获源支持此方法。
视频
尽管该软件尚未准备好投入生产,但可以安全地使用。大多数依赖 GStreamer 处理视频流的应用程序应该使用 PipeWire GStreamer 插件开箱即用,请参阅 GStreamer#PipeWire。因此,像 cheese包 这样的应用程序已经能够使用它来共享视频输入。
使用 pipewire-v4l2包,还应该可以使用 pw-v4l2 脚本来预加载库 (/lib/pipewire-0.3/v4l2/libpw-v4l2 .so)拦截 v4l2 调用并通过管道路由视频。
音频后期处理
Pipewire 模块过滤链(module-filter-chain)
Pipewire 有一个名为过滤链(filter-chain)的内部模块,可以创建节点来处理音频输入和输出。有关均衡、虚拟环绕声、LADSPA 插件和通道混合的示例,请参阅 /usr/share/pipewire/filter-chain/。
LADSPA
你可以从官方软件仓库安装各种 LADSPA 插件,并在 PipeWire 滤波器链中使用它们。
要列出特定文件提供的插件标签及可用控制参数,可以使用 ladspa包 软件包中的 analyseplugin:
$ analyseplugin /usr/lib/ladspa/lsp-plugins-ladspa.so
全系统参数均衡
PipeWire 的滤波器链支持参数均衡器(Parametric EQ)[4]。在 /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
}
}
}
]
你可以使用任意数量的滤波器。
如果需要前置放大器(Pre-amp),可以在频率为 0 的位置应用 bq_highshelf 滤波器,例如:
{ type = bq_highshelf, freq = 0, gain = -5.0, q = 1.0 },
重启 PipeWire,然后将“Equalizer Sink”设置为默认音频输出设备。此后,均衡器效果应会应用于所有应用程序。
或者,你也可以不指定 filters 数组,而是提供 filename 属性,指向由 AutoEq 项目或 Squiglink 生成的参数均衡器配置文件,例如:
config = {
filename = "/path/to/parametric.txt"
}
EasyEffects
EasyEffects(以前的 PulseEffects)是一个 Qt 实用程序,它为各个应用程序输出流和麦克风输入流提供大量音频效果和滤波器。值得注意的效果包括输入/输出均衡器、输出响度均衡和低音增强、输入嘶声消除器和降噪插件。有关效果的完整列表,请参阅 GitHub 页面。
为了使用 EasyEffects,请安装 easyeffects包。有关预设配置的集合,请参阅社区预设。对于算法生成的耳机 EQ 预设的集合,请参阅 AutoEq。
NoiseTorch
NoiseTorch 是一种噪声抑制的替代方法,与 noisetorchAUR 打包在一起。另外还有-git版本noisetorch-gitAUR。
启动后,可以为所选麦克风加载模块。可以调整语音激活阈值,应将其设置为最高级别,而不是过滤掉任何实际语音。
您可以使用 systemd 自动启动音频处理,请参阅 [5]。请注意,如果从 AUR 安装,noisetorch 二进制路径会有所不同。
语音噪声抑制
安装 noise-suppression-for-voice包 软件包,以使用适配 LADSPA 滤波器链的 librnoise,并安装 swh-plugins包 软件包以提供噪声门(Noise Gate)功能。
GitHub 上提供的说明基本仍然适用,但部分内容已经过时。在 PipeWire 1.6.3 中,滤波器链模块改为在预定义位置搜索插件,并更改了插件格式。
capture.props 和 playback.props 部分末尾分别添加以下两行来实现:
~/.config/pipewire/pipewire.conf.d/99-input-denoising.conf
audio.channels = 1 audio.position = [ MONO ]
JamesDSP
JamesDSP for Linux (jamesdspAUR) 为 PipeWire 和 PulseAudio 提供开源的音效实现。JamesDSP 使用自己的效果引擎,不依赖 LADSPA 或是 Calf 之类的东西。起初它被用于安卓设备的音效处理。
LADSPA, LV2 和 VST 插件
如果你希望从所有可用的 LADSPA、LV2 和 VST 插件中自由选择,可以通过 carla包 配合 pipewire-jack包 来使用这些插件。
启动 Carla,进入 Settings > Configure Carla > Engine(设置 > 配置 Carla > 引擎)。确保将 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 (或 ~/.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 的所有连接,并将其左右声道输出连接到 default_null_sink 的播放端口。第二种是通过 pavucontrol包 找到 Firefox 的音频流,并将其重定向到 default_null_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兼容层应该会记住应用的连接关系)。
参阅
- Wiki——Freedesktop GitLab 上的 PipeWire Wiki
- Pipewire Update Blog Post——一篇 2018 年 1 月的描述当时 PipeWire 状态的博文
- PipeWire Late Summer Update 2020——2020 年 9 月的一篇博文