PipeWire

提供: ArchWiki
2023年2月6日 (月) 15:59時点におけるKusanaginoturugi (トーク | 投稿記録)による版 (→‎WebRTC 画面共有: 飜訳および古い記事の削除)
ナビゲーションに移動 検索に移動

PipeWire は新しい低レベルマルチメディアフレームワークです。 映像と音声を最小の遅延で再生/キャプチャすることを目的としていて、PulseAudioJACKALSAGStreamer をベースとしたアプリケーションと互換性があります。

このフレームワークのデーモンは (PulseAudio と JACK の機能を持った) オーディオサーバーとしても、ビデオキャプチャサーバーとしても設定できます。

また PipeWire は Flatpak のようなコンテナをサポートしており、audiovideo ユーザーグループに依存するのではなく、Flatpak や Wayland にスクリーンや音声を録音する許可を求める Polkit のようなセキュリティモデルを使用しています。

目次

インストール

公式リポジトリから pipewire パッケージを インストール してください。multilib に対応した lib32-pipewire もあります。

Pipewire は systemd/ユーザー を使ってサーバーを管理し、ソケットを自動で起動します。

オプションとして、pipewire-docs をインストールすると、ドキュメントを確認することができます。

Pipewire は、他のオーディオサーバーと置き換えることができます。詳しくは オーディオ を参照してください。

セッション マネージャー

JACK と同様、PipeWire は内部で接続ロジックを実装していません。新しいストリームを監視し、適切な出力デバイスやアプリケーションに接続する負担は、セッションマネージャーとして知られる外部のコンポーネントに任されています。

現在、2つのセッションマネージャーが利用可能です。

  • PipeWire Media Session — いくつかの基本的なデスクトップのユースケースに対応した非常にシンプルなセッションマネージャです。これは主にテスト用と新しいセッションマネージャを構築するための例として実装されました。
https://gitlab.freedesktop.org/pipewire/media-session || pipewire-media-session
  • WirePlumber — より強力なマネージャであり、現在の推奨品です。モジュール設計に基づいており、実際の管理機能を実装する Lua プラグインがあります。
https://pipewire.pages.freedesktop.org/wireplumber/ || wireplumber

PipeWire のインストール時に、どちらかを選ぶように指示されます。後で適切なパッケージをインストールすることで、もう一方のオプションと衝突しますが、置き換えることで切り替えが可能です。

GUI

  • Helvum — PipeWire 用の GTK 製のパッチベイ。 JACK のツールの catia にインスパイアされた。
https://gitlab.freedesktop.org/ryuukyu/helvum || helvum
  • qpwgraph — Qt-based Graph/Patchbay for PipeWire, inspired by the JACK tool QjackCtl.
https://gitlab.freedesktop.org/rncbc/qpwgraph || qpwgraph

設定

PipeWire パッケージは、初期設定ファイルを/usr/share/pipewire に用意しています。パッケージのアップデートで変更内容が上書きされてしまうので、これらのファイルを直接編集するべきではありません。PipeWire を設定するには、ファイルを /usr/share/pipewire からシステム全体の代替場所 /etc/pipewire か、ユーザーの場所 ~/.config/pipewire にコピーしてください。[1]

プロファイル

Pipewire では、PulseAudio のプロファイルに加えて、pavucontrol で選択可能なカスタムの Pro Audio プロファイルが提供されています。その効果はこちらで解説しています:https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/FAQ#what-is-the-pro-audio-profile

使用方法

音声

PulseAudio や JACK と同様に PipeWire をオーディオサーバーとして使用できます。 PulseAudio サーバーの互換実装と JACK クライアント用の ABI 互換ライブラリを提供することで PulseAudio と JACK の両方を置き換えることを目的としています。詳細についてはこの記事を参照してください。

ALSA/レガシーアプリケーション

pipewire-alsa をインストールして ALSA API を使用するすべてのアプリケーションが PipeWire を使用するよう設定できます。

PulseAudio クライアント

