PipeWire

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page PipeWire and the translation is 94% complete.
Other languages:

PipeWire は 低レイテンシでグラフベースの、オーディオ・ビデオデバイスと接続するためのプロセッシングエンジンであり、サーバーです。現在 ALSAPulseAudio、及び/又は JACK で処理されているユースケースをサポートするために利用でき、Linuxにおける音声と映像の処理を改善することを目的としています。

PipeWire の主要な機能には以下が含まれます:

  • 最小のレイテンシでの音声及び映像のキャプチャ/プレイバック。
  • マルチメディアのリアルタイム処理。
  • アプリケーション間のマルチメディアコンテンツ共有を可能にするマルチプロセス設計。
  • PulseAudio、JACK、ALSA 及び GStreamer のシームレスなサポート。
  • コンテナ化されたアプリケーションとの通信を容易にするセキュリティモデルを備えた、Flatpak によるアプリケーションサンドボックスのサポート。

PipeWire には、現在、PipeWire デーモン、セッションマネージャーの実例、PipeWire デーモンを検査・使用するためのツール、PipeWire アプリケーションとプラグインを開発するためのライブラリ、そして PipeWire デーモンと PipeWire ライブラリ双方から使用される SPA (Simple Plugin API) が含まれます。

インストール

カーネル

media-video/wireplumber の最近のバージョンを動作させるには、CONFIG_SND_PROC_FSCONFIG_SND_VERBOSE_PROCFS が必要です。

カーネル
Device Drivers  --->
    <*> Sound card support  --->
        <*> Advanced Linux Sound Architecture  --->
            [*]   Sound Proc FS Support
            [*]     Verbose procfs contents

USE フラグ

PipeWire をサウンドサーバーとして使用するには、media-video/pipewiresound-server USE フラグ を指定します[1]

そして、PipeWire を、PulseAudio サウンドサーバーを置き換えるために使用するには:

  1. media-sound/pulseaudio-daemon がインストールされていないことを確認してください。この手順は、2つ以上のサウンドサーバーが動作することによる問題を避けるために必要です。
  2. PipeWire がPulseAudio サウンドサーバーをエミュレートできるようにする、media-libs/libpulse がインストールされていることを確認してください。PipeWire のネイティブな API をサポートしているアプリケーションはまだそう多くありません。
  3. pulseaudio USE フラグが引き続きグローバルにセットされていることを確認してください。

PipeWire は D-Bus セッションバスと XDG に準拠した環境を必要とします。どちらの要件も、いずれかの desktop プロファイルによって満たされるはずです; そのようなシステムでは、PipeWire を開始するには pipewire バイナリを実行するだけで済みます。その他のプロファイルでは、OpenRC を使用している場合、elogind 自体に加え、media-video/wireplumber パッケージの elogind USE フラグが権限の要件を満たすために必要になることがあります。

直接スクリーンキャストを提供するアプリケーションにおいて同機能を有効にするには、関連するパッケージの screencast USE フラグを指定してください。そうしないと、スクリーンキャストについても PulseAudio や JACK の互換レイヤーを通じて提供されることになります。

Cannot load package information. Is the atom media-video/pipewire correct?

Emerge

USE フラグを指定したら、影響されるパッケージを再ビルドします:

root #emerge --ask --verbose --changed-use --update --deep @world

代わりに、PipeWire を独立して emerge することもできますが、通常は前の方法が必要です:

root #emerge --ask media-video/pipewire

通常は、WirePlumber セッションマネージャーもインストールされるはずです。WirePlumber は pipewire-media-session の代替です; 導入と詳細については、この記事を参照してください。media-video/wireplumber パッケージは wireplumber.service systemd サービスと、gentoo-pipewire-launcher によって使用される wireplumber バイナリを提供します。

root #emerge --ask media-video/wireplumber

設定

関連
詳細かつGentoo固有でない設定ドキュメントが プロジェクトの公式ウィキにあります。
ヒント
通常、何も設定しなくてもそれなりにうまく動作します。PipeWire のシステムレベルの設定は何も変更しないままにしておくのが最良です。

audio グループ

