From ArchWiki

PipeWire is a new low-level multimedia framework. It aims to offer capture and playback for both audio and video with minimal latency and support for PulseAudio, JACK, ALSA and GStreamer-based applications.

The daemon based on the framework can be configured to be both an audio server (with PulseAudio and JACK features) and a video capture server.

PipeWire also supports containers like Flatpak and does not rely on the audio and video user groups. Instead, it uses a Polkit-like security model, asking Flatpak or Wayland for permission to record screen or audio.


Install the pipewire package from the official repositories. There is also lib32-pipewire for multilib support.

Pipewire uses systemd/User for management of the server and automatic socket activation.

Optionally, install pipewire-docs to review the documentation.

Pipewire can work as drop-in replacement for others audio servers. See #Audio for details.

Tango-view-fullscreen.pngThis article or section needs expansion.Tango-view-fullscreen.png

Reason: Describe what gst-plugin-pipewire does exactly. (Discuss in Talk:PipeWire)


  • Helvum — GTK-based patchbay for pipewire, inspired by the JACK tool catia.
https://gitlab.freedesktop.org/ryuukyu/helvum || helvum


Tango-inaccurate.pngThe factual accuracy of this article or section is disputed.Tango-inaccurate.png

Reason: The gentoo wiki says "Starting with 0.3.39, PipeWire also requires media-video/wireplumber to run properly". The Arch pipewire package has only an optional dependency on pipewire-session-manager. (Discuss in Talk:PipeWire#Unclear that we need pipewire-media-session or wireplumber)

PipeWire currently uses the simple example session manager pipewire-media-session, but WirePlumber is more powerful and recommended. To switch to WirePlumber, install the wireplumber package. It will replace pipewire-media-session.

Similar to PipeWire's configuration files, the configuration files for WirePlumber can be found under /usr/share/wireplumber. The best course of action to change the WirePlumber configuration is to copy the entire directory to /etc. [1]


The PipeWire package provides an initial set of configuration files in /usr/share/pipewire. You should not edit these files directly, as package updates will overwrite your changes. To configure PipeWire, you can copy files from /usr/share/pipewire to the alternate system-wide location /etc/pipewire, or to the user location ~/.config/pipewire. [2]


Pipewire brings a custom "Pro Audio" profile in addition to the PulseAudio profiles, selectable through pavucontrol. The effect of which is described here: https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/FAQ#what-is-the-pro-audio-profile



Tango-view-fullscreen.pngThis article or section needs expansion.Tango-view-fullscreen.png

Reason: What happens when none of the following is configured/installed and an application sends audio directly to pipewire? The pipewire package contains many audio-related files, e.g. /etc/alsa/conf.d/50-pipewire.conf. (Discuss in Talk:PipeWire)

PipeWire can be used as an audio server, similar to PulseAudio and JACK. It aims to replace both PulseAudio and JACK, by providing a PulseAudio-compatible server implementation and ABI-compatible libraries for JACK clients. See the blog post PipeWire Late Summer Update 2020 for more information.

ALSA clients

Install pipewire-alsa (and remove pulseaudio-alsa if it was installed) to route all application using the ALSA API through PipeWire.

PulseAudio clients

Install pipewire-pulse. It will replace pulseaudio and pulseaudio-bluetooth. Reboot, re-login or execute systemctl start --user pipewire-pulse.service to see the effect.

Normally, no further action is needed, as the user service pipewire-pulse.socket should be enabled automatically by the package. To check if the replacement is working, run the following command and see the output:

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

JACK clients

Install pipewire-jack for JACK support. There is also lib32-pipewire-jack for multilib support.

pw-jack(1) may be used to start JACK clients, but it is technically not required, as it only serves as a wrapper around the PIPEWIRE_REMOTE, PIPEWIRE_DEBUG and PIPEWIRE_LATENCY environment variables.

It is possible to request a custom buffer size by setting a quotient of buffersize/samplerate (which equals the block latency in seconds):

PIPEWIRE_LATENCY="128/48000" application

Bluetooth devices

PipeWire handles Bluetooth audio devices if the pipewire-pulse package is installed. The package includes the /etc/pipewire/media-session.d/with-pulseaudio file, whose existence prompts the media session daemon to enable the bluez5 module.

Automatic profile selection

To automatically switch between HSP/HFP and A2DP profiles when an input stream is detected, set the bluez5.autoswitch-profile property to 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 native patch sets

We have Helvum for graphical visualization and creation of connections, but the rest is not in yet. The following are bash scripts which save wiresets, load wiresets, and dewire all connections. For saving and loading, use a command-line parameter for the filename.


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

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)