pipewire-pulse をインストールします。このパッケージは pulseaudiopulseaudio-bluetooth を置き換えます。再起動するか、ログインし直すか、systemctl start --user pipewire-pulse.service を実行すると有効化されます。

パッケージがユーザーサービス pipewire-pulse.socket を自動的に有効化するので、通常それ以上の操作は不要です。置き換えが機能しているかどうかを確認するには、次のコマンドを実行して出力を確認してください:

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

システム起動時に PipeWire が正しく機能しない場合は、ユーザーサービス pipewire-pulse.servicepipewire.servicepipewire-media-session.service が起動して実行されているか確認します。pipewire-pulse.servicepipewire-pulse.socket は root で実行することを制限するような ConditionUser を設定していることに注意してください。

JACK クライアント

pipewire-jack をインストールします。pw-jack を使用して JACK クライアントを起動すると、元の libjack* ではなく PipeWire が提供する互換ライブラリが使用されます:

pw-jack application

カスタムバッファサイズを要求することもできます。PIPEWIRE_LATENCY環境変数を バッファサイズ/サンプルレート (ブロックのレイテンシ(秒)を意味します) に設定します:

PIPEWIRE_LATENCY="128/48000" pw-jack application

また pipewire-jack-dropinAUR をインストールするか、jackjack2 をアンインストールして JACK クライアントが互換ライブラリを自動的に読み込むようにもできます。

ldd を使用して JACK アプリケーションが正しいライブラリにリンクしていることを確認します。

$ ldd /usr/bin/qjackctl | grep -i libjack
libjack.so.0 => /usr/lib/pipewire-0.3/jack/libjack.so.0 (0x00007f7e5080a000)

Bluetooth デバイス

PipeWire は pipewire-pulse パッケージがインストールされている場合 Bluetooth オーディオデバイスを制御します。具体的には、メディアセッションデーモンは /etc/pipewire/media-session.d/with-pulseaudio が存在する時に自動的にその bluez5 モジュールを有効にします。

プロファイルの自動選択機能

pipewire-media-session は、入力ストリームが必要なときに、HSP/HFP と A2DP プロファイルを自動的に切り替えます。これを有効にするには、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
...

これらの機能は、WirePlumber ではまだ 実装中 です。

PipeWire ネイティブパッチセット

グラフィカルな視覚化と接続の作成のための Helvum はありますが、それ以外はまだ入っていません。以下は、ワイヤセットの保存、ワイヤセットの読み込み、すべての接続の解除を行う bash スクリプトです。保存と読み込みには、コマンドラインパラメータでファイル名を指定します。

pw-savewires
#!/bin/bash

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

rm $1 &> /dev/null
while IFS= read -r line; do
	link_on=`echo $line | cut -f 4 -d '"'`
	link_op=`echo $line | cut -f 6 -d '"'`
	link_in=`echo $line | cut -f 8 -d '"'`
	link_ip=`echo $line | cut -f 10 -d '"'`
	echo "Saving: " "'"$link_on:$link_op"','"$link_in:$link_ip"'"
	echo "'"$link_on:$link_op"','"$link_in:$link_ip"'" >> $1
done < <(pw-cli dump short link)
pw-loadwires
#!/bin/python

import sys
import csv
import os

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

with open(sys.argv[1], newline='') as csvfile:
	pwwreader = csv.reader(csvfile, delimiter=',', quotechar='"')
	for row in pwwreader:
		print('Loading:  ' + row[0] + ' --> ' + row[1])
		process = os.popen('pw-link ' + row[0] + ' ' + row[1])
pw-dewire
#!/bin/bash
while read -r line; do
	echo 'Dewiring: ' $line '...'
	pw-link -d $line
done < <(pw-cli dump short link {{!}} grep -Eo '^[0-9]+')

ネットワーク上のコンピューターとオーディオ機器を共有する

PipeWire 自体はネットワーク透過型ではありませんが、そのパルス実装は ネットワークストリーミング をサポートしています。ネットワーク上のコンピュータ間でオーディオを共有する簡単な方法は、Avahi デーモンを使って検出することです。 オーディオを共有するすべてのコンピュータで avahi-daemon.service が実行されていることを確認してください。

