跳转至内容

PipeWire

来自 ArchWiki

PipeWire 是一个新的底层多媒体框架。它的目标是提供低延迟的音频和视频捕获及播放,并支持 PulseAudioJACKALSA 和基于 GStreamer 的应用程序。

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

PipeWire 还支持 Flatpak 等容器,并且不依赖于 audiovideo 用户组。相反,它使用类似 Polkit 的安全模型,请求 Flatpak 或 Wayland 录制屏幕或音频的权限。

安装

安装 官方仓库中的 pipewire 包。对于 multilib 支持,还有 lib32-pipewire

可选地,安装 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 已弃用,不再推荐使用。它主要用于测试和作为构建新会话管理器的示例。

启动

Pipewire uses systemd/User 来管理服务器和自动的 socket 激活:它会在需要时自动启动。

为了在登录时预先启动 PipeWire,请 启用/启动 pipewire.servicepipewire-pulse.servicewireplumber.service 用户单元

GUI

  • Cable — 一个 PyQt 应用程序,用于在运行时动态修改 PipeWire 和 WirePlumber 设置。
https://github.com/magillos/Cable || cableAUR
  • coppwr — PipeWire 的底层控制和诊断 GUI。
https://github.com/dimtpap/coppwr || coppwrAUR
  • Helvum — 基于 GTK 的 PipeWire 接线板,灵感来自 JACK 工具 catia。不保存线集。
https://gitlab.freedesktop.org/pipewire/helvum || helvum
  • pwvucontrol — Pipewire 音量控制。pavucontrol 的替代品。
https://github.com/saivert/pwvucontrol || pwvucontrolAUR
  • qpwgraph — 基于 Qt 的 PipeWire 图/接线板,灵感来自 JACK 工具 QjackCtl。保存线集。
https://gitlab.freedesktop.org/rncbc/qpwgraph || qpwgraph
  • sonusmix — Pipewire 音频路由工具
https://codeberg.org/sonusmix/sonusmix || sonusmixAUR

TUI

  • pipemixer — 使用 ncurses 构建的 pipewire 的 TUI 音量控制应用程序。
https://github.com/heather7283/pipemixer || pipemixerAUR
  • wiremix — PipeWire 的简单 TUI 音频混音器。
https://github.com/tsowell/wiremix || wiremix

配置

PipeWire 包在 /usr/share/pipewire 中提供了初始的 配置文件 集。您不应直接编辑这些文件,因为包更新会覆盖您的更改。要配置 PipeWire,您可以将文件从 /usr/share/pipewire 复制到替代的系统范围位置 /etc/pipewire,或复制到用户位置 ~/.config/pipewire。具有更高优先级的目录中同名文件会使类似的文件被忽略。

PipeWire 除了 PulseAudio 配置文件外,还提供了一个自定义的 Pro Audio(请勿与 pro audio 混淆)配置文件,可通过 pavucontrol 选择。

用法

音频

PipeWire 可以用作音频服务器,类似于 PulseAudio 和 JACK。它的目标是通过提供与 PulseAudio 兼容的服务器实现和面向 JACK 客户端的 ABI 兼容库来取代 PulseAudio 和 JACK。有关更多信息,请参阅博文 PipeWire Late Summer Update 2020

首先,安装 pipewire-audio。根据音频客户端的类型,您可能还需要采取一些额外的步骤。您可能需要为您的音频设备安装额外的固件,请参阅 Advanced Linux Sound Architecture#Firmware

ALSA 客户端

安装 pipewire-alsa(如果已安装,则删除 pulseaudio-alsa),以便将所有使用 ALSA API 的应用程序通过 PipeWire 进行路由。

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} 指定*接收器*,使用*默认接收器:*(上方)或*名称:*(下方)、默认接收器设备(@DEFAULT_SINK@)或*接收器 #*(例如,下方*1*)值

$ pactl list sinks | grep -B1 -A9 State:
Sink #1
        State: RUNNING
        Name: alsa_output.pci-0000_2d_00.4.analog-surround-51
...
        Driver: PipeWire
