PipeWire
PipeWire は新しい低レベルマルチメディアフレームワークです。 映像と音声を最小の遅延で再生/キャプチャすることを目的としていて、PulseAudio、JACK、ALSA、GStreamer をベースとしたアプリケーションと互換性があります。
このフレームワークのデーモンは (PulseAudio と JACK の機能を持った) オーディオサーバーとしても、ビデオキャプチャサーバーとしても設定できます。
また PipeWire は Flatpak のようなコンテナをサポートしており、audio や video ユーザーグループに依存するのではなく、Flatpak や Wayland にスクリーンや音声を録音する許可を求める Polkit のようなセキュリティモデルを使用しています。
目次
- 1 インストール
- 2 設定
- 3 使用方法
- 4 音声のポストプロセッシング
- 5 トラブルシューティング
- 5.1 オーディオ
- 5.1.1 PipeWire にマイクが検出されない
- 5.1.2 サウンドが自動的に Bluetooth ヘッドフォンに切り替わらない
- 5.1.3 Bluetooth デバイスに接続しても音が出ない
- 5.1.4 音量が小さい
- 5.1.5 increasing RLIMIT_MEMLOCK
- 5.1.6 サンプリングレートを変更する
- 5.1.7 音質(リサンプリング品質)
- 5.1.8 外付けサウンドカードが再接続後に有効にならない
- 5.1.9 音が出ないまたは pactl info が Failure: Connection refused と表示する
- 5.1.10 Bluetooth の音声の品質が低い
- 5.1.11 PipeWire の更新 (git / >=0.3.23) と再起動後デバイスが検出されない
- 5.1.12 再生開始時に音声に遅延が発生する
- 5.1.13 複数のストリームの再生開始時に音声が途切れる
- 5.1.14 音がひずむ
- 5.1.15 スタンバイ後に音声の問題が発生する
- 5.1.16 USB DAC(例:Schiit 社製 DAC)で高レイテンシー
- 5.1.17 リアルタイムオーディオが動作しない
- 5.1.18 同じサウンドカード上の複数のシンクへの同時出力
- 5.1.19 Discord から通知音が鳴らない
- 5.2 ビデオ
- 5.1 オーディオ
- 6 参照
インストール
公式リポジトリから pipewire パッケージを インストール してください。multilib に対応した lib32-pipewire もあります。
Pipewire は systemd/ユーザー を使ってサーバーを管理し、ソケットを自動で起動します。
オプションとして、pipewire-docs をインストールすると、ドキュメントを確認することができます。
Pipewire は、他のオーディオサーバーと置き換えることができます。詳しくは オーディオ を参照してください。
セッション マネージャー
JACK と同様、PipeWire は内部で接続ロジックを実装していません。新しいストリームを監視し、適切な出力デバイスやアプリケーションに接続する負担は、セッションマネージャーとして知られる外部のコンポーネントに任されています。
現在、2つのセッションマネージャーが利用可能です。
- PipeWire Media Session — いくつかの基本的なデスクトップのユースケースに対応した非常にシンプルなセッションマネージャです。これは主にテスト用と新しいセッションマネージャを構築するための例として実装されました。
- WirePlumber — より強力なマネージャであり、現在の推奨品です。モジュール設計に基づいており、実際の管理機能を実装する Lua プラグインがあります。
PipeWire のインストール時に、どちらかを選ぶように指示されます。後で適切なパッケージをインストールすることで、もう一方のオプションと衝突しますが、置き換えることで切り替えが可能です。
GUI
- Helvum — PipeWire 用の GTK 製のパッチベイ。 JACK のツールの catia にインスパイアされた。
- qpwgraph — Qt-based Graph/Patchbay for PipeWire, inspired by the JACK tool QjackCtl.
設定
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 をインストールします。このパッケージは pulseaudio と pulseaudio-bluetooth を置き換えます。再起動するか、ログインし直すか、systemctl start --user pipewire-pulse.service
を実行すると有効化されます。
パッケージがユーザーサービス pipewire-pulse.socket
を自動的に有効化するので、通常それ以上の操作は不要です。置き換えが機能しているかどうかを確認するには、次のコマンドを実行して出力を確認してください:
$ pactl info
... Server Name: PulseAudio (on PipeWire 0.3.16) ...
システム起動時に PipeWire が正しく機能しない場合は、ユーザーサービス pipewire-pulse.service
と pipewire.service
と pipewire-media-session.service
が起動して実行されているか確認します。pipewire-pulse.service
と pipewire-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 をインストールするか、jack か jack2 をアンインストールして 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つが必要です。利用可能なバックエンドは次のとおりです:
- GNOME の場合、xdg-desktop-portal-gtk
- KDE の場合、xdg-desktop-portal-kde
- LXQt の場合、xdg-desktop-portal-lxqt
- wlroots ベースのコンポジター (Sway や dwl など) の場合、xdg-desktop-portal-wlr
After installing a backend, you need to restart the xdg-desktop-portal.service
user unit. This also starts the service if it has not started already.
Firefox (バージョン84以降) はデフォルトでこの方法をサポートしていますが、Chromium (バージョン73以降) では、WebRTC PipeWireサポートを次のURLの実験的機能の設定を変更して有効にする必要があります:
chrome://flags/#enable-webrtc-pipewire-capturer
xdg-desktop-portal-wlr
を動かすには pipewire-media-session をインストール[3]して、セッション内で環境変数を XDG_CURRENT_DESKTOP=sway
のように設定する必要があります[4]。同様に XDG_SESSION_TYPE=wayland
も設定する必要があります[5]。
唯一サポートされている機能はデスクトップ全体の共有で、特定のアプリケーション/ウィンドウの共有はサポートされていません。[6][7]
xdg-desktop-portal-wlr
XDG_CURRENT_DESKTOP
と WAYLAND_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
を、例えばコンポジターの設定ファイルを使って実行することです。詳しくは [8] と [9] を参照してください。
映像
ソフトウェアはまだ商業利用には適していませんが、試す分には問題ありません。GStreamer を使用して映像ストリームを処理するほとんどのアプリケーションは PipeWire GStreamer プラグインを使用して設定なしで動作するはずです (GStreamer#PipeWireを参照してください)。そのため既に cheese のようなアプリケーションは PipeWire を使用して映像入力を利用できます。
音声のポストプロセッシング
EasyEffects
EasyEffects (以前は PulseEffects と呼ばれていました) は多数のエフェクトとフィルタを個々の入出力ストリーム (アプリケーションの音声出力やマイクの入力など) に提供する GTK 製のユーティリティです。注目すべきエフェクトには、入出力イコライザー、出力ラウドネス等化、ベースエンハンスメント、入力ディエッサー、ノイズ抑制プラグインなどがあります。GitHub ページにエフェクトの一覧があります。
EasyEffects を使用するには、easyeffects をインストールします。プリセット設定集については、コミュニティープリセットを参照してください。
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-pulse と pipewire-jack と carla をインストールします。はじめに 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
トラブルシューティング
オーディオ
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.conf
の default.clock.rate = 48000
行を編集することで行うことができます。例えば、192kHz にしたい場合は、48000
を default.clock.rate = 192000
にコメントを解除して変更します。
PipeWire は、DAC がサポートする出力サンプルレートを変更することもできます。設定するには、default.clock.allowed-rates = [ 48000 ]
という行をコメント解除して設定します。例えば、[ 44100 48000 88200 96000 ]
とします。サンプルレートは、カードがアイドルのときに再生されるオーディオストリームのサンプルレートに従います。
どの出力サンプルレートとサンプルフォーマットが DAC に送られたデータであるかを確認するには(おそらく桁を変更する必要があります)。
cat /proc/asound/card0/pcm0p/sub0/hw_params
どの入力サンプルレートを使用しているかを確認するには、pcm0p
を pcm0c
に変更します。(c
は "capture" の略、p
は "playback" の略です).
音質(リサンプリング品質)
PulseAudio を resample-method = speex-float-10
または soxr-vhq
で使用していた場合、コメントを解除して resample.XXX
を変更することを検討するとよいかもしれません。resample.quality = 4
を 10
または最大値 15
に変更することを検討してください。(存在しない場合は /usr/share/pipewire/
からコピーしてください)。PipeWire の再起動を忘れないでください (sudo なし): systemctl --user restart pipewire.service pipewire-pulse.socket
(設定変更を適用させたい場合は、pipewire-pulse.socket
を絶対に忘れないでください)。
10
と 15
では、品質の差はほとんどありませんが、CPU 負荷は2〜3倍になっています。また、4
, 10
, 15
のレイテンシーの差はまだ誰も調べていません。Ryzen 2600 で 44100→48000Hz で resample.quality = 15
にすると pipewire
や pipewire-pulse
プロセスが 1CPUコア4.0% の負荷となる。
リサンプラーの比較はこちら:https://src.infinitewave.ca/(18KHz以上、120dB以上は注意)。speeex は 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/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.conf
の bluez5.codecs
を sbc 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[10] の時点で新しい 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-seconds
を 0
に変更してサスペンドを無効にするか、他の値を試して動作を確認してみてください。/etc/pipewire/media-session.d/media-session.conf
の suspend-node
の行をコメントアウトすることもできます。変更を適用するには pipewire
と pipewire-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 Boost
やInternal Mic Boost
の値を下げてみてください。 /etc/pipewire/pipewire.conf
のdefault.clock.rate = 48000
のコメントを外して、値を44100
に下げてみてください。
スタンバイ後に音声の問題が発生する
スリープから復帰した際に音が消えたり壊れたりする場合は、ALSA を最初期化すると改善するかもしれません:
# alsactl init
USB DAC(例:Schiit 社製 DAC)で高レイテンシー
サンプルレートやフォーマットを変更することで、Schiit Hel 2 などの一部の DAC でレイテンシーを減らすことができるかもしれません [11] pipewire-media-session のマッチングルールを使用すると、デバイスのプロパティを設定することができます [12]
pipewire-media-session の alsa-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.AccessDenied
が systemctl --user status pipewire.service
の出力に表示された場合、pipewire daemon の優先度がリアルタイムに変更されていないことを示します。この問題については、[13] を参照してください。
同じサウンドカード上の複数のシンクへの同時出力
/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-portal と xdg-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 パッケージを使用すると、すべての画面をキャプチャすることができます。
参照
- Wiki — PipeWire Wiki on Freedesktop GitLab
- Pipewire Update Blog Post — PipeWire の2018年1月時点での進捗が書かれた記事
- PipeWire Late Summer Update 2020 — 2020年9月からの記事