PipeWire のデフォルト設定では、オーディオスレッドの優先度を増加させるため、realtime スケジューリングを使用しようと試みます。ユーザーは pipewire グループに所属させることが推奨されます。ユーザーがこのために必要な権限を持っていない場合、設定は代わりに RTKit を使用しようとするため、そのパッケージがインストールされている必要があるかもしれません。この動作は、PipeWire の設定の context.modules という部分で定義されています。

root #usermod -aG pipewire larry
root #emerge --ask sys-auth/rtkit

高速なユーザー切替えで最良の動作が得られるようにするため、デバイスのアクセスコントロールや ACL でaudio グループを使用していない限り、あなたのユーザーを audio グループから削除しておくことが推奨されます:

root #usermod -rG audio larry

また、PipeWire は、これらの設定をユーザー単位または個別のコマンド単位で変更するための複数の環境変数を認識します。

PipeWire をビデオサーバーとして使用するに当たって、追加の設定は不要です; この機能はデフォルトで有効化されています。

ファイルの場所

設定が必要な場合、PipeWire の設定ファイルは以下の場所にあります:

  1. ~/.config/pipewire/pipewire.conf - ユーザーの PipeWire 設定
  2. /etc/pipewire/pipewire.conf - システムの PipeWire 設定
  3. /usr/share/pipewire/pipewire.conf - PipeWire のサンプル設定
メモ
PipeWire の設定ファイルはデフォルトで存在しないため、サンプル設定をコピーして作成する必要があります。
root #cp /usr/share/pipewire/pipewire.conf /etc/pipewire/pipewire.conf
user $cp /usr/share/pipewire/pipewire.conf ~/.config/pipewire/pipewire.conf

設定の断片

0.3.45 以降、設定ファイルの断片を以下のディレクトリ内の(拡張子が .conf の)ファイルにコピーすることができます[2]:

  1. /usr/share/pipewire/pipewire.conf.d/
  2. /etc/pipewire/pipewire.conf.d/
  3. ~/.config/pipewire/pipewire.conf.d/

context.properties

以下の設定オプションは PipeWire の設定の context.properties の下で設定されます

サンプリング周波数

PipeWire はオーディオ処理パイプラインにおいてグローバルサンプリング周波数を使用します。全てのシグナルはこのサンプリング周波数に変換され、それからデバイスのサンプリング周波数に変換されます。

ファイル pipewire.confデフォルトのサンプリング周波数を 192000hz に変更する
context.properties = {
    default.clock.rate = 192000
    default.clock.allowed-rates = [ 192000 48000 44100 ]  # Up to 16 can be specified
}
ヒント
リサンプリングを不要にするため、default.clock.allowed-rates を出力デバイスが対応する周波数を含むように設定してください。[3]
警告
5.16 以前のカーネルにおけるカーネルドライバのバグ のため、これはデフォルトでは有効化されていません。

サウンドサーバーの設定

ヒント
SDDM ユーザーは必ず 適切なサービスを通じて開始してください。さもないと、XDG_RUNTIME_DIR が正しくセットアップされないことがあります。

systemd

PipeWire は、systemd USE フラグとともにビルドされた場合、ソケットとサービスファイルを提供します。

PulseAudio ユーザーサービスが有効になっている場合、無効化してください; これは、ユーザーサービスを使用していない場合であっても安全です。

user $systemctl --user disable --now pulseaudio.socket pulseaudio.service

PipeWire はクッキーファイル以外は ~/.config/pulse/ ディレクトリを利用していないようですが、これをリネーム又は削除しておくのが良いかもしれません。

user $systemctl --user enable --now pipewire.socket pipewire-pulse.socket wireplumber.service

ソケットを有功にするということは、サービスが必要な時のみ開始されるということであり、通常はそれで十分です。しかしながら、pipewire.socket を pipewire.service で置き換えることで、ユーザーがログインした際に必ず開始されるようにすることもできます:

user $systemctl --user enable --now pipewire.service

