ArchLinux をインストールして NAS として使っている Raspberry Pi。SSH の X11 Forwarding を使って VLC や ffplay(avplay)で音楽再生したいなぁ、と。あと、Chromium で実行している艦これの音声を拾ったりとか。
ここでは Pulse オーディオを使用する。Pulse サーバとクライアントの設定にはいくつかの方法があるが、今回は pulseaudio
同士で接続する方法と RTP による送受信を試した。
RTP で再生
1.「Pulse サーバで RTP 送信を行う」
module-rtp-send
をロードする。
pactl load-module module-rtp-send
特に何も指定しない場合、224.0.0.56
で発信される。
2.「クライアントで受信を行う」
pulseaudio
を使用する場合は module-rtp-recv
モジュールをロードするだけでよい。これだけで SSH クライアントマシンがスピーカー扱いのようになる。
pactl load-module module-rtp-recv
音声をキャプチャしたりする場合は、VLC や ffplay(avplay)などの RTP に対応しているものがあればよい。(module-rtp-send
でポートを指定しなかった場合は netstat
などで調べておく必要があるかもしれない)
ffplay rtp://224.0.0.56:46434
vlc rtp://224.0.0.45:46434
X11 Forwarding を使って Raspberry Pi で Chromium を起動して、クライアント側の ffplay で音楽をキャプチャしてみた。
設定ファイルを使用する場合(module-rtp-send)
/etc/pulse/default.pa
を ~/.config/pulse/default.pa
にコピーし、module-rtp-send
を有効にしておけば実行中はどのデバイスからもアクセスすることができる。
load-module module-null-sink sink_name=rtp format=s16be channels=2 rate=44100 sink_properties="device.description='RTP Multicast Sink'"
load-module module-rtp-send source=rtp.monitor
あとは受け側で module-rtp-recv
をロードするだけで勝手に再生される。
pactl load-module module-rtp-recv
TCP で再生
1.「Pulse サーバで TCP モジュールをロードする」
SSH クライアント側でモジュールをロードする。ここで言う「SSH クライアント」とは「Pulse サーバ」である。今回は認証を行わないことにするが、auth-ip-acl=127.0.0.1
などとすることで許可するクライアントを指定することもできる。
Pulse サーバの起動とモジュールのロードは pulseaudio
コマンドか pactl
コマンドで行うことができる。
pactl load-module module-native-protocol-tcp auth-anonymous=true
または
pulseaudio --start --load="module-native-protocol-tcp auth-anonymous=true"
auth-anonymous=true
は auth-anonymous=1
とも書けるみたい。
2.「PULSE_SERVER 環境変数で Pulse サーバへ接続する」
SSH でサーバへ接続した後、アプリケーションを起動する。その際、PULSE_SERVER
環境変数で Pulse サーバの IP アドレスを指定する。ここでは「SSH クライアント = Pulse サーバ」ということになるので SSH_CLIENT
環境変数から IP アドレスを抜き出して使う。
PULSE_SERVER=`echo $SSH_CLIENT | awk '{ print $1 }'` vlc *.m4a
awk
を使わずにシェルで置換展開が使える場合はそちらの方が楽である。
PULSE_SERVER=${SSH_CLIENT%% *} vlc *.m4a
設定ファイルを使用する場合(module-native-protocol-tcp)
Pulse サーバ(SSH クライアント)
pulse の設定ファイルをコピーする。
cp /etc/pulse/default.pa ~/.config/pulse
コピーした ~/.config/pulse/default.pa
を編集して module-native-protocol-tcp
をロードするようにしておく。
#load-module module-native-protocol-tcp
load-module module-native-protocol-tcp auth-anonymous=true
pulseaudio
を再起動する。
pulseaudio --kill pulseaudio --start
Pulse クライアント(SSH サーバ)
Pulse クライアント用の設定ファイルをコピーする。
cp /etc/pulse/client.conf ~/.config/pulse
コピーした ~/.config/pulse/client.conf
の default-server
に Pulse サーバ(SSH クライアント)の IP を指定する。
; default-server = default-server = 192.168.1.2
pulseaudio
を再起動する。
pulseaudio --kill pulseaudio --start
SSH クライントから接続し、アプリケーションを実行すれば Pulse サーバ側で音が鳴る。Pulse サーバの IP アドレスは ~/.config/pulse/client.conf
に書いてあるので PULSE_SERVER
環境変数の設定は不要。