PipeWire

出自 Arch Linux 中文维基

PipeWire 是一個新的底層多媒體框架。 它旨在以最低的延遲為音頻和視頻提供錄製和播放功能,並支持基於 PulseAudioJACKALSAGStreamer 的應用程式。

基於該框架的守護進程可以配置為音頻伺服器(具有 PulseAudio 和 JACK 特性)和視頻錄製伺服器。

PipeWire 還支持像 Flatpak 這樣的容器,不依賴於 audiovideo 用戶組。 相反,它採用了類似於 Polkit的安全模式,向 Flatpak 或 Wayland 請求許可以錄製屏幕或音頻。

安裝[編輯 | 編輯原始碼]

可以從官方軟體庫安裝 pipewire 程序。 也有lib32-pipewire 的32位庫對於 multilib 進行支持

Pipewire 使用 systemd/用戶 管理伺服器並自動激活socket。

可以選擇安裝 pipewire-docs 來查看文檔。

Pipewire 可以作為其他音頻伺服器的直接替代品。參見 #Audio 詳細信息。

這篇文章的某些內容需要擴充。

原因: Describe what gst-plugin-pipewire does exactly. (在 Talk:PipeWire 中討論)

會話(Session)管理[編輯 | 編輯原始碼]

JACK一樣,PipeWire 內部沒有實現連接邏輯。 監視新 streams 並將其連接到適當的輸出設備或應用程式的負擔留給稱為會話管理器的外部組件。

目前,唯一推薦的會話管理器是:

  • WirePlumber — 一個當前比較推薦的更強大的管理器。它基於模塊化設計,使用 Lua 插件實現實際的管理功能。
https://pipewire.pages.freedesktop.org/wireplumber/ || wireplumber

以下會話管理器已被棄用,取而代之的是 WirePlumber:

  • PipeWire Media Session — 一個非常簡單的會話管理器,可以滿足一些基本的桌面用例。它主要是為了測試和作為構建新會話管理器的示例而實現的。
https://gitlab.freedesktop.org/pipewire/media-session || pipewire-media-session

在安裝 PipeWire 時,您將被要求在其中之一進行選擇。只需安裝適當的軟體包即可在會話管理器之間切換,這將與其他選項發生衝突並替換其他選項。

GUI圖形界面[編輯 | 編輯原始碼]

  • Helvum — 基於GTK patchbay for PipeWire, 靈感來自JACK工具catia.
https://gitlab.freedesktop.org/pipewire/helvum || helvum
  • qpwgraph — 基於Qt的Graph/Patchbay for PipeWire,靈感來自JACK工具 QjackCtl.
https://gitlab.freedesktop.org/rncbc/qpwgraph || qpwgraph

配置[編輯 | 編輯原始碼]

PipeWire 軟體包在 /usr/share/pipewire 中提供了一組初始配置文件。不應直接編輯這些文件,因為包更新將覆蓋所做的更改。要配置 PipeWire,可以將文件從 /usr/share/pipewire 複製到備用系統配置目錄位置 /etc/pipewire或用戶目錄 ~/.config/pipewire。具有較高優先級的目錄中的同名文件會使類似文件被忽略。 [1]

Profiles[編輯 | 編輯原始碼]

Pipewire 帶來了一個PulseAudio 配置以外的自定義的 "Pro Audio" 配置文件, 可通過 pavucontrol進行選擇。其效果如下所述:https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/FAQ#what-is-the-pro-audio-profile

用法[編輯 | 編輯原始碼]

聲音[編輯 | 編輯原始碼]

這篇文章的某些內容需要擴充。

原因: 如果未配置/安裝以下任何內容並且應用程式直接將音頻發送到 pipelinewire,會發生什麼情況? pipewire 軟體包包含許多與音頻相關的文件,例如 /etc/alsa/conf.d/50-pipewire.conf. (在 Talk:PipeWire 中討論)

PipeWire 可以用作音頻伺服器,類似於 PulseAudio 和 JACK,它旨在通過為JACK客戶端提供PulseAudio兼容的伺服器實現和ABI兼容庫來取代PulseAudio和JACK。有關詳細信息,請參閱博客文章PipeWire Late Summer Update 2020

