PipeWire

来自 ArchWiki
(重定向自 Pipewire

PipeWire 是一个新的底层多媒体框架。它的目标是为音频和视频提供捕获和播放功能,同时具有最小的延迟,并支持基于 PulseAudioJACKALSAGStreamer 的应用程序。

基于该框架的守护程序可以配置为音频服务器(具有 PulseAudio 和 JACK 功能)和视频捕获服务器。

PipeWire 还支持像 Flatpak 这样的容器,并且不依赖于 audiovideo 用户组。相反,它使用类似 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 的底层控制和诊断图形界面。
https://github.com/dimtpap/coppwr || coppwrAUR
  • Helvum — 基于 GTK 的 PipeWire 的 patchbay,灵感来自 JACK 工具 catia。 不保存连线集。
https://gitlab.freedesktop.org/pipewire/helvum || helvum
  • qpwgraph — 基于 Qt 的 PipeWire 的 Graph/Patchbay,灵感来自 JACK 工具 QjackCtl。 保存连线集。
https://gitlab.freedesktop.org/rncbc/qpwgraph || qpwgraph
  • pwvucontrol — Pipewire 音量控制。 pavucontrol 的替代品。
https://github.com/saivert/pwvucontrol || pwvucontrolAUR
  • sonusmix — Pipewire 音频路由工具
https://codeberg.org/sonusmix/sonusmix || sonusmixAUR

配置

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。 它将替换 pulseaudiopulseaudio-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_REMOTEPIPEWIRE_DEBUGPIPEWIRE_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 已打开)在所有将共享音频的计算机上。