...
        Mute: no
        Volume: front-left: 65536 / 100% / 0.00 dB,   front-right: 65536 / 100% / 0.00 dB,   rear-left: 65536 / 100% / 0.00 dB,   rear-right: 65536 / 100% / 0.00 dB,   front-center: 65536 / 100% / 0.00 dB,   lfe: 65536 / 100% / 0.00 dB
                balance 0.00

提示:如果音频正在播放,请使用 grep(1) 查找 RUNNING,因为其他设备将是 SUSPENDED

平衡比率会自动计算。要设置默认设备的整体音量,请使用

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_REMOTEPIPEWIRE_DEBUGPIPEWIRE_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 1
fi

rm -- "$1" &> /dev/null

link_nodeOutput=''

while IFS= read -r line; do
    if [[ "$line" =~ [|] ]];
    then
        link_nodeInput=`echo $line | cut -d ">" -f 2`
        echo "Saving $link_nodeOutput, ${link_nodeInput//' '}"
        echo "$link_nodeOutput ${link_nodeInput//' '}" >> "$1"
    else
        link_nodeOutput="$line"
    fi
done < <(pw-link -lo)
pw-loadwires
#!/bin/bash

if [[ "$#" -ne 1 ]]; then
    echo
    echo 'usage: pw-loadwires filename'
    echo
    exit 1
fi

while IFS= read -r line; do
    echo "Connecting $line"
    pw-link $line
done < <(cat -- "$1")
pw-dewire
#!/bin/bash

link_nodeOutput=''

while IFS= read -r line; do
    if [[ "$line" =~ [|] ]];
    then
        link_nodeInput=`echo $line | cut -d ">" -f 2`
        echo "Removing $link_nodeOutput, ${link_nodeInput//' '}"
        pw-link -d $link_nodeOutput ${link_nodeInput//' '}
    else
        link_nodeOutput="$line"
    fi
done < <(pw-link -lo)

与网络上的计算机共享音频设备

PipeWire 支持使用多种机制通过网络共享音频,包括

PipeWire wiki 包含一个 概述和比较页面,介绍不同的网络协议。

下面将介绍 Pulse Tunnel 方法。PipeWire 的 PulseAudio 实现支持 网络流式传输。在网络上共享音频的一种简单方法是使用 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-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 文档

注意 这对于使用最新树莓派操作系统版本的树莓派 DAC 效果非常好。

在发送方/客户端上

~/.config/pipewire/pipewire.conf.d/roc-sink.conf
context.modules = [
  { name = libpipewire-module-roc-sink
    args = {
        fec.code = default
        remote.ip = <IP address of host>
        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 读取的接收器(sink)的显示名称,而 node.name 则由 pactl 读取。建议同时设置两者。

在两台机器上 重启 pipewire.service 用户单元

在原生 JACK 上运行 PipeWire

如果需要,PipeWire 还可以作为 JACK 客户端在原生 JACK 守护进程之上运行。

有关更多信息和附加配置(例如可用通道),请参阅 JACK and PipeWire (PipeWire wiki)JACK Bridge (PipeWire wiki)

要使用它,请安装 pipewire-jack-client 并启动 JACK。Pipewire 应该会自动桥接。

注意 自从 pipewire 0.3.81 起,jackdbus 模块会自动加载,不再需要手动加载。

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

使用 ALSA dmix 设备作为 PipeWire 接收器

可以将 PipeWire 服务器(或多个,每个用户一个)输出到 ALSA,通过 ALSA dmix 设备。这使您能够使用 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/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 配置以侦听 localhost TCP 连接。

在外部用户的家庭目录下创建类似的文件

~/.config/pipewire/pipewire-pulse.conf.d/pulse-server.conf
pulse.properties = {
    server.address = [
        "unix:native"
        "tcp:127.0.0.1:4713"   # Now the outer user's pipewire server listens on the IP4 loopback
    ]
}

然后在内部用户的会话中设置环境变量 PULSE_SERVER=tcp:127.0.0.1:4713。例如,在内部用户启动 Xephyr 之前 export 它。有关更多信息和替代设置,请参阅 此论坛主题

WebRTC 屏幕共享

大多数应用程序过去都依赖 X11 来捕获桌面(或单个应用程序),例如在网页浏览器中使用 WebRTC(例如 Google Meet)时。在 Wayland 上,屏幕共享机制通过 XDG Desktop Portal 和 PipeWire 处理,这使得在 Wayland 下以细粒度的访问控制共享内容成为可能。

提示 使用 Mozilla 的 GetUserMedia WebRTC 测试页面 来测试 WebRTC 屏幕共享是否正常工作。
注意 xdg-desktop-portal 1.10.0 修复了规范与其 D-Bus 接口实现之间的不匹配。 [2] 因此,某些客户端可能无法与 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。因此,像 cheeseAUR 这样的应用程序已经能够使用它共享视频输入。

使用 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 插件和通道混合。

LADSPA

您可以从官方仓库安装许多 LADSPA 插件,并在 Pipewire 过滤器链中使用它们。要列出特定文件提供的插件标签和可用控件,请使用 ladspa 包中的 analyseplugin

$ analyseplugin /usr/lib/ladspa/lsp-plugins-ladspa.so

系统范围的参数化均衡

PipeWire filter-chain 支持参数化均衡 [3]。在 /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
            }
        }
    }
]