ローカルのオーディオデバイスを共有するために、ホスト上で適切なモジュールをロードしてください。

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

次に、クライアントにディスカバリモジュールをロードします。

pactl load-module module-zeroconf-discover

ネイティブ JACK 上で PipeWire を実行する

PipeWire はネイティブ JACK デーモン上の JACK クライアントとして実行することもできます。詳細は JACK and PipeWire を参照してください。

WebRTC 画面共有

ほとんどのブラウザは WebRTC を使用しているとき (例えば Google Meet などで) デスクトップ (や個々のアプリケーション) をキャプチャするのに X11 に依存していました。Wayland ではセキュリティ上の理由から画面共有は異なる方法で処理されます。PipeWire はきめ細かなアクセス制御を使用して Wayland 上のコンテンツを共有できます。

これには xdg-desktop-portal とそのバックエンドの1つが必要です。利用可能なバックエンドは次のとおりです:

バックエンドをインストールした後、xdg-desktop-portal.service ユーザーユニット再起動する必要があります。まだサービスが開始されていない場合、サービスを開始します。

ノート: xdg-desktop-portal 1.10.0 では、D-Bus インターフェースの仕様と実装の不一致を修正されました。[2] そのため、一部のクライアントは xdg-desktop-portal 1.10.0 またはそれ以降で動作しないかもしれません。

Firefox (バージョン84以降) はデフォルトでこの方法をサポートしていますが、Chromium (バージョン73以降) では、WebRTC PipeWireサポートを次のURLの実験的機能の設定を変更して有効にする必要があります。chrome://flags/#enable-webrtc-pipewire-capturer または、CLI 引数の --enable-features=WebRTCPipeWireCapturer を使用します。

唯一サポートされている機能はデスクトップ全体の共有で、特定のアプリケーション/ウィンドウの共有はサポートされていません。[3][4]

xdg-desktop-portal-wlr

XDG_CURRENT_DESKTOPWAYLAND_DISPLAY 環境変数が systemd user session で設定されていないと、xdg-desktop-portal-wlr は動きません。XDG_CURRENT_DESKTOP はコンポジターの名前に設定する必要があります、例えば XDG_CURRENT_DESKTOP=sway です。WAYLAND_DISPLAY は、コンポジターによって自動的に設定されます。これらの環境変数を systemd ユーザーセッションに渡す推奨方法は、コンポジターを起動した後に systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP を、例えばコンポジターの設定ファイルを使って実行することです。詳しくは [5][6] を参照してください。

ヒント: xdg-desktop-portal-wlr で個々のモニターを共有するには、複数ある場合、設定ファイルのオプションを使うことができます、 xdg-desktop-portal-wlr(5) § SCREENCAST OPTIONS を参照して下さい。
~/.config/xdg-desktop-portal-wlr/config
chooser_type = none
output_name = Monitor
Swayでは、swaymsg -t get_outputs コマンドで Monitor の値を取得することができます

映像

