mattintosh note

どこかのエンジニアモドキの備忘録

X11 Forwarding で音声を再生する

ArchLinux をインストールして NAS として使っている Raspberry Pi。SSHX11 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 で音楽をキャプチャしてみた。

f:id:mattintosh4:20160102004102p:plain

設定ファイルを使用する場合(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=trueauth-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.confdefault-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 環境変数の設定は不要。