您可以使用任意数量的过滤器。

如果您需要前置放大器,请在频率 0 处应用 bq_highshelf 过滤器,例如

{ type = bq_highshelf, freq = 0, gain = -5.0, q = 1.0 },

重启 Pipewire,选择“Equalizer Sink”作为您的默认声音输出设备;这将应用于所有应用程序。

或者,您可以使用 filename 属性代替指定 filters 数组,该属性指向从 AutoEQ 项目或 Squiglink 生成的参数化均衡配置文件,例如

config = {
    filename = "/path/to/parametric.txt"
}

EasyEffects

EasyEffects(前身为 PulseEffects)是一个 Qt 工具,为单个应用程序输出流和麦克风输入流提供大量的音频效果和滤波器。显著的效果包括输入/输出均衡器、输出响度均衡和低音增强、输入去齿音和降噪插件。有关完整的效果列表,请参阅 其 GitHub 页面

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

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

注意 EasyEffects 启动后可能会崩溃,并抛出 GTK 错误,请参阅 GitHub issue 以获取解决方法。

NoiseTorch

NoiseTorch 是另一种降噪方式,打包在 noisetorchAUR 中。还有 noisetorch-gitAUR

启动后,可以为选定的麦克风加载模块。可以调整语音激活阈值,该阈值应设置为最高级别,以不滤除任何实际语音。

您可以使用 systemd 自动启动音频处理,请参阅 [4]。请注意,如果从 AUR 安装,noisetorch 二进制文件的路径会不同。

语音降噪

安装 noise-suppression-for-voice 包,用于适应 ladspa 滤波器链的 librnoise,以及 swh-plugins 包,用于门限。

GitHub 上给出的说明大部分可用但已过时。在 pipewire 1.6.3 中,滤镜链模块已改为在预定义位置搜索插件,更改了插件格式

注意 如果遵循上述说明,并且自 PipeWire 1.4.10 以来,您可能需要指定您的音频输入是单声道。您可以通过将以下 2 行添加到配置文件的 capture.propsplayback.props 部分的末尾来完成此操作。
~/.config/pipewire/pipewire.conf.d/99-input-denoising.conf
audio.channels = 1
audio.position = [ MONO ]

JamesDSP

JamesDSP for Linux (可用作 jamesdspAUR) 为 PipeWire 和 PulseAudio 提供开源音效。它使用自己的效果引擎,并且不依赖于 LADSPA、Calf 等。JamesDSP 最初是作为 Android 设备的音频效果处理器发布的。

使用 LADSPA, LV2 和 VST 插件

如果您想在可用的 LADSPA、LV2 和 VST 插件的完整列表中进行选择,可以使用 carlapipewire-jack 来应用它们。

启动 Carla 并转到“设置”>“配置 Carla”>“引擎”。确保“音频驱动程序”设置为“JACK”,并根据您的需求选择一个处理模式。您也可以通过运行带有特定命令的 Carla 来选择处理模式,例如,对于“连续机架”模式,使用 carla-rack

