初老のボケ防止日記

おっさんのひとりごとだから気にしないようにな。

Raspberry Pi 3とポタアンで音楽を再生するネットワークオーディオプレーヤーを作った(AirPlay編)

えっ、エアリプはAirPlayじゃないの?
前回までにRaspberry Pi 3(RPi3)をDLNA経由で外部にある音源を再生するネットワークオーディオプレーヤー化しました。

osa030.hatenablog.com

これだと、AndroidスマホやNASにある自前の音源ファイルは再生できるのだけれども、

音楽配信アプリの再生ができない。

ここでいう、音楽配信アプリといのは具体的には以下の様なもの。

  • Amazon PrimeMusic
  • AWA
  • LINE MUSIC
  • Radiko

つまり曲の音源ファイル自体が自分のものではなく、各サービスが所有している(配信可能な)音源を専用アプリを通じてインターネット経由でストリーミング再生しているもの。Radikoは音楽配信ではなくラジオなんだけどとかそういう細かいこという人はオジサン嫌いです。

さて、どうしてこれらができないのかというと、それぞれサービス独自の方式で配信されているので、DLNA等の標準的な方式では対応できないのだ。ていうかRadiko以外は有料サービスなのでそんなに簡単に誰でも再生できちゃうと儲からないから当たり前だよねーとやっぱりそうだよねーしょうがないよなーと、

諦めたらそこでお小遣い無駄になりますよ。

そういうわけでなんとかならないものか色々と考えてみた。

RPi3で音楽配信アプリの音楽を再生する方法を考える

選曲などの操作はAndroidデバイスで行い、RPi3に接続されたポタアン経由で音楽が再生されるという方式を変えたくはない。そこの前提でいくつかの方法を考えてみた。

  1. Androidデバイス上の音楽配信アプリの音声をBubbleUPnPのDNAストリーミングで飛ばす
  2. Androidデバイス上の音楽配信アプリの音声をChromecastで飛ばす
  3. Androidデバイス上の音楽配信アプリの音声をAirPlayで飛ばす
  4. Androidデバイス上の音楽配信アプリの音声をどうにかこうにか飛ばす
  5. Androidデバイス上の音楽配信アプリの音声をBluetoothで飛ばす
  6. もういっそのことRPi3上で音楽配信アプリを再生するけど操作はAndroidスマホ上でやる
  7. iOSデバイス上の音楽配信アプリの音声をAirPlayで飛ばす

よーし、順番に検討だ

1.Androidデバイス上の音楽配信アプリの音声をBubbleUPnPのDNAストリーミングで飛ばす

AndoroidのDLNA再生アプリである、BubbleUPnPには「Audio Cast」という機能があり、ルート権限がある端末であれば他のアプリの音声をキャプチャしてDLNAで転送できるのだ!

ルート権限ねえよ!

メイン端末をルート権限で使うとか怖いですし。

はい、終了。

2.Androidデバイス上の音楽配信アプリの音声をChromecastで飛ばす

Androidデバイス側はChromecastの送信には対応しているのだが、

RPi3はChromecastの受信に対応したアプリがありません。

「アプリがなければ作ればいいじゃないの」と思ったのだが、Linux向けのSDKが存在しないしそもそも仕様詳細は公開されておりません*1

はい、終了。

3.Androidデバイス上の音楽配信アプリの音声をAirPlayで飛ばす

RPi3側はAirplay対応させることはできるらしいのだが、

AndroidデバイスはAirPlayに対応しておりません。

はい、終了。

4.Androidデバイス上の音楽配信アプリの音声をどうにかこうにか飛ばす

LinuxにはPulseAudioというネットワーク経由で音を再生する仕組みがある。

PulseAudio

RPi3側にPulseAudioをインストールして、Androidデバイス上でPulseAudioのライブラリを利用して他のアプリで再生された音を転送するアプリを自分で作ればいいじゃないかAppleもGoogleの独自規格なんて糞食らえだやーいざまーみろーロックインなんかされないもんねーと思ったのだが

ルート権限がないと他のアプリの音は奪えません。

そりゃ、簡単にできたら他の音源を録音できちゃうからダメに決まってるわね。

はい、終了。

5.Androidデバイス上の音楽配信アプリの音声をBluetoothで飛ばす

RPi3はBluetoothを内蔵しているので、AndroidデバイスとRPi3をA2DP接続してRPi3を外部スピーカーとして鳴らす。これはできなくもなさそうのだが、

なんか、無駄。