これらの場合において、--now フラグは任意ですが、おそらく使用しても安全です。なぜなら、デフォルト設定で PipeWire を開始すると単に新たなインターフェースが使用できるようになるだけで、既存のインターフェースは変更されないためです。すなわち、非 PipeWire クライアントは、それまで使用していたのと同じライブラリとサービスを使用しつづけます。

OpenRC

(sysutemd を除いて)グラフィカルシェルを開始する際に PipeWire を読み込む真に標準化された方法はないため、ユーザーはグラフィカル環境が開始される方法に応じて適切なアプローチを選択する必要があります。

重要
systemd ユーザーサービスを使用しない全てのケースにおいて、PipeWire は、ボリュームモニターアプレットなどのサウンド入出力に接続しようとする全てのものより先に開始される必要があります。

前提条件

  • XDG_RUNTIME_DIR

この変数は、通常、systemd-logind、elogind 又は seatd によって設定されます。これらの seat 管理デーモンをいずれも使用していないシステムでは、XDG_RUNTIME_DIR を手動で設定する必要があります。例えば、~/.bash_profile~/.zprofile などの中で:

ファイル
# Ensure XDG_RUNTIME_DIR is set
if test -z "$XDG_RUNTIME_DIR"; then
    export XDG_RUNTIME_DIR=$(mktemp -d /tmp/$(id -u)-runtime-dir.XXX)
fi
  • DBUS_SESSION_BUS_ADDRESS

この変数は、通常、GNOME や KDE のようなデスクトップ環境によって自動的に設定されます。D-Bus セッションバスは、通常、システムの D-Bus サービスによって提供されるものではないことに注意してください。システムの D-Bus サービスは、ハードウェアイベントなど向けの system バスを提供するものです。

i3、bspwm または Sway のようなウィンドウマネージャを実行する場合、WM は DBUS_SESSION_BUS_ADDRESS をセッションに設定する dbus-launch とともに開始する必要があります。例えば、startxを介して X を開始する場合、 ~/.xinitrc の最終行はこのようになります:

ファイル ~/.xinitrc
exec dbus-launch --exit-with-session bspwm

ファイルを解釈しているシェルプロセスが dbus-launch プロセスによって置き換えられるため、この文脈において、exec を使用することは、このファイルの後続のコマンドは一切実行されないことを意味することに注意してください。新しいセッションの内部から実行される必要があるすべてのコマンドは、~/.config/bspwm/bspwmrc のような WM の設定/セットアップファイルに追加するべきです。

より一般的には、dbus-launch はコマンドラインから直接実行することができます:

user $dbus-launch --exit-with-session sway

gentoo-pipewire-launcher

gentoo-pipewire-launcher は以下のものを開始します:

  • PipeWire サーバー;
  • PipeWire サーバーを使用するために必要な WirePlumber セッションマネージャー;
  • PulseAudio との互換性のために必要な pipewire-pulse PipeWire サーバー。

これらを行う前に、スクリプトは既存の PipeWire や WirePlumber インスタンスを終了します。さらなる詳細についてはスクリプト内のコメントを参照してください。

gentoo-pipewire-launcherDBUS_SESSION_BUS_ADDRESS 環境変数が正しく設定された環境の中で開始するべきです。例えば、dbus-launchdbus-run-session によって開始されたプログラムのコンテキスト内などです。

2023年6月14日 / 0.3.71-r2 以降、gentoo-pipewire-launcher${XDG_CONFIG_HOME}/gentoo-pipewire-launcher.conf を通じてロギングをサポートしています。GENTOO_PIPEWIRE_LOGGENTOO_PIPEWIRE_PULSE_LOG 及び GENTOO_WIREPLUMBER_LOG 変数は、各ログファイルが書き込まれるファイルの絶対パスを指定するために利用できます。

GUI 環境 (デスクトップ環境とウィンドウマネージャ)