您可以手动连接应用程序输出到 Carla,但如果您想让多个应用程序通过 Carla,最好在应用程序和 Carla 之间创建一个虚拟设备,并可选择将其用作默认设备。首先,创建一个名为 default_null_sink 的新 null sink。

/etc/pipewire/pipewire.conf.d/10-default-null-sink.conf (or ~/.config/pipewire/pipewire.conf.d/10-default-null-sink.conf)
context.objects = [
  {
    factory = adapter
    args = {
      factory.name = support.null-audio-sink
      node.name = "default_null_sink"
      media.class = Audio/Sink
      audio.position = [ FL FR ]
      monitor.channel-volumes = true
      monitor.passthrough = true
    }
  }
]

重新启动 PipeWire 以应用更改。

或者,您可以使用 pw-cli(1) 创建一个临时的虚拟设备,或者,如果安装了 pipewire-pulse,则使用 pactl(1)。有关详细信息,请参阅 PipeWire wiki

在“机架”选项卡中,添加您想要的任何插件。确保它们是“立体声”类型。您可以更改它们的顺序。在“连续机架”处理模式下,列表顶部的插件将是第一个接收音频流的插件,就像在 EasyEffects 中一样。之后,转到“补丁面板”选项卡,并将 default_null_sink 的 L/R 监视器连接到 Carla 输入,然后将 Carla 输出连接到您所需的设备(扬声器、耳机、HDMI 等)的播放设备。将配置保存到本地文件,例如 ~/Documents/carla_sink_effects.carxp。Carla 打开此文件后将自动恢复连接。

在多媒体应用程序正在播放音频时(例如,通过 Firefox 在网站上观看视频),您可以测试效果。有两种方法可以做到这一点。第一种方法是在 Carla 的“补丁面板”选项卡中,断开所有 Firefox 连接,然后将其 L/R 输出链接到 default_null_sink 的播放设备。第二种方法是通过 pavucontrol,找到 Firefox 音频流并将其重定向到 default_null_sink(这应该会记住连接,以便在下次启动时自动将应用程序重定向到同一个 sink)。

要使用“连续机架”处理模式运行 Carla 并在启动时加载保存的文件,请创建 systemd 用户服务

~/.config/systemd/user/jack-carla-rack.service
[Unit]
Description=Load Carla Rack JACK host

[Service]
Environment=PIPEWIRE_LINK_PASSIVE=true
Type=exec
ExecStart=/usr/bin/carla-rack --no-gui %h/Documents/carla_sink_effects.carxp

[Install]
WantedBy=default.target

然后 启用 jack-carla-rack.service 用户单元

请注意,如果您将 default_null_sink 设置为系统设置中的默认设备,所有应用程序都将被重定向到它,音量键将更改其级别,而不是扬声器的级别。如果您想控制扬声器音量,请在系统设置中将其保留为默认设置,并在 pavucontrol 中将您想要的应用程序重定向到 default_null_sink(Pipewire 兼容层将记住连接,以便在同一应用程序的下一个实例上自动重定向)。

故障排除

本文档或该部分可能与 PipeWire/Troubleshooting 合并。

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

音频

PipeWire 未检测到麦克风

如果您使用的是笔记本电脑的内置麦克风,或通过耳机插孔连接:首先确保所使用的配置文件中已启用模拟输入。您可以在 pavucontrol 中(也可能在您的桌面环境声音设置中)检查配置文件。在 pavucontrol 的“配置”选项卡下,“内置音频”(或类似项)中,确保选中了“模拟立体声双工”。如果您使用高级声音设置(例如 5.1 或通过 HDMI 的声音),请确保选择了包含“+ 模拟立体声输入”的配置文件。

PipeWire 的 alsa-monitor 模块默认使用 alsa-card-profiles 来检测设备。如果这不适用于您,请尝试在 wireplumber 中关闭 api.alsa.use-acp,或选择性地打开 api.alsa.use-ucm