import sys
import csv
import os

if len(sys.argv) < 2:
	print('\n usage: pw-loadwires filename\n')

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])
while read -r line; do
	echo 'Dewiring: ' $line '...'
	pw-link -d $line
done < <(pw-cli dump short link {{!}} grep -Eo '^[0-9]+')

Sharing audio devices with computers on the network

While PipeWire itself is not network transparent, its pulse implementation supports network streaming. An easy way to share audio between computers on the network is to use the Avahi daemon for discovery. Make sure that the avahi-daemon.service is running on all computers that will be sharing audio.

To share the local audio devices load the appropriate modules on the host:

pactl load-module module-native-protocol-tcp listen= # Use the local IP address
pactl pactl load-module module-zeroconf-publish

Then load the discovery module on the clients:

pactl load-module module-zeroconf-discover

Run PipeWire on top of native JACK

PipeWire can also run as a JACK client on top of the native JACK daemon if desired. See JACK and PipeWire for more information.

WebRTC screen sharing

Most applications used to rely on X11 for capturing the desktop (or individual applications), for example when using WebRTC in web browsers (e.g. on Google Hangouts). On Wayland, the sharing mechanism is handled differently for security reasons. PipeWire enables sharing content under Wayland with fine-grained access controls.

This requires xdg-desktop-portal and one of its backends to be installed. The available backends are:

Note: xdg-desktop-portal 1.10.0 fixed a mismatch between specification and implementation of its D-Bus interface. [3] Hence, some clients may not work with xdg-desktop-portal 1.10.0 or newer. Current progress for OBS Studio, Chromium and Firefox.

Firefox (84+) supports this method by default, while on Chromium (73+) one needs to enable WebRTC PipeWire support by setting the corresponding (experimental) flag at the URL chrome://flags/#enable-webrtc-pipewire-capturer.

obs-studio (27+) supports this method by using the new PipeWire capture source.

Tango-inaccurate.pngThe factual accuracy of this article or section is disputed.Tango-inaccurate.png

Reason: Since this pull request was merged, the following note about specific app/window sharing may be not correct anymore for xdg-desktop-portal-gtk. Also see the ticket tracking the discussion at [4]. (Discuss in Talk:PipeWire)

Note that the only supported feature is sharing the entire desktop and not a specific app/window [5][6].


For xdg-desktop-portal-wlr to work, the XDG_CURRENT_DESKTOP and WAYLAND_DISPLAY environment variables have to be set in the systemd user session. XDG_CURRENT_DESKTOP has to be set to the name of your compositor, e.g. XDG_CURRENT_DESKTOP=sway. WAYLAND_DISPLAY is set automatically by the compositor. The recommended way to bring these environment variables over to the systemd user session is to run systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP after launching the compositor, e.g. with the compositors configuration file. See [7] and [8] for more details.

Tip: To share an individual monitor with xdg-desktop-portal-wlr if you have more than one, you can use configuration file options, see xdg-desktop-portal-wlr(5) § SCREENCAST OPTIONS:
chooser_type = none
output_name = Monitor
In Sway, you can get the Monitor value using the swaymsg -t get_outputs command.


Tango-view-fullscreen.pngThis article or section needs expansion.Tango-view-fullscreen.png

Reason: pipewire-v4l2 (Discuss in Talk:PipeWire)

Although the software is not yet production-ready, it is safe to play around with. Most applications that rely on GStreamer to handle e.g. video streams should work out-of-the-box using the PipeWire GStreamer plugin, see GStreamer#PipeWire. Applications like e.g. cheese are therefore already able to share video input using it.

Audio post-processing


EasyEffects (former PulseEffects) is a GTK utility which provides a large array of audio effects and filters to individual application output streams and microphone input streams. Notable effects include an input/output equalizer, output loudness equalization and bass enhancement, input de-esser and noise reduction plug-in. See the GitHub page for a full list of effects.