というか、一応頑張ってみたんだけど今のところ成功してない。

6.もういっそのことRPi3上で音楽配信アプリを再生するけど操作はAndroidデバイス上でやる

ほとんどの音楽配信サービスは、専用アプリ以外にもブラウザ経由での再生はサポートしている。ブラウザで再生できるのであればLinuxでも利用できる可能性は高い。RPi3にGUI環境をインストールしてアプリを起動、VNCとかでAndroidスマホから操作すればいいのではないかと思いつきましたが、

すっげえ、無駄。

はい、終了。

7.iOSデバイス上の音楽配信アプリの音声をAirPlayで飛ばす

RPi3側はAirplay対応させることはできるのであれば、

iOSデバイスからAirPlayで飛ばせばいいじゃないの。

なんということでしょう。Androidデバイスで操作するという前提を覆してしまいました。んー、でもこれが一番楽そうじゃん。とりあえず試すくらいいいじゃないのということで、息子氏のiPadを借りて実験だ。

構成

こんな感じ。
f:id:osa030:20160907232005j:plain

Raspberry Pi 3をAirPlayに対応させる

以下を導入すれば完了。

github.com

といっても、パッケージで提供されていないのでソースコードからビルドする必要がある。

今回は以下の手順を参考にさせて頂いた。

qiita.com

前提として前回までの環境構築が完了しており、USB-DAC(ポタアン)を使うものとしているので、その辺は各自の環境にあわせて適宜変更して欲しい。
また、オッサンのポタアンDA-10にアップサンプリングの機能があるので、上記手順で含まれている「soxr」は使わない方法でのビルドとなっていることに注意。

https://sourceforge.net/projects/soxr/

依存パッケージ導入

$ sudo apt-get update
$ sudo apt-get install libshairport2 autoconf libtool libdaemon-dev libasound2-dev libpopt-dev libconfig-dev avahi-daemon libavahi-client-dev libssl-dev git

ソース入手&ビルド

$ mkdir work
$ cd work
$ git clone https://github.com/mikebrady/shairport-sync.git
$ cd shairport-sync
$ autoreconf -i -f
$ ./configure --with-alsa --with-avahi --with-ssl=openssl --with-metadata --with-systemd
$ make
$ ./shairport-sync --version
2.8.4-OpenSSL-Avahi-ALSA-metadata

ユーザ作成

$ getent group shairport-sync &>/dev/null || sudo groupadd -r shairport-sync >/dev/null
$ getent passwd shairport-sync &> /dev/null || sudo useradd -r -M -g shairport-sync -s /usr/bin/nologin -G audio shairport-sync >/dev/null

インストール&自動起動設定

$ sudo make install
$ sudo systemctl enable shairport-sync

この時点ではまだプロセスは起動していない。

設定変更

$ sudo vi /etc/shairport-sync.conf
// General Settings
general =
{
+  ignore_volume_control = "yes";
};
 // These are parameters for the "alsa" audio back end, the only back end that supports synchronised audio.
 alsa =
 {
+  output_device = "plughw:1"
+  mixer_device  = "plughw:1"
 };

「alsa」の各項目にmpdの設定と同様の「hw:1,0」を指定しても上手く再生されなかったので、上記記事を基に「plughw:1」を指定した。さらに「alsa」だけだと再生時の音量が小さいので「general」に「ignore_volume_control」を"yes"と指定することでUSB-DAC側にMAXで出力されるのでポタアン側でボリューム調整する*2

$ sudo reboot

再起動してサービスとして自動起動が成功していることを確認する。

$ systemctl status shairport-sync
● shairport-sync.service - ShairportSync AirTunes receiver
   Loaded: loaded (/lib/systemd/system/shairport-sync.service; enabled)
   Active: active (running) since Wed 2016-09-07 13:05:33 UTC; 48min ago
 Main PID: 3694 (shairport-sync)
   CGroup: /system.slice/shairport-sync.service
           mq3694 /usr/local/bin/shairport-sync

AirPlayしてみる

iOSデバイス上のAmazon Musicアプリを起動してAirPlayをタップ。

f:id:osa030:20160907230223j:plain

送信先に「Raspberrypi」が現れているのでそれを選択すれば再生される。

むむむ、AirPlay便利。

Raspberry Pi Raspberry Pi3 ModelB

Raspberry Pi Raspberry Pi3 ModelB

*1:ひょっとしたらChrome入れたらどうにかなる気もしたけどまだ試してない

*2:mpdと併用する場合、こうしておかないと再生音量が違うのでビックリする