ラズパイに音付きでリモート接続して操作する(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