PipeWire

提供: ArchWiki
2021年7月21日 (水) 23:41時点におけるOriaca372m (トーク | 投稿記録)による版 (同期)
ナビゲーションに移動 検索に移動

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

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

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

インストール

公式リポジトリの pipewire パッケージをインストールします。

PipeWire は systemd/ユーザー を使用してサーバーの管理とソケットアクティベーションを行います。

必要に応じて pipewire-docs をインストールしてドキュメントを確認することもできます。pipewire-alsapipewire-pulsepipewire-jack などの他のパッケージは PulseAudio/JACKの代わりに PipeWire を使用したい場合を除き必要ありません。multilib サポートのために lib32-pipewirelib32-pipewire-jack も利用できます。

GUI

  • Helvum — PipeWire 用の GTK 製のパッチベイ。 JACK のツールの catia にインスパイアされた。
https://gitlab.freedesktop.org/ryuukyu/helvum || helvumAUR, helvum-gitAUR

使用方法

WebRTC 画面共有

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

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

Firefox (バージョン84以降) はデフォルトでこの方法をサポートしていますが、Chromium (バージョン73以降) では、WebRTC PipeWireサポートを次のURLの実験的機能の設定を変更して有効にする必要があります:

chrome://flags/#enable-webrtc-pipewire-capturer

xdg-desktop-portal-wlr を動かすには pipewire-media-session をインストール[1]して、セッション内で環境変数を XDG_CURRENT_DESKTOP=sway のように設定する必要があります[2]。同様に XDG_SESSION_TYPE=wayland も設定する必要があります[3]

ヒント: 複数のモニタがある場合に xdg-desktop-portal-wlr を使用してそれぞれのモニターを共有するには、ユニットの ExecStart= オプションを編集して --output=Monitor フラグを追加してください。行全体は ExecStart=@libexecdir@/xdg-desktop-portal-wlr --output=eDP-1 のようになります。

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

映像

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

音声

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 モジュールを有効にします。

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

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

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

EasyEffects

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

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

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

NoiseTorch

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

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

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 の互換性レイヤーは次回起動時も出力先を覚えています)。

トラブルシューティング

この記事またはセクションは情報が古くなっています。
理由: デフォルトの設定ファイルは /etc/pipewire から /usr/share/pipewire に移動しました。以前と同様にシステム全体に対する設定は /etc/pipewire で、ユーザーに対する設定は $HOME/.config/pipewire/ で行いますが、デフォルトの設定を /usr/share/pipewire からコピーする必要があります。https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/1609126bcd720304b7a4c81b87cc3e70ae91ff44 (Discuss)

PipeWire にマイクが検出されない

PipeWire の alsa-monitor モジュールは、デフォルトで alsa-card-profiles を使用してデバイスを検出します。これでうまくいかない場合は、/etc/pipewire/media-session.d/alsa-monitor.confrules -> 最初のルール -> actions -> update-propsapi.alsa.use-acpfalse にするか、または api.alsa.use-ucmtrue にしてみてください:

...
update-props = {
    api.alsa.use-acp = false
...

次に 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 デバイスに接続しても音が出ない

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 にしたい場合、コメントを外して 48000192000 に変更します。

外付けサウンドカードが再接続後に有効にならない

~/.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[6] の時点で新しい 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

参照