ラズパイに音付きでリモート接続して操作する(xrdp+pulseaudio)
やりたいこと
Raspberry Piにxrdpを使ったリモート接続をします。例えばそこで動画の再生を行ったら映像+音声を手元のPCで視聴できる、そういう環境を作りたいと思います。
今回解決する課題
RDP(Remote Desktop Protocol)自体はWindows系でよく使われるものですが、MacやLinuxでも扱える環境が整っています。VNCは映像、音声、操作系をそのままネットワークにぶん投げるというイメージもあって、それよりは高級なことができる(はず)RDPを使うことにします。
音声の問題
音声はpulseaudioというサービスによってネットワーク上へリダイレクトする形になります。しかし、Raspberry Pi Desktopの環境で試すとどうやらこの音声リダイレクトが上手く行かないということがわかりました。これを今回解決していく、というのが趣旨になります。
余談ですが、2020年12月2日にpulseaudioはデフォルトでRaspberry Piに入るようになったそうです。それ以前はALSAだそうです。音関係の環境が変わったことでちょっとややこしかった。
テスト環境
- Raspberry Pi 4 (memory4GB)
- Raspberry Pi OS with desktop (Kernel version: 5.10)
- ssh接続
- sudo apt update && sudo apt upgrade済み
- RDPクライアント:Mac版Microsoft Remote Desktop
- ユーザーはデフォルトのpi
- 作業ディレクトリは/home/pi/pulsetest/ということにします(任意に変えてください)
導入するもの
最終的に目指す状態
pulseaudio自体はsystemdのuserモードで動作しているので触りません。また、今のRaspberry OSでは自動で立ち上がるようにもなっています。なのでこれはこのまま使います。
pi 573 0.0 0.1 14728 7364 ? Ss 16:32 0:00 /lib/systemd/systemd --user pi 679 0.0 0.2 367732 8616 ? S<sl 16:33 0:00 \_ /usr/bin/pulseaudio --daemonize=no
/usr/lib/pulse-12.2/modulesにxrdpで音声をリダイレクトするためのxrdp-sinkが足りないので、これを入れるということになります。
導入
注意点
途中「pulseaudio-12.2」のようなVer入りのフォルダ名が出てきますが、これは私がテストした時点(2021-05-05)のものです。状況に合わせて書き換えて下さい。
xrdpインストール
sudo apt install xrdp
neutrinolabs/pulseaudio-module-xrdpインストール
後の作業でエラーになるので、sources.listを書き換えます。といっても最後の行のコメントアウトを外すだけです。
sudo vi /etc/apt/sources.list deb http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi # Uncomment line below then 'apt-get update' to enable 'apt-get source' # deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi <- コメントアウトを外す sudo apt update <- updateを忘れるとエラーが出るので注意
次の作業はmake、make installは必要ありません。後工程で使うファイルを生成するだけです。
cd ~/pulsetest sudo apt build-dep pulseaudio ・・・トラブル① apt source pulseaudio cd pulseaudio-12.2 sudo ./configure
下記の、./configure PULSE_DIR=/home/pi/pulsetest/pulseaudio-12.2 ですがPATHは絶対パスで指定します。ここでPATHは上記の前工程で./configureを実行したディレクトリです。
sudo apt install libpulse-dev cd ~/pulsetest git clone https://github.com/neutrinolabs/pulseaudio-module-xrdp.git cd pulseaudio-module-xrdp sudo ./bootstrap sudo ./configure PULSE_DIR=/home/pi/pulsetest/pulseaudio-12.2 ・・・トラブル② sudo make sudo make install
確認作業
ls $(pkg-config --variable=modlibexecdir libpulse) もしくは ls /usr/lib/pulse-12.2/modules ↓これらが作られていればok -rwxr-xr-x 1 root root 980 module-xrdp-sink.la -rwxr-xr-x 1 root root 67456 module-xrdp-sink.so -rwxr-xr-x 1 root root 992 module-xrdp-source.la -rwxr-xr-x 1 root root 66088 module-xrdp-source.so
pulseaudio再起動
userモードなのでpiユーザー上で動きます(sudoもいらないです)
systemctl --user restart pulseaudio.service ・・・トラブル③
RDPで繋いでみる
Raspberry PiのローカルIPで繋がります。
アカウント名はラズパイのログインIDでokです。xrdpの設定は特に必要ありません。
適当に音声ファイルをDLしてVLCで再生してみます。音が出ていれば完成です。
時折ドライバ周りのエラー(/var/syslog内)が確認できてます。そのような場合はpulseaudioを再起動すれば大抵直るようです。
systemctl --user restart pulseaudio.service
今回起きたトラブル
トラブル① sudo apt build-dep pulseaudio
/etc/apt/sources.listの操作をしない場合、以下のようなエラーメッセージが出ます。
deb http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi # Uncomment line below then 'apt-get update' to enable 'apt-get source' deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
トラブル② ./configure PULSE_DIR=/home/pi/pulsetest/pulseaudio-12.2
libpulse-devが入ってないと起きます。
(略) checking for LIBPULSE... no configure: error: Package requirements (libpulse) were not met: No package 'libpulse' found Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix.
トラブル③ pulseaudioのエラー
色々なエラーが起きます。全部解決するのは時間かかりそうなので今回はパスします。ドライバのバグとかだったらお手上げだし。
とりあえず困ったらsystemctl –user restart pulseaudio.serviceです。スマートじゃないけどね。
May 6 08:06:35 raspberrypi pulseaudio[808]: E: [alsa-sink-bcm2835 HDMI 1] alsa-sink.c: ALSA woke us up to write new data to the device, but there was actually nothing to write. May 6 08:06:35 raspberrypi pulseaudio[808]: E: [alsa-sink-bcm2835 HDMI 1] alsa-sink.c: Most likely this is a bug in the ALSA driver 'snd_bcm2835'. Please report this issue to the ALSA developers. May 6 08:06:35 raspberrypi pulseaudio[808]: E: [alsa-sink-bcm2835 HDMI 1] alsa-sink.c: We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail.
参考
https://github.com/neutrinolabs/pulseaudio-module-xrdp