Gentoo の PipeWire パッケージは、自動開始ファイル /etc/xdg/autostart/pipewire.desktop をインストールします。しかしながら、すべての GUI 環境が自動開始ファイルを使用するわけではありません: Plasma、GNOME、XFCE 及び Cinnamon は使用しますが、様々なウィンドウマネージャ(例えば Fluxbox など)は使用しません。自動開始ファイルを使用する環境では、PipeWire を ~/.xprofile 経由で開始してはいけません; 自動開始ファイルを使用しない環境では、PipeWire を 環境の起動ファイル(以下を参照)または ~/.xprofile (必要に応じて作成してください)から gentoo-pipewire-launcher を起動して PipeWire を開始してください:

ファイル ~/.xprofile
gentoo-pipewire-launcher &

Wayland / Sway / ウィンドウマネージャ

XDG 自動開始のアプローチは、X と同様に Wayland でも動作するはずですが、Wayland セッションを開始するときに .xprofile を引用する必要があるかどうかは定かではありません。

Sway では、~/.config/sway/config を編集して以下を追加します:

ファイル ~/.config/sway/config
exec gentoo-pipewire-launcher &

dwm では、~/.dwm/dwmrc を編集して以下を追加します:

ファイル ~/.dwm/dwmrc
gentoo-pipewire-launcher &

より一般的に、ウィンドウマネージャ を使用する場合、WM の設定/セットアップファイルに gentoo-pipewire-launcher への呼び出しを追加する必要があります。例えば:

ファイル ~/.config/i3/config
exec gentoo-pipewire-launcher &

PipeWire と WirePlumber を再起動する

To restart PipeWire and WirePlumber under OpenRC, e.g. to pick up configuration changes, run gentoo-pipewire-launcher with the restart argument to have it first shut down the existing instances from within the relevant D-Bus session:

user $nohup gentoo-pipewire-launcher restart &

nohup を使用することで、gentoo-pipewire-launcher が終了していなくてもターミナルが閉じられるようになります。出力がどこへ向けられるかは nohup の実装によります; シェルによって、nohup は組み込みコマンドであることも、外部コマンド(例えば nohup(1))であることもあるので、シェルのドキュメンテーションを確認してください。

Note that due to this wireplumber bug, nohup may not work, so you may need to use an alternative. In Bash, for instance, you can omit nohup, and then run disown right afterwards:

user $gentoo-pipewire-launcher restart &
user $disown

PulseAudio サーバーのエミュレーションを検証する

user $LANG=C pactl info | grep "Server Name"
Server Name: PulseAudio (on PipeWire 0.3.39)

複数ユーザーのサポートを追加する

デフォルト設定では、音声を再生できるのはカレントユーザー(pipewire-pulse を開始した人) だけです。

複数ユーザーをサポートするには、TCP インターフェースが必要です:

user $cp -r /usr/share/pipewire/ /etc/
user $$EDITOR /etc/pipewire/pipewire-pulse.conf