注意: 某些 GUI 音量管理器默认隐藏网卡。 (例如:在 Plasma 中,必须 “配置音频音量...” 并选中 “显示虚拟设备”。

要共享本地音频设备,请在主机上加载适当的模块(确保使用本地 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 应该会自动桥接。

注意: 自 pipewire 0.3.81 起,jackdbus 模块的加载是自动完成的,不再需要手动加载。

它可以像 PulseAudio 模块一样手动加载(如 pactl(1) 所述):在启动 jack 之前 pactl load-module module-jackdbus-detect

使用 ALSA dmix 设备作为 PipeWire 输出

可以使 PipeWire 服务器(或每个用户的多个服务器)通过 ALSA dmix 设备 输出到 ALSA。 这允许您使用 ALSA 作为主要音频输出系统,同时能够使用非 ALSA 设备(如蓝牙耳机)。

ALSA dmix 设置

假设您有两张卡,PCHHDMI

/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,0dmix: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 IDID 是 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 下共享内容成为可能,并具有细粒度的访问控制。

提示: 使用 Mozilla 的 GetUserMedia WebRTC 测试页面 测试 WebRTC 屏幕共享是否正常工作。
注意: xdg-desktop-portal 1.10.0 修复了其 D-Bus 接口的规范和实现之间的不匹配。 [3] 因此,某些客户端可能无法与 xdg-desktop-portal 1.10.0 或更高版本一起使用。

Firefox (84+) 和 Chromium (110+) 默认支持此方法,而在旧版本的 Chromium (73+) 上,需要通过在 URL chrome://flags/#enable-webrtc-pipewire-capturer 设置相应的(实验性)标志或通过 CLI 参数 --enable-features=WebRTCPipeWireCapturer 来启用 WebRTC PipeWire 支持

obs-studio (27+) 通过使用新的 PipeWire 捕获源来支持此方法。

视频

本文或本节需要扩充。

原因: pipewire-v4l2 (在 Talk: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 页面

注意: Firefox 在麦克风流方面存在问题,请参阅 Github 问题

为了使用 EasyEffects,请安装 easyeffects。 有关预设配置的集合,请参阅 社区预设。 有关耳机算法生成的 EQ 预设集合,请参阅 AutoEq

注意: EasyEffects 可能会在启动后崩溃,并抛出 gtk 错误,请参阅 Github 问题 了解解决方法。
注意: 对于 PulseEffects 旧版本,请参阅 PulseAudio#PulseEffects

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 插件中进行选择,您可以使用 carlapipewire-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/Troubleshooting 合并的候选对象。

注意: 本节内容足够长,可以拆分为一个专门的子页面。(在 Talk:PipeWire#Move Troubleshooting into a new separate page 中讨论)

音频

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
}


使用 pipewire-media-session

/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 并检查可用设备

这篇文章或章节已过时。

原因: 选项 --list-targets 在最新版本的 pw-record 中不再可用;为了列出对象,请改用 wpctl statuspw-cli lspw-dump。(在 Talk:PipeWire 中讨论)
$ 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 扬声器测试中声音正常

这篇文章或章节的事实准确性存在争议。

原因: 写作风格不像 wiki,更像博客。需要重新措辞 + 缩短。子章节也显得过分。问题根源是猜测的,未经证实。(在 Talk:PipeWire 中讨论)
条件描述

验证此问题状况的最佳工具是在安装了编解码器的情况下使用 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'
注意: 尽管您的 DAC 芯片可能报告的速率高于规范中宣传的速率,但其中一些是为 USB 到 I2S 等特殊模式设计的
检查当前使用的采样率

要检查卡当前使用的输出采样率,请运行

$ grep rate: /proc/asound/card?/pcm??/sub?/hw_params
/proc/asound/card1/pcm0p/sub0/hw_params:rate: 96000 (96000/1)

pcm0ppcm0c 中,c 是“capture”(捕获)的缩写,p 是“playback”(回放)的缩写。

命令

$ pw-top

也显示每张卡和音频流当前使用的采样率。

提示: 如果在设置 default.clock.allowed-rates 后,您的 DAC 不切换到更高的速率,则可能意味着系统无法读取 DAC 支持的速率。在这种情况下,您仍然可以尝试设置 default.clock.rate

音质(重采样质量)

如果您之前使用 PulseAudio 并设置了 resample-method = speex-float-10soxr-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.servicepipewire-pulse.socket 用户单元(如果您希望配置更改生效,永远不要忘记 pipewire-pulse.socket)。

1014 之间的质量差异非常小,但 CPU 负载差异为 2-3 倍。而 41014 之间的延迟差异还有待任何人调查。在 Ryzen 2600 上进行 44100→48000 Hz 的 resample.quality = 14 会导致 pipewirepipewire-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 编解码器。

注意: 如果在配套应用程序中将“声音质量模式”设置为“优先稳定连接”而不是“优先声音质量”,则像 WH-1000XM3 这样的耳机将拒绝宣传除 SBC/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 ]
}

使用 pipewire-media-session

/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.servicewireplumber.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.noisedither.method 参数,以使噪音足够静音,同时又足够响亮以防止检测到静音。请参阅 PipeWire 文档

使用 pipewire-media-session

通过编辑 /etc/pipewire/media-session.d/*-monitor.conf 来禁用此功能,具体取决于延迟发生的位置,并将属性 session.suspend-timeout-seconds 更改为 0 以禁用,或尝试其他值并查看哪些值有效。

或者,您可以注释掉 /etc/pipewire/media-session.d/media-session.conf 中的 suspend-node 行。

重启 pipewire.servicepipewire-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
      }
    }
  }
]

使用 pipewire-media-session

/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)的高延迟

本文或本节需要扩充。

原因: 添加 wireplumber 说明。(在 Talk:PipeWire 中讨论)

更改采样率或格式可能有助于减少某些 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-dumpwpctl 找到识别信息。

对于 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"
      }
    }
  }
]

对于 pipewire-media-session

/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 等)期间没有声音

使用 Avahisystemd-resolved 设置 mDNS 主机名解析。

KDE Plasma 中不显示声音设备

PipeWire 客户端(包括桌面环境)可能依赖于 XDG_RUNTIME_DIR 环境变量 来连接到 PipeWire 守护进程。[10] 如果您在登录后立即遇到没有声音设备的情况,可能是因为此变量已手动设置为错误的路径。

虽然这可以通过手动重启 PipeWire 来解决,但仍然可能发生其他问题,例如无法在 Chromium 中共享屏幕(出现 pipewire context failed)。XDG_RUNTIME_DIRpam_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-gtkxdg-desktop-portal-kde 中的任何一个,请检查守护进程的运行状态。

在 OBS 中,如果一切正常,您应该在 stdout 中看到这个

...
info: [pipewire] desktop selected, setting up screencast
info: [pipewire] created stream 0x5632d7456850
info: [pipewire] playing stream…

对于多显示器设置,slurp 软件包将允许捕获所有屏幕。

另请参阅