ソフトウェアはまだ商業利用には適していませんが、試す分には問題ありません。GStreamer を使用して映像ストリームを処理するほとんどのアプリケーションは PipeWire GStreamer プラグインを使用して設定なしで動作するはずです (GStreamer#PipeWireを参照してください)。そのため既に cheese のようなアプリケーションは PipeWire を使用して映像入力を利用できます。

音声のポストプロセッシング

EasyEffects

EasyEffects (以前は PulseEffects と呼ばれていました) は多数のエフェクトとフィルタを個々の入出力ストリーム (アプリケーションの音声出力やマイクの入力など) に提供する GTK 製のユーティリティです。注目すべきエフェクトには、入出力イコライザー、出力ラウドネス等化、ベースエンハンスメント、入力ディエッサー、ノイズ抑制プラグインなどがあります。GitHub ページにエフェクトの一覧があります。

EasyEffects を使用するには、easyeffects をインストールします。プリセット設定集については、コミュニティープリセットを参照してください。

ノート: PulseEffects の古いバージョンについては PulseAudio#PulseEffects を参照してください。

NoiseTorch

noisetorchAUR はノイズ抑制に使用できます。ビルド済み (noisetorch-binAUR) や開発版 (noisetorch-gitAUR) のパッケージもあります。

起動すると選択したマイクにモジュールを読み込むことができます。声が出力される閾値を調整することができます。実際の声が削除されない最大のレベルに設定するべきです。

Noise suppression for voice

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 のためのオープンソースのサウンドエフェクトを提供します。LADSPA や Calf などに依存することなく、独自のエフェクトエンジンを使用しています。JamesDSP は当初 Android デバイス用のオーディオエフェクトプロセッサーとして公開されました。

LADSPA、LV2、VST プラグイン

LADSPA、LV2、VSTのプラグインを使用したい場合は、カスタム PulseAudio null シンクと Carla Jack ホストを利用できます。pipewire-pulsepipewire-jackcarla をインストールします。はじめに default_null_sink という名前の PulseAudio の null シンクを作成します。

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

pw-jack carla-rack で PipeWire を使用する Carla を起動します。Rack タブで使いたいプラグインを全て追加します。プラグインのタイプが stereo であることを確認してください。適用する順番を変えることができます。EasyEffectsのようにリストの最初のプラグインが最初に入力の音声ストリームを受け取ります。その後 Patchbay タブに移動し default_null_sink の L/R monitor を Carla input に接続し、Carla output を出力したいデバイス (スピーカーやイヤホンや HDMI 出力など) の playback に接続します。設定をフォルダに保存します (~/Documents/carla_sink_effects.carxp など)。

Firefox で動画を見ている時など、アプリケーションが音声を再生している時に効果を試すことができます。2つの方法があります。一つは Carla の Patchbay タブで Firefox の接続を全て外し default_null_sink の L/R output に接続する方法です。もう一つは pavucontrol を使用し Firefox の音声ストリームを default_null_sink に変更する方法です (この方法は同じアプリケーションの次回起動時に同じ接続先を使用するはずです)。

これらの設定を起動時に適用するには、まず2つの 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
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 引数をつけてください:

systemctl --user enable pulseaudio-null-sink@default_null_sink.service
systemctl --user enable jack-carla-rack.service
ノート: システム設定で default_null_sink をデフォルトデバイスに設定すると、全てのアプリケーションが default_null_sink にリダイレクトされ、音量の変更がスピーカーではなく 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 (または ~/.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 (または ~/.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 を再起動し、利用可能なデバイスを確認します。

$ 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

サウンドが自動的に Bluetooth ヘッドフォンに切り替わらない

pactl load-module module-switch-on-connect を実行し、ログイン時に自動的にそのコマンドが実行されるようにデスクトップ環境を設定してください。詳しくは wireplumber issue #89 を見てください。

Bluetooth デバイスに接続しても音が出ない

2020-12-07 の時点で、Bluetooth デバイスを接続しても音が出ない場合は、デフォルトのシンクに切り替えるか、シンク入力を正しいシンクに移動する必要があります。pactl list sinks で使用可能なシンクの一覧を表示し、pactl set-default-sink でデフォルトのシンクを Bluetooth デバイスに切り替えます。これはこのようなスクリプトを使って udev で自動化できます。

この問題については、この Reddit スレッドを参照してください。スクリプトの作成者によると、ヘッドセットプロファイル (HSP) にまだ問題がある可能性があります。

音量が小さい

PulseAudio を PipeWire で置き換えた後、正しく音が出ても、再起動後に音量が極端に小さくなることがあります。

alsamixer を開き、F6 を押して適切なサウンドカードを選び ALSA のボリュームが100%であることを確認してください。alsactl は再起動後もこの設定を維持するはずです。

increasing 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/ユーザーpipewire-pulse を実行している場合は /etc/security/limits.d/username.conf に次の行を追加します:

username	soft	memlock	64
username	hard	memlock	128

サンプリングレートを変更する

PipeWire のデフォルトでは、グローバルサンプルレートは 48kHz に設定されています。これを変更したい場合(より高い値をサポートする DAC を所有しているなど)、設定ファイル /etc/pipewire/pipewire.confdefault.clock.rate = 48000 行を編集することで行うことができます。例えば、192kHz にしたい場合は、48000default.clock.rate = 192000 にコメントを解除して変更します。

PipeWire は、DAC がサポートする出力サンプルレートを変更することもできます。設定するには、default.clock.allowed-rates = [ 48000 ] という行をコメント解除して設定します。例えば、[ 44100 48000 88200 96000 ] とします。サンプルレートは、カードがアイドルのときに再生されるオーディオストリームのサンプルレートに従います。

どの出力サンプルレートとサンプルフォーマットが DAC に送られたデータであるかを確認するには(おそらく桁を変更する必要があります)。

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

どの入力サンプルレートを使用しているかを確認するには、pcm0ppcm0c に変更します。(c は "capture" の略、p は "playback" の略です).

音質(リサンプリング品質)

PulseAudio を resample-method = speex-float-10 または soxr-vhq で使用していた場合、コメントを解除して resample.XXX を変更することを検討するとよいかもしれません。resample.quality = 410 または最大値 15 に変更することを検討してください。(存在しない場合は /usr/share/pipewire/ からコピーしてください)。PipeWire の再起動を忘れないでください (sudo なし): systemctl --user restart pipewire.service pipewire-pulse.socket (設定変更を適用させたい場合は、pipewire-pulse.socketを絶対に忘れないでください)。

1015 では、品質の差はほとんどありませんが、CPU 負荷は2〜3倍になっています。また、4, 10, 15 のレイテンシーの差はまだ誰も調べていません。Ryzen 2600 で 44100→48000Hz で resample.quality = 15 にすると pipewirepipewire-pulse プロセスが 1CPUコア4.0% の負荷となる。

リサンプラーの比較はこちら:https://src.infinitewave.ca/(18KHz以上、120dB以上は注意)。speeexXiph.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/default-profile にデフォルトプロファイル off のエントリがあれば削除します。それでも解決しない場合は ~/.config/pipewire-media-session/ からすべてのファイルを削除し、systemctl --user restart pipewire.service で PipeWire を再起動します。

音が出ないまたは pactl info が Failure: Connection refused と表示する

これはアプリケーションが PipeWire-Pulse サービスに接続できていないことを意味します。/etc/pipewire/pipewire-pulse.conf が存在し空でないことを確認し、systemctl --user restart pipewire-pulse.service で PipeWire-Pulse を再起動してください。

それでも解決しない場合は strace -f -o /tmp/pipe.txt pactl info を実行し、pastebin に /tmp/pipe.txt を貼り付けて、IRC (OFTC の #pipewire) かメーリングリストで相談してください。

Bluetooth の音声の品質が低い

Bluetooth で再生が途切れる場合は systemctl --user status 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 で現在選択されているコーデックを確認し、/etc/pipewire/media-session.d/bluez-monitor.confbluez5.codecssbc aac ldac aptx aptx_hd のいずれかに変更してみてください。

/etc/pipewire/media-session.d/bluez-monitor.conf
...
properties = {
  ...
  bluez5.codecs = [sbc]
...

mSBC サポートの有効化を試すには (Sony 1000XM3 のマイクの問題を修正します):

/etc/pipewire/media-session.d/bluez-monitor.conf
...
rules = [
  ...
  actions = {
    ...
    update-props = {
     ...
     bluez5.msbc-support = true
...

変更を適用するには systemctl --user restart pipewire.service で PipeWire を再起動する必要があります。

PipeWire の更新 (git / >=0.3.23) と再起動後デバイスが検出されない

コミット 012a68f8[7] の時点で新しい systemd サービスが追加されデフォルトでは無効になっています。これはシステムの起動時に pipewire-media-session が実行されないことを意味します。サービスを有効にするには systemctl --user enable --now pipewire-media-session.service を実行します。

システムの管理者やパッケージマネージャが更新後に設定ファイルの変更を整理していない場合、pipewire.service によって pipewire-media-session の別のプロセスが実行されている可能性があります。確認するには systemctl --user status pipewire.service を実行してください。

pipewire および pipewire-media-session が実行中と表示される場合は、システム設定かユーザ設定、あるいは両方を更新します。

/etc/pipewire/pipewire.conf または ~/.config/pipewire/pipewire.conf
context.exec = {
  ...
  # 次の行をコメントアウトする必要があります
  #"/usr/bin/pipewire-media-session" = { args = "" }
  ...
}

再生開始時に音声に遅延が発生する

これは非アクティブ時のノードのサスペンドが原因です。遅延が発生する領域に応じて /etc/pipewire/media-session.d/*-monitor.conf を編集し、プロパティ session.suspend-timeout-seconds0 に変更してサスペンドを無効にするか、他の値を試して動作を確認してみてください。/etc/pipewire/media-session.d/media-session.confsuspend-node の行をコメントアウトすることもできます。変更を適用するには pipewirepipewire-pulse systemd サービスの両方を再起動するか、システムを再起動してください。

複数のストリームの再生開始時に音声が途切れる

この問題は通常 journalctl -b を実行し、次のような行を探すことで診断できます:

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

公式 PipeWire トラブルシューティングガイドによると、この問題を解決するには /etc/pipewire/media-session.d/alsa-monitor.conf を編集し、api.alsa.headroom = 0 という行のコメントを外し、値を 1024 に変更します。

音がひずむ

  • マイクについては、alsamixer を起動し、問題があるサウンドカードを選択し、Mic BoostInternal Mic Boost の値を下げてみてください。
  • /etc/pipewire/pipewire.confdefault.clock.rate = 48000 のコメントを外して、値を 44100 に下げてみてください。

スタンバイ後に音声の問題が発生する

スリープから復帰した際に音が消えたり壊れたりする場合は、ALSA を最初期化すると改善するかもしれません:

# alsactl init

USB DAC(例:Schiit 社製 DAC)で高レイテンシー

サンプルレートやフォーマットを変更することで、Schiit Hel 2 などの一部の DAC でレイテンシーを減らすことができるかもしれません [8] pipewire-media-session のマッチングルールを使用すると、デバイスのプロパティを設定することができます [9] pipewire-media-sessionalsa-monitor.conf のデフォルト設定を /etc/pipewire/media-session.d~/.config/pipewire/media-session.d にコピーしてください。 そして、以下のような新しいルールブロックを追加してください。

/etc/pipewire/media-session.d/alsa-monitor.conf
~/.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.<node name> ノードは 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 はすべてのフォーマットでサポートされているサンプルレートとなります。

リアルタイムオーディオが動作しない

RTKit error: org.freedesktop.DBus.Error.AccessDeniedsystemctl --user status pipewire.service の出力に表示された場合、pipewire daemon の優先度がリアルタイムに変更されていないことを示します。この問題については、[10] を参照してください。

同じサウンドカード上の複数のシンクへの同時出力

/usr/share/alsa-card-profile/mixer/profile-sets/default.conf のコピーを作成し、アップデート後も変更が持続するようにします。ここでは、アナログと HDMI の2つのデフォルトマッピングを結合したプロファイルを定義しています。

/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 に、新しい card-profile を使用してデバイスをマッチングするように設定します。識別情報は、$ 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以上に設定してみてください。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
            }
        }
    }
...

ビデオ

OBS(など)がウィンドウ/スクリーンを要求しても何も表示されない

xdg-desktop-portalxdg-desktop-portal-gtk または xdg-desktop-portal-kde がインストールされていることが確実なら、デーモンの実行状態を確認してください。

OBS では、すべてがうまくいっていれば、stdout にこのように表示されるはずです。

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

マルチモニタ環境では、slurp パッケージを使用すると、すべての画面をキャプチャすることができます。

参照