首先,安裝 pipewire-audio。然後根據音頻客戶端的類型,可能還需要執行一些額外的步驟。

ALSA 客戶端[編輯 | 編輯原始碼]

安裝 pipewire-alsa (如果安裝了pulseaudio-alsa需要刪掉它) 以使用 ALSA API 通過 PipeWire 路由所有應用程式。

PulseAudio 客戶端[編輯 | 編輯原始碼]

安裝 pipewire-pulse。它將代替 pulseaudiopulseaudio-bluetooth。重新啟動、重新登錄或 start pipewire-pulse.service user unit 以查看效果。

通常,不需要進一步的操作,應用應作為用戶服務自動啟用pipewire-pulse.socket。要檢查替換是否正常工作,請運行以下命令並查看輸出:

$ pactl info
...
Server Name: PulseAudio (on PipeWire 0.3.32)
...

對於進一步的配置(例如關於模塊),請查看官方上游 Wiki Migration from PulseAudioConfiguration of Pipewire-Pulse

JACK 客戶端[編輯 | 編輯原始碼]

安裝 pipewire-jack 以獲取 JACK 支持。還有 lib32-pipewire-jack 用於 multilib 支持。

pw-jack(1) 可以用來啟動 JACK 客戶端, 但從技術上講它不是必需的, 因為它只用作 PIPEWIRE_REMOTEPIPEWIRE_DEBUGPIPEWIRE_LATENCY 環境變量的包裝器。

可以通過設置 緩衝區大小/採樣率 的商(等於以秒為單位的塊延遲)來請求自定義緩衝區大小:

PIPEWIRE_LATENCY="128/48000" application

藍牙設備[編輯 | 編輯原始碼]

如果安裝了 pipewire-pulse 軟體包,PipeWire 將自動處理藍牙音頻設備。 該軟體包包含 /etc/pipewire/media-session.d/with-pulseaudio 文件,該文件的存在會提示媒體會話守護程序啟用 bluez5 模塊

自動化 profile 切換[編輯 | 編輯原始碼]

pipewire-media-sessionWirePlumber 都可以在檢測到輸入流時自動在 HSP/HFP 和 A2DP 配置文件之間切換。

WirePlumber 默認啟用了配置文件自動切換。每當檢測到輸入流時,它可以自動在 HSP/HFP 和 A2DP 配置文件之間切換。可以使用以下命令禁用它:

/etc/wireplumber/policy.lua.d/11-bluetooth-policy.lua (or ~/.config/wireplumber/policy.lua.d/11-bluetooth-policy.lua)
bluetooth_policy.policy["media-role.use-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 本身不是網絡透明的,但其pulse實現支持 網絡串流。在網絡上的計算機之間共享音頻的一種簡單方法是使用 Avahi 守護程序進行發現。要啟用此功能,請安裝 pipewire-zeroconf 軟體包。

確保所有要共享聲音的計算機上的 avahi-daemon.service 正在運行(如果使用 firewall,則要保證 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

還可以通過創建專用配置文件自動加載模塊:

本文或本章節的語言、語法或風格需要改進。參考:Help:Style

原因:使用context.modules 而不是像下面這樣的 context.exec。(在Talk:PipeWire討論)
/etc/pipewire/pipewire-pulse.conf.d/50-network-party.conf
context.exec = [
    { path = "pactl" args = "load-module module-native-protocol-tcp" }
    { path = "pactl" args = "load-module module-zeroconf-discover" }
    { path = "pactl" args = "load-module module-zeroconf-publish" }
]
將音頻串流到 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。

在本地 JACK 上運行 PipeWire[編輯 | 編輯原始碼]

如果需要,PipeWire 也可以作為 JACK 客戶端在本機 JACK 守護程序之上運行。

請參閱 JACK 和 PipeWire (PipeWire wiki)-JACK#jack-bridge JACK 橋(PipeWire wiki) 了解更多信息和附加配置(例如可用通道)。

要使用它,請安裝 pipewire-jack-client 並啟動 JACK。Pipewire 應該會被自動橋接。

注意: 自從 pipewire 0.3.81版本 加載 jackdbus 模塊是自動完成的,而且不再是必須的。

它可以在啟動 jack 之前像 PulseAudio 模塊一樣手動加載(在pactl(1)解釋):pactl load-module module-jackdbus-detect

使用 ALSA dmix 設備作為 PipeWire 接收器[編輯 | 編輯原始碼]

可以通過 ALSA dmix devices 將 PipeWire 伺服器(或每個用戶多個)輸出到 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 設置[編輯 | 編輯原始碼]

這篇文章的某些內容需要擴充。

原因: 添加pipewire-media-session 指南。 (在 Talk:PipeWire 中討論)

首先,通過注釋掉 alsa_monitor.enable() 來阻止 wireplumber 監控和添加硬體 ALSA 設備:

/etc/wireplumber/main.lua.d/90-enable-all.lua (or ~/.config/wireplumber/main.lua.d/90-enable-all.lua)
...
-- Load devices
-- alsa_monitor.enable()
v4l2_monitor.enable()
libcamera_monitor.enable()
...

現在,配置 pipewire 以使用 dmix 設備。 默認配置文件(/usr/share/pipewire/pipewire.conf)包含一個 注釋掉了的示例,您可以將其用作模板。

將您自己的元素添加到 context.objects 數組中:

/etc/pipewire/pipewire.conf.d/alsa-dmix.conf (or ~/.config/pipewire/pipewire.conf.d/alsa-dmix.conf)
context.objects = [
    # We do not start with dmix, but with an input device.
    # Do not forget to add an input device.
    # On a friend's Laptop, I saw Zoom having a nervous
    # breakdown and endlessly crying because no input device
    # was configured! You have been warned.
    { factory = adapter
        args = {
            factory.name           = api.alsa.pcm.source
            node.name              = "alsa-mic-internal" # name of pulse device (mpv)
            node.description       = "Mic Internal" # name of pulse device (pavucontrol)
            media.class            = "Audio/Source"
            api.alsa.path          = "hw:PCH,0"
        }
    }
    # Okay, now we add our dmix PCMs
    { factory = adapter
        args = {
            factory.name           = api.alsa.pcm.sink # sink for dmix
            node.name              = "alsa-dmix-internal" # name of pulse device (mpv)
            node.description       = "PCM Internal" # name of pulse device (pavucontrol)
            media.class            = "Audio/Sink" # Sink for dmix
            api.alsa.path          = "dmix:PCH,0"
        }
    }

    { factory = adapter
        args = {
            factory.name           = api.alsa.pcm.sink # sink for dmix
            node.name              = "alsa-dmix-hdmi" # name of pulse device (mpv)
            node.description       = "PCM HDMI" # name of pulse device (pavucontrol)
            media.class            = "Audio/Sink" # Sink for dmix
            # remember this is a non-default dmix from /etc/asound.conf
            api.alsa.path          = "dmix:HDMI,9"
        }
    }
]

作為用戶(非 root),檢查 wpctl status 的輸出,並使用wpctl set-default ID根據您的喜好設置默認輸入(源)和輸出(接收器)設備。ID 是接收器/源名稱之前的數字。

現在,您可以全面測試您的配置。

在設備配置之間切換[編輯 | 編輯原始碼]

某些硬體音頻設備(例如 snd_hda_intel)的功能會有所不同,具體取決於設備運行的配置文件。對於 snd_hda_intel,HDMI 和模擬輸出有單獨的配置文件。

使用 WirePlumber 切換到 HDMI:

$ wpctl set-profile <device-ID> 3
$ wpctl status
...
├─ Sinks:
│  *   53. Built-in Audio Digital Stereo (HDMI) [vol: 1.00]
...

使用 WirePlumber 切換到模擬:

$ wpctl set-profile <device-ID> 1
$ wpctl status
...
├─ Sinks:
│  *   51. Built-in Audio Analog Stereo        [vol: 0.60]
...

WebRTC 屏幕共享[編輯 | 編輯原始碼]

大多數應用程式過去依賴 X11 來捕獲桌面(或單個應用程式),例如在網絡瀏覽器中使用 WebRTC 時(例如在 Google Hangouts 上)。在 Wayland 上,出於安全原因,共享機制的處理方式有所不同。PipeWire 可以通過細粒度的訪問控制在 Wayland 下共享內容。

提示:使用以下命令測試 WebRTC 屏幕共享是否正常工作Mozilla 的 GetUserMedia WebRTC 測試頁面.
注意: xdg-desktop-portal 1.10.0 修復了 D-Bus 接口的規範和實現之間的不匹配問題。[2] 因此,某些客戶端可能無法使用 xdg-desktop-portal 1.10.0 或更高版本。

這需要 xdg-desktop-portal 及其後端之一 被安裝。可用的後端有:

Firefox (84+) 默認支持此方法,而在 Chromium (73+) 上,需要通過設置啟用 WebRTC PipeWire 支持 URL chrome://flags/#enable-webrtc-pipewire-capturer 處的相應(實驗)標誌。

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

本文或本章節的事實準確性存在爭議。

原因: 自從 該pull request 被合併後,以下有關特定應用程式/窗口共享的注釋在xdg-desktop-portal-gtk上可能不再正確。另請參閱跟蹤此討論的情況:[3].(在 Talk:PipeWire 中討論)


請注意,唯一支持的功能是共享整個桌面,而不是特定的應用程式/窗口 -individual-windows[4]

xdg-desktop-portal-wlr[編輯 | 編輯原始碼]

為了使 xdg-desktop-portal-wlr 正常工作,必須在 [[Systemd/用戶] 中設置 XDG_CURRENT_DESKTOPWAYLAND_DISPLAY 環境變量#環境變量|systemd用戶會話]]。XDG_CURRENT_DESKTOP 必須設置為您的合成器的名稱,例如 XDG_CURRENT_DESKTOP=swayWAYLAND_DISPLAY 由合成器自動設置。將這些環境變量引入 systemd 用戶會話的推薦方法是在啟動合成器後運行 systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP,例如使用合成器配置文件。有關更多詳細信息,請參閱 [5][6]

提示:如果您有多個監視器,要選擇與 xdg-desktop-portal-wlr 共享監視器,請安裝 slurp 並添加以下配置(請參閱 xdg-desktop-portal-wlr(5) § 屏幕播放选项):
~/.config/xdg-desktop-portal-wlr/config
chooser_type = simple
chooser_cmd = slurp -f %o -ro

當請求共享屏幕時,slurp 會向您顯示十字光標,您需要單擊要共享的屏幕。選擇後,xdg-desktop-portal-wlr 將允許共享該屏幕。

視頻[編輯 | 編輯原始碼]

這篇文章的某些內容需要擴充。

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

全系統參數均衡[編輯 | 編輯原始碼]

將配置文件複製到您的 .config 文件夾:

$ mkdir -p ~/.config/pipewire/pipewire.conf.d
$ cp /usr/share/pipewire/filter-chain/sink-eq6.conf ~/.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

注意: 對於 PulseEffects 舊版本,請參閱 PulseAudio#PulseEffects.

NoiseTorch[編輯 | 編輯原始碼]

NoiseTorch 是一種噪聲抑制的替代方法,與 noisetorchAUR 打包在一起。另外還有-git版本noisetorch-gitAUR

啟動後,可以為所選麥克風加載模塊。可以調整語音激活閾值,應將其設置為最高級別,而不是過濾掉任何實際語音。

您可以使用 systemd 自動啟動音頻處理,請參閱 [7]。請注意,如果從 AUR 安裝,noisetorch 二進位路徑會有所不同。

語音噪聲抑制[編輯 | 編輯原始碼]

安裝 noise-suppression-for-voice 並進行下列操作之一:

  • context.exec 添加以下內容:
/etc/pipewire/pipewire.conf (or ~/.config/pipewire/pipewire.conf)
...
context.exec = [
    ...
    { path = "/usr/bin/pipewire" args = "-c /usr/share/pipewire/filter-chain/source-rnnoise.conf" }
    ...

然後將降噪後的音頻源作為音頻的默認選項。您可能需要先重啟應用才能使用新的音頻源。

JamesDSP[編輯 | 編輯原始碼]

JamesDSP for Linux (jamesdspAUR) 為 PipeWire 和 PulseAudio 提供開源的音效實現。JamesDSP 使用自己的效果引擎,不依賴 LADSPA 或是 Calf 之類的東西。起初它被用於安卓設備的音效處理。

LADSPA, LV2 和 VST 插件[編輯 | 編輯原始碼]

本文或本章節的事實準確性存在爭議。

原因: Does this section relate to using the pulseaudio daemon or the pipewire's interface for pulseaudio clients?(在 Talk:PipeWire 中討論)


您可以創建將 PulseAudio 連接到 Carla 音頻插件的輸入/輸出目標位置。

如果您想在所有可用的 LADSPA、LV2 和 VST 中選擇的話,可以使用自定義的 Pulseaudio null sink 和 Carla Jack 來應用這些插件。安裝 pipewire-pulsepipewire-jackcarla。首先,創建一個名為 default_null_sink 的 PulseAudio null sink。 .

pactl load-module module-null-sink object.linger=1 media.class=Audio/Sink sink_name=default_null_sink channel_map=FL,FR

從 Pipewire 啟動 Carla:pw-jack carla-rack。在 Rack(機架) 頁面添加您想使用的插件,確保它們的類型都是 stereo(立體聲)。您可以改變插件間的順序,處理順序由上至下(最上面的會最先接收到音頻流),就跟 EasyEffects 一樣。隨後,在 Patchbay(跳線槽) 頁面將 default_null_sink 的左右監聽(L/R monitor)連接到 Carla 的輸入,然後將 Carla 的輸出連接到回放設備(音響、耳機、HDMI...)。將配置文件保存到一個本地位置,比如 ~/Documents/carla_sink_effects.carxp

您可以在多媒體應用發聲的時候測試這些效果,比如用 Firefox 看視頻。有兩種測試方式。第一種:在 Carla 的 Patchbay,斷開 Firefox 的所有連線,然後把它的左右聲道輸出連接到 default_null_sink 的 playback。第二種:使用 pavucontrol 找到 Firefox 的音頻流,然後將其重定向到 default_null_sink(這應該會記住連接方式,在下次啟動的時候自動重定向)。

若想在啟動時應用這些設置,創建兩個 systemd 用戶服務:

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

[Service]
PassEnvironment="PIPEWIRE_LINK_PASSIVE=true"
Type=exec
ExecStart=/usr/bin/pw-jack carla-rack -n

[Install]
WantedBy=default.target
~/.config/systemd/user/pulseaudio-null-sink@.service
[Unit]
Description=Load %i Pulseaudio null sink
Before=jack-carla-rack.service
After=pipewire-pulse.service

[Service]
Type=oneshot
ExecStart=/usr/bin/pactl load-module module-null-sink object.linger=1 media.class=Audio/Sink sink_name=%i channel_map=FL,FR
ExecStop=/usr/bin/pactl unload-module module-null-sink
RemainAfterExit=yes

[Install]
WantedBy=default.target

然後覆蓋 jack-carla-rack 服務,並在 Environment 部分寫明 Carla 配置的完整路徑。

~/.config/systemd/user/jack-carla-rack.service.d/override.conf
[Service]
Environment="CARLA_CONFIG_FILE=/home/username/Documents/carla_sink_effects.carxp"
ExecStart=
ExecStart=/usr/bin/pw-jack carla-rack -n $CARLA_CONFIG_FILE

最後, 啟用 pulseaudio-null-sink@default_null_sink.servicejack-carla-rack.service 用戶單元

注意,如果你將 default_null_sink 設置為了系統默認設備,所有的應用聲音都會被重定向至它,並且音量鍵也會改變它的音量而不是回放設備的。如果想控制回放設備的音量,需要把回放設備設成默認設備,然後將所需應用在 pavucontrol 裡重定向到 default_null_sink(PipeWire兼容層應該會記住應用的連接關係)。

故障排除[編輯 | 編輯原始碼]

音頻[編輯 | 編輯原始碼]

PipeWire 檢測不到麥克風[編輯 | 編輯原始碼]

PipeWire 的 alsa-monitor 模塊默認使用 alsa-card-profiles 來檢測設備。如果在您的設備上沒有效果,可以試著關閉 api.alsa.use-acp,或是啟用 api.alsa.use-ucm

如果使用的是 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

/etc/wireplumber/main.lua.d/50-alsa-config.lua (or ~/.config/wireplumber/main.lua.d/50-alsa-config.lua)
...
alsa_monitor.rules = {
    {
        ...
        apply_properties = {
            -- Use ALSA-Card-Profile devices. They use UCM or the profile
            -- configuration to configure the device and mixer settings.
            -- ["api.alsa.use-acp"] = true,

            -- Use UCM instead of profile when available. Can be
            -- disabled to skip trying to use the UCM profile.
            ["api.alsa.use-ucm"] = true,
...

然後重啟 PipeWire 並檢查可用的設備:

本文內容或本節內容已經過期。

原因: --list-targets 選項在新版的 pw-record 中已不可用,若想列出項目請使用 wpctl statuspw-cli ls 或是 pw-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

這個 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

如果 arecode 測試麥克風工作正常但是卻沒被 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)
# override for pipewire-pulse.conf file
pulse.cmd = [
    { cmd = "load-module" args = "module-always-sink" flags = [ ] }
    { cmd = "load-module" args = "module-switch-on-connect" }
]

聲音輸出不會自動切換到藍牙耳機[編輯 | 編輯原始碼]

本文或本章節的事實準確性存在爭議。

原因: 連結中的上游 issue 針對的是 xfce 的 pulseaudio 面板插件。(在 Talk:PipeWire 中討論)


運行 pactl load-module module-switch-on-connect ,同時配置您的桌面環境在登錄時自動運行這個命令。你可能會需要執行 wpctl set-default <id><id>可以在 wpctl status 的輸出中找到。具體請參見wireplumber issue #89

連接到藍牙設備後沒有聲音[編輯 | 編輯原始碼]

截至 2020-12-07,如果連接上藍牙設備卻沒有聲音,您可能需要切換默認輸出設備(sink)與/或是將 sink 輸入移動到正確的 sink 位置。使用 pactl list sinks 列出所有可用的 sink 並通過 pactl set-default-sink 將默認 sink 切換為藍牙設備。這可以使用類似這樣的腳本通過 udev 自動化。

參見這個 Reddit 討論串關於這一問題的探討。根據腳本作者所言,耳機配置(the headset profile,HSP)可能仍有問題。

音量過低[編輯 | 編輯原始碼]

在將 PulseAudio 換成 Pipewire 後,聲音可能一開始正常,但一重啟就變得超級小。

打開 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


修改默認採樣率[編輯 | 編輯原始碼]

默認 PipeWire 使用 48kHz 的全局採樣率。如果您想更改此值(比如您有個支持更高採樣率的 DAC),則可以設置一個更高的默認值:

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

修改允許的採樣率[編輯 | 編輯原始碼]

只要 DAC 支持,PipeWire 可以動態更改採樣率。所選的採樣率會跟隨當前正在播放的音頻流。

/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 48000 88200 96000 ].

開發者所言,「PipeWire 支持至多 16 種不同的採樣率,並且會在允許的時候進行切換」。也就是說,在受支持的設備按照以上內容配置不會發生重採樣。在 PipeWire 0.3.61 之後,最多可以配置 32 種不同的採樣率。

請參照您 DAC 的硬體手冊來查看受支持的採樣率。內核驅動編碼器支持的採樣率可以通過以下命令查看:

$ grep -E 'Codec|Audio Output|rates' /proc/asound/card*/codec#*

要想查看當前某音效卡配置的採樣率,請運行:

$ 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

同樣會顯示每張音效卡與每條音頻流的採樣率。

音質 (重採樣質量)[編輯 | 編輯原始碼]

如果之前使用 PulseAudio 時用了 resample-method = speex-float-10 或是 soxr-vhq,那麼您可能會想將 /etc/pipewire/client.conf/etc/pipewire/pipewire-pulse.conf 兩個配置文件中 stream.properties 部分的 resample.quality = 4 取消注釋並修改成 10 或是最大值 15(如果配置文件不存在請從 /usr/share/pipewire/ 複製過來)。不要忘記重啟 pipewire.servicepipewire-pulse.socket 這兩個用戶單元(如果想要應用配置千萬不能把後者忘了)。

1015 之間音質差距很小,但是 CPU 負載會差兩到三倍。同時,41015 對延遲影響的差距還有待探索。resample.quality = 15 在 Ryzen 2600 和 44100→48000 Hz 的條件下會讓 pipewire 或是 pipewire-pulse 產生 4.0% 的單核負載。

您可以在 https://src.infinitewave.ca/ 比較重採樣器(不要關注任何超過 18KHz,超過 120dB 的內容)。speex 被列為 "Xiph.org Speex"。

PipeWire 使用它自己的被稱為 Spa 的重採樣算法。與 SoX 的 sox 和 Speex 的 speexenc 一樣,PipeWire 同樣有這個重採樣器的單獨版本 spa-resample。使用方法如下:

$ spa-resample -q 15 -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 shows 執行失敗:Connection refused[編輯 | 編輯原始碼]

這意味著應用無法連接到 PipeWire-Pulse 服務。請確認 /etc/pipewire/pipewire-pulse.conf 存在且非空並重啟 pipewire-pulse.service 用戶單元

如果沒有修復問題,運行 strace -f -o /tmp/pipe.txt pactl info 並將 /tmp/pipe.txt 上傳到 pastebin,之後在 IRC(#pipewire on OFTC) 或郵件列表尋求幫助。

藍牙音質低[編輯 | 編輯原始碼]

如果藍牙回放卡頓,檢查 pipewire.serviceunit status,看看有沒有類似以下的錯誤:

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 系列,比如 WH-1000XM3 和 WF-1000XM3 的麥克風)以及 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]
...

wireplumber 下:

/etc/wireplumber/bluetooth.lua.d/51-bluez-config.lua (or ~/.config/wireplumber/bluetooth.lua.d/51-bluez-config.lua)
bluez_monitor.properties = {
  ["bluez5.enable-sbc-xq"] = true,
  ["bluez5.enable-msbc"] = true,
  ["bluez5.codecs"] = "[sbc sbc_xq]",
}

重啟 pipewire.service 用戶單元來使修改生效。

在播放時有可覺察的音頻延遲或是爆裂聲[編輯 | 編輯原始碼]

這是由不活躍時的節點暫停(node suspension)造成的。

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 以應用更改,或者你也可以直接重啟整個計算機。

wireplumber 下,創建一個新文件來覆蓋默認配置:

~/.config/wireplumber/main.lua.d/51-disable-suspension.lua
(or /etc/wireplumber/main.lua.d/51-disable-suspension.lua)
table.insert (alsa_monitor.rules, {
  matches = {
    {
      -- Matches all sources.
      { "node.name", "matches", "alsa_input.*" },
    },
    {
      -- Matches all sinks.
      { "node.name", "matches", "alsa_output.*" },
    },
  },
  apply_properties = {
    ["session.suspend-timeout-seconds"] = 0,  -- 0 disables suspend
  },
})

對於藍牙設備,同時使用以下配置(注意不同的文件位置):

~/.config/wireplumber/bluetooth.lua.d/51-disable-suspension.lua
(or /etc/wireplumber/bluetooth.lua.d/51-disable-suspension.lua)
-- Note: bluez_monitor, not alsa_monitor
table.insert (bluez_monitor.rules, {
  matches = {
    {
      -- Matches all sources.
      -- Note: bluez_input, not alsa_input
      { "node.name", "matches", "bluez_input.*" },
    },
    {
      -- Matches all sinks.
      -- Note: bluez_output, not alsa_output
      { "node.name", "matches", "bluez_output.*" },
    },
  },
  apply_properties = {
    ["session.suspend-timeout-seconds"] = 0,  -- 0 disables suspend
  },
})

重啟 pipewire.servicewireplumber.service 以應用更改。

如果不想完全禁用節點暫停(suspension),你也可以將源暫停的超時延遲改為自己想要的值。

多個流同時播放時音頻被切斷[編輯 | 編輯原始碼]

此問題通常可以通過閱讀 pipewire-pulse.service 用戶單元journal 檢測出來。您會看到類似以下內容:

pipewire-pulse[21740]: pulse-server 0x56009b9d5de0: [Nightly] UNDERFLOW channel:0 offset:370676 underrun:940

根據官方 PipeWire 除錯指南,在 pipewire-media-session 下若想解決此問題:

/etc/pipewire/media-session.d/alsa-monitor.conf (or ~/.config/pipewire/media-session.d/alsa-monitor.conf
api.alsa.headroom = 1024

wireplumber 下:

/etc/wireplumber/main.lua.d/50-alsa-config.lua (or ~/.config/wireplumber/main.lua.d/50-alsa-config.lua)
apply_properties = {
    ["api.alsa.headroom"] = 1024,
},

如果您經歷了由內核頁鎖定(page locking)與延遲調度(late scheduling)導致的音頻卡頓,請參考遊戲#調整內核參數以實現響應時間一致性

音頻失真[編輯 | 編輯原始碼]

  • 對於麥克風,試著運行 alsamixer 並切換到有問題的音效卡,然後使用方向鍵降低所有 "Mic Boost" 與 "Internal Mic Boost" 選項,For microphones,
  • 參照#修改默認採樣率將採樣率降至 44100 (44.1 kHz)。

在待機後出現音頻問題[編輯 | 編輯原始碼]

如果將機器從睡眠中喚醒後音頻出現缺失或是其他狀況,重新初始化 ALSA 可能有幫助:

# alsactl init

USB DAC 延遲高 (比如 Schiit DACs)[編輯 | 編輯原始碼]

修改採樣率可能有助於某些 DAC 的延遲,例如 Schiit Hel 2。[8] 使用 pipewire-media-session 的匹配規則,我們可以為設備設置屬性。[9]

將默認的配置文件 /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 中的 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
...

在這個例子中是 card 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 是所有格式都支持的採樣率。

將音量升至 30% USB DAC 才出聲[編輯 | 編輯原始碼]

這篇文章的某些內容需要擴充。

原因: 添加 pipewire-media-session 相關指示 (在 Talk:PipeWire 中討論)

某些 USB DAC 在音量達到一定值前不會有輸出 [10]。通常這個值是 25% - 30%,而此時多半聲音已經過響,還沒法調小。解決方法是忽略硬體混音器的音量控制:將 ["api.alsa.soft-mixer"] 設為 true

wireplumber 下,你可以使用 table.insert/usr/share/wireplumber/main.lua.d/50-alsa-config.lua 中加入以下配置片段。

~/.config/wireplumber/main.lua.d/51-volume-fix.lua
table.insert (alsa_monitor.rules, {
    matches = {
      {
        -- This matches all cards.
        { "device.name", "matches", "alsa_card.*" },
      },
    },
    -- Apply properties on the matched object.
    apply_properties = {
      -- 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 的主音量設定好,隨後使用 # alsactl store 保存設置。您現在應該可以正常使用音量調節了。

實時音頻不起作用[編輯 | 編輯原始碼]

如果 pipewire.service 用戶單元status 出現了 RTKit error: org.freedesktop.DBus.Error.AccessDenied,這意味著 pipewire 守護進程的優先級不是實時。對於此問題,參見 [11]

同時輸出到同一音效卡的多個 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

接著,配置 PipeWire 的 media-session,對匹配設備使用新的音效卡配置。識別音效卡信息可以使用 $ pw-cli dump device

/etc/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 以上。您可以為 Discord 專門寫一個覆蓋用的配置,只需在 pipewire-pulse.conf 的 pulse.rules 部分添加如下規則:

/etc/pipewire/pipewire-pulse.conf (or ~/.config/pipewire/pipewire-pulse.conf)
...
pulse.rules = [
  ...
    {
        # Discord notification sounds fix
        matches = [ { application.process.binary = "Discord" } ]
        actions = {
            update-props = {
                pulse.min.quantum      = 1024/48000     # 21ms
            }
        }
    }
...

FMOD 遊戲在 PipeWire 下崩潰[編輯 | 編輯原始碼]

某些使用舊版 FMOD 音頻引擎 的遊戲(譬如 Pillars of Eternity)會運行 pulseaudio --check 並且在 PulseAudio 的二進位文件不存在的情形下崩潰。可以通過將 /bin/pulseaudio 連結至 /bin/true 來繞過這個問題。[12]

# 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.servicepipewire.service,以及 media session 服務。

在向 RAOP 設備推流時沒有聲音 (例如 Sonos)[編輯 | 編輯原始碼]

使用 Avahisystemd-resolved 設置 mDNS 域名解析。

視頻[編輯 | 編輯原始碼]

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 可以用於捕獲所有屏幕。

參閱[編輯 | 編輯原始碼]