In order to use EasyEffects, install easyeffects. See Community Presets for a collection of preset configurations. See AutoEq for collection of AI generated EQ presets for headphones.

Note: For PulseEffects legacy version, see PulseAudio#PulseEffects.


NoiseTorch is an alternative way for noise suppression. noisetorchAUR. There also exists a binary version, noisetorch-binAUR, as well as a noisetorch-gitAUR.

After starting it the module can be loaded for the selected microphone. It is possible to adjust the voice activation threshold, which should be set to the highest level, not filtering out any actual voice.

Noise suppression for voice

Install noise-suppression-for-voiceAUR and see https://github.com/werman/noise-suppression-for-voice#pipewire. Then, set the noise cancelled source as default in your audio settings. You might need to restart your application prior being able to use it.


JamesDSP for Linux (available as jamesdspAUR) provides open-source sound effects for PipeWire and PulseAudio. It uses its own effects engine and without depending on LADSPA, Calf, etc. JamesDSP was initially published as an audio effects processor for Android devices.

LADSPA, LV2 and VST plugins

If you want to choose between the full list of available LADSPA, LV2 and VST plugins, you can apply them using a custom Pulseaudio null sink and Carla Jack host. Install pipewire-pulse, pipewire-jack and carla. At the begin, create a new Pulseaudio null sink named default_null_sink.

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

Start Carla through Pipewire, pw-jack carla-rack. In Rack tab add whichever plugin you want. Make sure they are stereo type. You can change their order, the one on top of the list will be the first to receive the audio stream, just like in EasyEffects. Afterwards move to Patchbay tab and connect the default_null_sink L/R monitors to Carla inputs, then Carla outputs to the playbacks of your desired device (speakers, earphones, HDMI, etc). Save the configuration to a local folder, i.e. ~/Documents/carla_sink_effects.carxp.

You can test the effects while a multimedia application is reproducing audio, i.e. watching a video on a website through Firefox. There are two methods to do it. The first one, inside Carla Patchbay tab, disconnecting all Firefox connections and linking its L/R outputs to default_null_sink playbacks. The second through pavucontrol, locating Firefox audio stream and redirecting it to default_null_sink (this should remember the connection to automatically redirect the application to the same sink on the next instance).

To apply these settings at startup, create two systemd user service units:

Description=Load Carla Rack JACK host

ExecStart=/usr/bin/pw-jack carla-rack -n

Description=Load %i Pulseaudio null sink

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


Then override jack-carla-rack service specifying the full path of your Carla configuration at Environment directive:

ExecStart=/usr/bin/pw-jack carla-rack -n $CARLA_CONFIG_FILE

At last, enable these two services specifying default_null_sink as argument for pulseaudio-null-sink service:

systemctl --user enable pulseaudio-null-sink@default_null_sink.service
systemctl --user enable jack-carla-rack.service

Note that if you set the default_null_sink as the default device in system settings, all applications will be redirected to it and the volume keys will change its level, not the one on the speakers. If you want to control volume speakers, leave them as the default in system settings and redirect your desired application to default_null_sink inside pavucontrol (Pipewire compatibility layer will remember the connection on the next instance of the same application).



Microphone is not detected by PipeWire

PipeWire's alsa-monitor module uses alsa-card-profiles to detect devices by default. If this is not working for you, try to turn off api.alsa.use-acp, or optionally turn on api.alsa.use-ucm.

If using 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

Otherwise, if using 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,

Then, restart pipewire and check available devices:

$ 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

Sound does not automatically switch to Bluetooth headphones

Tango-inaccurate.pngThe factual accuracy of this article or section is disputed.Tango-inaccurate.png

Reason: The linked upstream issue is specific to the xfce pulseaudio panel plugin. (Discuss in Talk:PipeWire)

Run pactl load-module module-switch-on-connect and configure your desktop environment to automatically run that command on login. See wireplumber issue #89 for more details.

No sound after connecting to Bluetooth device

As of 2020-12-07, if there is no sound after connecting a Bluetooth device, you might need to switch the default sink and/or move a sink input to the correct sink. Use pactl list sinks to list the available sinks and pactl set-default-sink to switch the default sink to the Bluetooth device. This can be automated via udev using a script similar to this one.