/etc/wireplumber/wireplumber.conf.d/alsa-config.conf (or ~/.config/wireplumber/wireplumber.conf.d/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 并检查可用设备。

本文或本章节已过时。

原因:最近版本的 pw-record 不再提供 --list-targets 选项;要列出对象,请使用 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 issue 中提出的一个替代解决方案是手动添加麦克风。首先,确保麦克风被 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" }
]

然后使用 重启 pipewire-pulse.servicesystemctl --user,并检查 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 没有声音,但网页浏览器和 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 桌面扬声器测试和网页浏览器“YouTube”产生有效的声音结果。

在 GNOME 中切换输入、静音、取消静音、更改音量无法解决问题。

pactl list sinks 报告的 Sink 状态为“SUSPENDED”无关紧要,因为当通过网页浏览器播放视频时,状态会正确更改。

使用 pactl info 未发现明显问题。

检查相关的 systemd 单元日志未发现明显问题。

问题原因

似乎从 pipewire 到硬件的路径被静音或以某种方式更改了。原始作者不知道如何使用命令行工具识别和指出问题。

解决方案

安装 pavucontrol 包。运行 pavucontrol,在“配置”选项卡中选择适当的源,然后在“输出设备”选项卡中再次选择它,然后在 mpv --ao=pipewire test.mp4 视频运行时使用静音按钮静音和取消静音源。

在另一种情况下,删除 ~/.local/state/wireplumber/ 并重新启动解决了相同的问题。

低音量

用 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,请在 /etc/security/limits.d/username.conf 中添加

username	soft	memlock	64
username	hard	memlock	128

/etc/security/limits.d/username.conf

更改默认采样率

默认情况下,PipeWire 设置固定的全局采样率 48kHz。如果您需要更改它,可以设置一个新的默认值(尽管不推荐)。