server.address = [ セクションを見つけ、利用可能な TCP オプションの1つをアンコメントしてください。

使い方

Controlling the volume

Pipewire volume can be controlled using Pulseaudio tools like pactl (media-libs/libpulse). It can also be controlled without depending on Pulseaudio:

Using wpctl (media-video/wireplumber). Example: to increase volume by 2%:

user $wpctl set-volume @DEFAULT_AUDIO_SINK@ 2%+

Or using pw-cli (media-video/pipewire):[4]

1. Find the stream node id:

user $pw-cli ls Node

2. Change the needed properties (To introspect the properties of a node, run pw-cli e <node-id> Props). Example: to unmute and set volume to 0.3:

user $pw-cli s <node-id> Props '{ mute: false, channelVolumes: [ 0.3, 0.3 ] }'

サンプリング周波数を確認する

pw-metadata を使って現在のサンプリング周波数やその他の設定を確認することができます:

user $pw-metadata -n settings
Found "settings" metadata 31
update: id:0 key:'log.level' value:'2' type:''
update: id:0 key:'clock.rate' value:'192000' type:''
update: id:0 key:'clock.allowed-rates' value:'[ 192000, 48000, 44100 ]' type:''
update: id:0 key:'clock.quantum' value:'1024' type:''
update: id:0 key:'clock.min-quantum' value:'32' type:''
update: id:0 key:'clock.max-quantum' value:'2048' type:''
update: id:0 key:'clock.force-quantum' value:'0' type:''
update: id:0 key:'clock.force-rate' value:'0' type:''

PulseAudio サーバー

PipeWire を PulseAudio のバックエンドとして使用している場合、サンプリング周波数とビット深度、あるいは Default Sample Specification を以下のように確認できます:

user $pactl info
Server String: /run/user/1000/pulse/native
Library Protocol Version: 35
Server Protocol Version: 35
Is Local: yes
Client Index: 213
Tile Size: 65472
User Name: larry
Host Name: gentoo
Server Name: PulseAudio (on PipeWire 0.3.71)
Server Version: 15.0.0
Default Sample Specification: float32le 2ch 192000Hz
Default Channel Map: front-left,front-right
Default Sink: alsa_output.usb-Generic_USB_Audio-00.pro-output-2
Default Source: alsa_input.usb-Focusrite_Scarlett_Solo_USB-00.pro-input-0

実行時にサンプリング周波数を設定する

pw-metadata -n settings 0 clock.rate を使用して、実行時にクロック周波数を調整することができます:

user $pw-metadata -n settings 0 clock.rate 384000
Found "settings" metadata 31
set property: id:0 key:clock.rate value:384000 type:(null)
ヒント
結果は pw-metadata -n settings で検証できます。この方法は、それ以外の設定値についても使用できます。

JACK を置き換える

現時点で Gentoo でサポートされている、JACK クライアントを PipeWire を経由してルーティングするための唯一の方法は、それらを pw-jack を通じて実行することです。これは、LD_PRELOAD を利用して、クライアントを JACK の本来のライブラリから PipeWire の代替ライブラリへリダイレクトします:

user $pw-jack qsynth
重要
既存の JACK ユーザーは、おそらく realtime ケーパビリティをセットアップしているでしょうが、新規ユーザーは、JACK エミュレーションを使用するすべての PipeWire ユーザーについて RLIMIT_MEMLOCK の値を Gentoo のデフォルト値である 64 キロバイトから 256 キロバイトに増加するよう推奨します。これを実現する方法についての案内は、下の小節(このページの目次にも含まれています)を参照してください。これを実行しないと、単一のページフォルトを解決するためにカーネル時間においてバッファーの半分から全部を費やすことになるため、少なくともバッファー不足 (xruns) が繰り返し引き起こされる可能性があります。

PipeWire の不完全性や Gentoo の設定の欠点のため、すべてのクライアントが動作するわけではないことに注意してください。いくつかのクライアントは、シンボルが欠けているため見苦しく終了するかもしれません。また、古い設定ファイルがあればそちらを利用しようとするため、JACK クライアントの再設定が必要になることもあります。

代わりに、PipeWire を本物の jackd に接続して、非 JACK アプリケーション向けのゲートウェイとして振る舞わせることもできますが、JACK のユーザー体験は全体的に劣っているため、既に動作している JACK が構成されている場合を除いてこれは推奨されません。

media-sound/ardour のようなアプリケーションにおいて録音が途切れる問題は、以下のような WirePlumber スクリプトを使用することで解決できます:

ファイル ~/.config/wireplumber/main.lua.d/latency.lua
table.insert(alsa_monitor.rules, {
  matches = {
    {
      -- replace device as described below
      { "node.name", "equals", "device" },
    },
  },
  apply_properties = {
    -- If 64 doesn't work, try bigger values that are a power of 2 (128, 256, 512, 1024, 2048, etc.)
    ["api.alsa.headroom"] = 64,
  },
})

以下を実行すると:

user $wpctl status

現在システムで利用可能なデバイスの一覧が出力されます。オーディオデバイスは、Audio -> Sinks の下に表示されます (どれを選べば良いか分かりませんか? まずは星 (*) が付いているものを選んでみてください。これは、現在使用されているデバイスを表しています)。 この番号を覚えてから、以下を実行してください:

user $wpctl inspect <number> | grep node.name

これは、例えば * node.name = "alsa_output.usb-Lenovo_ThinkPad.analog-stereo" のような 1 行を出力します。スクリプトの device は、出力されたデバイス(この例では alsa_output.usb-Lenovo_ThinkPad.analog-stereo になります)に置き換えてください。PipeWire を再起動すると、問題が解決されているはずです。問題が解決しない場合、ここここで詳細を参照してください。

トラブルシューティング

Chrome のスクリーン共有が動作しない

chrome://flags で "WebRTC PipeWire support" を"Enabled" に変更してください。

CS:GO (や Valve's Source engine を使ったその他のゲーム)

メモ
この問題は Valve による 2021年初めのパッチにより解決されたようです。もしこの問題が何も修正を適用しなくても発生しないようになっているようであれば、この小節全体を削除してください。

デフォルトのサウンドバッファーの大きさは 0.025 です。これはしばしば低すぎるため、音割れを引き起こします; 現在のところ、対策は、CS:GO 内からアプリケーションのオーディオバッファーのサイズを増やすことです[5][6]:

snd_mixahead は秒単位のサウンドバッファーの大きさであり、0.05 は 50ms です(デフォルトは 0.10、edited: 25ms です)。これは本質的には音声の遅延であり、これを削減することでよりよい同期が得られます。ただし、すべてのハードウェアがこの低いバッファー設定を処理できるわけではないので、0.05 で音割れやポップノイズがある場合、音割れ/ポップノイズが消えるまでこの設定を 0.01 ずつ増やしてください。

JACK クライアント(や OpenRC を使用する PulseAudio のクライアント)の RLIMIT_MEMLOCK を増やす

バッファーのメモリーロックをユーザーサービスが行う PulseAudio クライアントの場合と異なり、JACK クライアントは自らそれを行います。クライアントがメモリーロックの失敗を報告した場合、PulseAudio の RLIMIT_MEMLOCK に関する前の小節で説明したハードな制限(許容される最大値)に加え、ソフトな制限(デフォルト値) についても増やす必要があります:

ファイル /etc/security/limits.d/50-custom.conf
# これで、非システムアカウント(nobody を除く)で実行されるすべてのプロセスについて、ロック可能なメモリの最大値とデフォルトを両方ともデフォルトの 64 キロバイトから 256 キロバイトに(''ページサイズ''刻みで)増やせます。
1000:65533      -    memlock 256

Bluetooth

重要
PipeWire では、pulseaudio USE フラグとともにビルドされた場合、既に bluez5 モジュールが有効になっています。クライアント向けの PulseAudio API がすぐになくなることはありませんから、このフラグがシステム全体について設定されていることを確認してください。

現時点での主要なユースケースは、PA を置き換えるのではなく、追加して利用する形であるため、Bluetooth のサポートは、デフォルトでは PulseAudio の Bluetooth スタックとの衝突を避けるために無効になっています。Blluetooth デバイスをリストアップするには、PipeWire の bluez5 モジュールをアンコメントしてください:

ファイル /etc/pipewire/media-session.d/media-session.conf
...
modules = {
    ...
    default = [
        ...
        bluez5          # bluetooth support
        ...
    ]
    ...

その後、以下を実行します:

user $systemctl --user restart pipewire-pulse.service

(OpenRC を使用して)クラッシュ後に PipeWire を再起動する

PipeWire がクラッシュすると、すべてのサウンドデバイスが消失します。3つのプロセスを作成する必要があります:

  1. pipewire
  2. wireplumber
  3. pipewire -c pipewire-pulse.conf

これらを直接実行しないでください。代わりに、これらを以下のようにして開始します:

user $/usr/bin/gentoo-pipewire-launcher &

これは、実行中の D-Bus セッションバスのある環境(例えばデスクトップ)から実行してください。D-Bus セッションバスのある環境では、DBUS_SESSION_BUS_ADDRESS 変数が設定されているでしょう; 設定されていない場合、環境で D-Bus セッションバスが実行されているか確認する方法について OpenRC 節を参照してください。

Crackling and stuttering

Crackling and stuttering might be reduced or eliminated by setting default.clock.min-quantum appropriately in pipewire.conf[7]:

ファイル /etc/pipewire/pipewire.conf
default.clock.min-quantum = 2048

関連項目

外部資料

参照