See this Reddit thread for a discussion of the issue. According to author of the script, the headset profile (HSP) might still have problems.

Low volume

After replacing PulseAudio with Pipewire, sound may work fine, but after a reboot, the volume becomes intolerably low.

Open alsamixer, use F6 to select the proper soundcard, and make sure the ALSA volumes are at 100%. alsactl should maintain this setting after reboot.


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

Install realtime-privileges and add your own user to the realtime group.

Alternatively, increasing memlock from 64kB to 128kB seems enough to fix this. If you are running pipewire-pulse under systemd/User, add:

username	soft	memlock	64
username	hard	memlock	128

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

Changing the sample rate

By default PipeWire sets a global sample rate of 48kHz. If you need to change it (e.g. you own a DAC supporting a higher value), you can set a new default:

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

PipeWire can also change output sample rates supported by your DAC. To configure, uncomment and set the line default.clock.allowed-rates = [ 48000 ], for example, [ 44100 48000 88200 96000 ]. The sample rate follows the sample rate of the audio stream being played when the card is idle.

To check out which output sample rate and sample format are the data sent to DAC (probably you need to change digits):

cat /proc/asound/card0/pcm0p/sub0/hw_params

To check out which input sample rate is used, change pcm0p to pcm0c (c is short for "capture", p is for "playback").

Sound quality (resampling quality)

If you used PulseAudio with resample-method = speex-float-10 or soxr-vhq, then you might consider uncommenting and changing resample.quality = 4 to 10 or the maximum 15 in stream.properties block in both /etc/pipewire/client.conf and /etc/pipewire/pipewire-pulse.conf (copy them from /usr/share/pipewire/ if they do not exist). Do not forget to restart PipeWire (without sudo): systemctl --user restart pipewire.service pipewire-pulse.socket (never forget pipewire-pulse.socket if you want your config changes to be applied).

There is a very little quality difference between 10 and 15, but the CPU load difference is 2-3x. And the latency difference between 4, 10, 15 is yet to be investigated by anybody. resample.quality = 15 on 44100→48000 Hz on Ryzen 2600 causes pipewire or pipewire-pulse processes to cause 4.0% one CPU core load.

You can compare resamplers here: https://src.infinitewave.ca/ (do not pay attention to anything above 18 KHz and over 120 dB). speex is listed as "Xiph.org Speex".

PipeWire uses its own resampling algorithm called Spa. Like with SoX's sox, Speex's speexenc, PipeWire includes its standalone version: spa-resample. Usage:

spa-resample -q 15 -f s24 -r 48000 input16bit44100orAnythingElse.wav output24bit48000hz.wav

It is probably somehow possible to use other resamplers by creating your own sink. Or just use a plugin in your music player (e.g., Qmmp has SoX plugin).

External sound card not activated after reconnect

Check ~/.config/pipewire-media-session/default-profile if there is any entry with default profile "off" and remove it. If that does not help, remove all files from ~/.config/pipewire-media-session/ and restart PipeWire using systemctl --user restart pipewire.service.

No Sound or pactl info shows Failure: Connection refused

It means applications are unable to connect to the PipeWire-Pulse service, confirm that /etc/pipewire/pipewire-pulse.conf exists and is not empty and restart PipeWire-Pulse using systemctl --user restart pipewire-pulse.service.