/etc/pipewire/pipewire.conf (or ~/.config/pipewire/pipewire.conf)
...
context.properties = {
    ...
    default.clock.rate          = sample_rate
    ...

但是,这不被推荐,因为它会影响延迟,因为量化值不会自动重新计算。如果您想保持相同的比例,则必须自己更改它们。引用文档

默认时钟速率决定了最小/最大/默认量化的实时持续时间。更改默认时钟速率时,您可能需要更改量化值以保持量化的相同持续时间。

请记住,流的速率将保持不变。PipeWire 在这里所做的只是重新采样以满足您的新速率。因此,本应保持不变的 48kHz 流现在将被重新采样。

如果您拥有能够处理不同采样率的设备,则更推荐保留默认设置并按照此处所示进行操作: #Changing the allowed sample rate(s)

更改允许的采样率

PipeWire 还可以动态更改 DAC 支持的输出采样率。采样率遵循正在播放的音频流的采样率。

/etc/pipewire/pipewire.conf (or ~/.config/pipewire/pipewire.conf)
...
context.properties = {
    ...
    default.clock.allowed-rates = [ sample_rate_1 sample_rate_2 sample_rate_3 ... ]
    ...

例如,[ 44100 88200 176400 48000 96000 192000 ]

假设默认采样率为 48000,这是默认值。通常,如果一个流以 44100Hz 输出音频(例如,音乐播放器以 CD 质量播放歌曲),Pipewire 将流重新采样到 48kHz。但是,如果您在此列表中包含 44100,Pipewire 将执行以下操作:Pipewire 将看到流的频率为 44100Hz,然后检查 44100 是否在允许的速率中,并且接收的输出设备(即 DAC)是否支持该速率。在这种情况下,DAC 将无损播放歌曲。 如果速率不在列表中或 DAC 不支持该速率,PipeWire 将简单地回退到将流重新采样到默认采样率。

根据开发人员的说法:“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

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

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

音质

无损

PipeWire 可以轻松配置无损输出(无重新采样)。您只需要进行以下设置,这已在此处描述: #Changing the allowed sample rate(s)。有关更多背景信息,请阅读该部分。这些是您会遇到的行业标准速率,即 CD 质量系列(44100Hz、88200Hz、176400Hz)和 DVD 质量系列(48kHz、96kHz、192kHz)。大多数音频流将采用其中一种速率。只要您选择的播放器是主流,并且您的 DAC 支持该速率,PipeWire 就会使用它。确保您的播放器是唯一正在播放的流,否则可能会发生重新采样,因为所有其他内容都将被重新采样以匹配主图的采样率。

/etc/pipewire/pipewire.conf (or ~/.config/pipewire/pipewire.conf)
...
context.properties = {
    ...
    default.clock.allowed-rates = [ 44100 88200 176400 48000 96000 192000 ]
    ...
重采样

如果您使用 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 倍。4、10、14 之间的延迟差异仍有待任何人调查。在 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 显示失败:连接被拒绝

这意味着应用程序无法连接到 PipeWire-Pulse 服务,请检查 pipewire-pulse.service 用户单元是否正在运行。

如果这不能解决问题,请运行 strace -f -o /tmp/pipe.txt pactl info 并在寻求帮助时粘贴 /tmp/pipe.txt 的内容到 pastebin,例如在 IRC(OFTC 上的 #pipewire)或邮件列表中。

蓝牙音频质量低

如果蓝牙播放断断续续,请检查 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.codec 设置为 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/bluez-config.conf (or ~/.config/wireplumber/wireplumber.conf.d/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/disable-suspension.conf (or ~/.config/wireplumber/wireplumber.conf.d/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 以应用更改。

除了完全禁用暂停外,您还可以将超时值更改为源暂停前所需的延迟秒数。

某些设备会自己检测静音和暂停。对它们而言,仅禁用节点暂停将不起作用。可以通过添加少量噪声来解决它们,使输出永远不会完全静音。

.../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/alsa-config.conf (or ~/.config/wireplumber/wireplumber.conf.d/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”选项。
  • 遵循#Changing the default sample rate,将采样率降低到 44100 (44.1 kHz)。

待机后出现音频问题

如果在从睡眠中唤醒机器后声音丢失或有其他杂音,重新初始化 ALSA 可能会有帮助。

# alsactl init

USB DAC(例如 Schiit DACs)的高延迟

更改采样率或格式可能有助于降低某些 DAC(如 Schiit Hel 2)的延迟。[5]

对于 pipewire-media-session

将默认配置文件 /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
...

对于 wireplumber

/etc/wireplumber/wireplumber.conf.d/update-rate-and-format.conf (or ~/.config/wireplumber/wireplumber.conf.d/update-rate-and-format.conf)
monitor.alsa.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 在达到一定音量级别前没有声音输出[6]。通常,这在 15% 到 30% 之间,这可能导致初始音量过大且无法维持低音量。解决方法是通过为设备设置 api.alsa.soft-mixertrue 来忽略硬件混音器音量控制。

要使用 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.name-of-device"
      }
    ]
    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
      }
    }
  }
]

请参阅 WirePlumber#获取用于规则匹配的接口名称 以找到替换 "alsa_card.name-of-device" 的正确值。

或者,您可以指定 "~alsa_card.*" 将规则应用于所有音频设备。

然后,重启 pipewire,例如通过运行 systemctl --user restart pipewire。在 alsamixer 中设置主音量,然后以 root 身份运行 alsactl store 来保存设置。您现在应该可以正常使用音量混音器了。

实时音频不起作用

如果在 pipewire.service 用户单元状态中看到 RTKit error: org.freedesktop.DBus.Error.AccessDenied,则意味着 pipewire 守护进程的优先级未更改为实时。有关此问题,请参阅 [7]

同时输出到同一声卡上的多个 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/alsa-custom.conf (or ~/.config/wireplumber/wireplumber.conf.d/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
            }
        }
    }
...

PipeWire 下 FMOD 游戏崩溃

一些使用旧版本 FMOD 音频引擎的游戏,例如 Pillars of Eternity,会调用 pulseaudio --check 并在 PulseAudio 二进制文件不存在时崩溃。一种解决方法是将 /bin/pulseaudio 符号链接到 /bin/true[8]

# ln -s /bin/true /bin/pulseaudio

请注意,如果您想重新安装 PulseAudio,则需要删除该符号链接。

自动切换不起作用

如果自动切换不起作用,这可能是 WirePlumber 状态的问题。正如此评论所建议的那样,您可以删除 WirePlumber 的本地状态并重新启动守护进程,看看是否有帮助。