If that does not fix it, run strace -f -o /tmp/pipe.txt pactl info and pastebin /tmp/pipe.txt while seeking help on IRC (#pipewire on OFTC) or the mailing-lists.

Low audio quality on Bluetooth

In case Bluetooth playback stutters, check the unit status of the pipewire.service user unit for errors similar as below:

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

If they appear, check the currently selected codec using pactl list sinks and try changing it by setting bluez5.codecs to one of sbc aac ldac aptx aptx_hd:

/etc/pipewire/media-session.d/bluez-monitor.conf (or ~/.config/pipewire/media-session.d/bluez-monitor.conf)
properties = {
  bluez5.codecs = [sbc]

Try enabling mSBC support (fixes mic on Sony 1000XM3, i.e. Headphones WH-1000XM3 and Earbuds WF-1000XM3):

/etc/pipewire/media-session.d/bluez-monitor.conf (or ~/.config/pipewire/media-session.d/bluez-monitor.conf)
properties = {
     bluez5.enable-msbc = true

Restart PipeWire by restarting the pipewire.service user unit for the changes to take effect.

No devices detected after PipeWire update and reboot (git / >=0.3.23)

As of commit 012a68f8, a new user unit has been added which is disabled by default, meaning there is no pipewire-media-session running on user login. Run this program on login by enabling the pipewire-media-session.service user unit.

If the user or the package manager have not sorted out the configuration file changes after update, then another instance of pipewire-media-session might be running in pipewire.service. Verify whether this is the case by checking the unit status of the pipewire.service user unit. If it shows pipewire and pipewire-media-session running, update your system and/or user configuration:

/etc/pipewire/pipewire.conf (or ~/.config/pipewire/pipewire.conf)
context.exec = {
  # Line below should be commented out
  #"/usr/bin/pipewire-media-session" = { args = "" }

Noticeable audio delay when starting playback

This is caused by node suspension when inactive. It can be disabled by editing /etc/pipewire/media-session.d/*-monitor.conf depending on where the delay occurs and changing property session.suspend-timeout-seconds to 0 to disable or to experiment with other values and see what works. Alternatively you can comment out the line suspend-node in /etc/pipewire/media-session.d/media-session.conf. Restart both the pipewire and pipewire-pulse systemd services to apply these changes, or alternatively reboot.

If you are using wireplumber instead of pipewire-media-session, then you can copy the example config file located at /usr/share/wireplumber/main.lua.d/50-alsa-config.lua to /etc/wireplumber/main.lua.d/50-alsa-config.lua and add the line ["session.suspend-timeout-seconds"] = 0 to section apply_properties at the end of the file.

Audio cutting out when multiple streams start playing

This problem can typically be diagnosed by running journalctl --user -b -u pipewire-pulse and finding lines similar to:

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

According to the official PipeWire troubleshooting guide, to solve this problem edit /etc/pipewire/media-session.d/alsa-monitor.conf, uncomment the line saying api.alsa.headroom = 0 and change its value to 1024.

If you are using wireplumber instead of pipewire-media-session, then you can copy the example config file located at /usr/share/wireplumber/main.lua.d/50-alsa-config.lua to /etc/wireplumber/main.lua.d/50-alsa-config.lua and at the end of the file, under section apply_properties, change --["api.alsa.headroom"] = 0 to ["api.alsa.headroom"] = 1024

Audio is distorted

  • For microphones, try navigating to the card that is having issues after running alsamixer and use the arrow keys to reduce any "Mic Boost" or "Internal Mic Boost" options.
  • Follow #Changing the sample rate, reducing the sample rate to to 44100 (44.1 kHz).

Audio problems after standby

If the sound is missing or otherwise garbled after waking the machine up from sleep, it might help to reinitialize ALSA:

# alsactl init

High latency with USB DACs (e.g. Schiit DACs)

Changing sample rates or formats might help reduce latency with some DACs such as Schiit Hel 2.[9] Using matching rules in pipewire-media-session we can set properties for devices.[10]

Copy the default configuration of alsa-monitor.conf for pipewire-media-session into either /etc/pipewire/media-session.d or ~/.config/pipewire/media-session.d. Then append a new rule-block similar to the following one:

/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 doesn't cut out or other issues stop occurring
                api.alsa.period-size = 128

alsa_output.<name of node> node can be obtained using pw-top.

Your DAC might support a different format or sample rate. You can check what your DAC supports by querying ALSA:

First get the card number of your DAC:

$ aplay -l
card 3: S2 [Schiit Hel 2], device 0: USB Audio [USB Audio]
  Subdevices: 0/1
  Subdevice #0: subdevice #0

So in this example it would be card 3. Get all supported sample rates and formats:

$ cat /proc/asound/cardX/streamX
  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

In this case S16_LE, S24_3LE, S32_LE are the supported formats and 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000 are the supported sample rates across all formats.


OBS (etc.) display nothing, even if they ask for a window/screen

If you are sure that you have xdg-desktop-portal installed as well as either xdg-desktop-portal-gtk or xdg-desktop-portal-kde, check the running state of the daemons.

In OBS, if everything is working, you should see this in stdout:

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

For multi-monitor setups the slurp package will allow to capture of all the screens.

See also