$ rm -r ~/.local/state/wireplumber/

然后 重启 wireplumber.service 用户单元

挂起后,在负载下缺少实时优先级/噼啪声

由于 rtkit 中2011 年的 bug,挂起事件会导致 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 守护进程。[9] 如果在登录后立即遇到没有声音设备的问题,可能是因为此变量被手动设置为错误的路径。

虽然可以通过手动重启 PipeWire 来解决此问题,但仍可能出现其他问题,例如在 Chromium 中无法共享屏幕(出现 pipewire context failed)。XDG_RUNTIME_DIRpam_systemd(8) 自动设置,因此您应该删除初始化文件中设置它的所有实例。

SDDM 和 LightDM 用户登录时设备音量未恢复

如果您使用 SDDMLightDM,并且发现登录后音频音量未正确恢复,请为显示管理器用户屏蔽 PipeWire,因为显示管理器下的 WirePlumber 可能会干扰您用户的 WirePlumber 会话。

# systemctl --user -M user@ mask pipewire.socket

user 替换为 SDDM 的 sddm 或 LightDM 的 lightdm

有关更多详细信息,请参阅这篇 Debian Wiki 文章

终端响铃不起作用

从 PipeWire 的角度来看,必须加载 x11.bell 模块。这应该是配置的默认值(另请参阅上面提到的配置文件)。检查您是否已安装 pipewire-x11-bell 包。此外,您的窗口管理器可能会影响终端响铃,例如,对于 xfwm,请在 xfwm-terminal 设置中检查“Audible bell”是否已激活。现在,重启 pipewire 服务。

$ systemctl --user restart pipewire

您可以使用以下命令尝试终端响铃是否有效:

$ echo $'\a'

第一次播放尝试后没有声音

当 PipeWire 使用套接字激活启动时,一些 PipeWire 原生应用程序可能会尝试在 WirePlumber 配置节点之前播放音频,从而导致错误,例如。

$ mpv -v /path/to/file
[ao/pipewire] PipeWire does not have any audio sinks, skipping
[ao] Failed to initialize audio driver 'pipewire'
$ journalctl --user -u mpd.service
output: Failed to play on "PipeWire" (pipewire): no target node available
exception: Failed to open audio output

作为一种变通方法,您可以 启用 pipewire.service 用户单元

XiiSound / 骇维 (HAVIT) 伏羲H3 (040b:0897)

这款 USB 耳机在 PipeWire 和 WirePlumber 上有一些怪异行为

  • 音频仅在 100% 音量下工作 — 硬件音量范围过窄(0.00dB 至 0.39dB),PipeWire 的 dB 映射将任何较低音量折叠为静音。
  • 左声道静音 — 该设备为左声道暴露了一个次级 ALSA 混音器控制(PCM,1,numid=10),WirePlumber 未对其进行初始化,使其保持 0%。
  • 麦克风初始化为静音 — WirePlumber 可能会在启用静音的情况下启动捕获源。

修复 1 — 强制使用软件混音器

创建 ~/.config/wireplumber/wireplumber.conf.d/51-fuxi-h3-fix.conf

monitor.alsa.rules = [
  {
    matches = [
      {
        device.name = "alsa_card.usb-XiiSound_Technology_Corporation_Fuxi-H3-00"
      }
    ]
    actions = {
      update-props = {
        api.alsa.soft-mixer = true
        api.alsa.ignore-dB = true
        api.alsa.split-enable = false
      }
    }
  }
]

重启 WirePlumber

$ systemctl --user restart wireplumber

修复 2 — 恢复左声道

$ amixer -c 0 cset numid=10 100

修复 3 — 取消麦克风静音

$ pactl set-source-mute alsa_input.usb-XiiSound_Technology_Corporation_Fuxi-H3-00.mono-fallback 0

重启后仍然生效

# alsactl store 0

因电源管理导致的爆音

爆音可能是由于 wikipedia:HECI 控制器被电源管理所致。运行时 PM 可以通过 powertop 禁用。

视频

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 包可以捕获所有屏幕。

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.