Raspberry Pi 3とポタアンで音楽を再生するネットワークオーディオプレーヤーを作った(AirPlay編)
えっ、エアリプはAirPlayじゃないの?
前回までにRaspberry Pi 3(RPi3)をDLNA経由で外部にある音源を再生するネットワークオーディオプレーヤー化しました。
これだと、AndroidスマホやNASにある自前の音源ファイルは再生できるのだけれども、
音楽配信アプリの再生ができない。
ここでいう、音楽配信アプリといのは具体的には以下の様なもの。
- Amazon PrimeMusic
- AWA
- LINE MUSIC
- Radiko
つまり曲の音源ファイル自体が自分のものではなく、各サービスが所有している(配信可能な)音源を専用アプリを通じてインターネット経由でストリーミング再生しているもの。Radikoは音楽配信ではなくラジオなんだけどとかそういう細かいこという人はオジサン嫌いです。
さて、どうしてこれらができないのかというと、それぞれサービス独自の方式で配信されているので、DLNA等の標準的な方式では対応できないのだ。ていうかRadiko以外は有料サービスなのでそんなに簡単に誰でも再生できちゃうと儲からないから当たり前だよねーとやっぱりそうだよねーしょうがないよなーと、
諦めたらそこでお小遣い無駄になりますよ。
そういうわけでなんとかならないものか色々と考えてみた。
RPi3で音楽配信アプリの音楽を再生する方法を考える
選曲などの操作はAndroidデバイスで行い、RPi3に接続されたポタアン経由で音楽が再生されるという方式を変えたくはない。そこの前提でいくつかの方法を考えてみた。
- Androidデバイス上の音楽配信アプリの音声をBubbleUPnPのDNAストリーミングで飛ばす
- Androidデバイス上の音楽配信アプリの音声をChromecastで飛ばす
- Androidデバイス上の音楽配信アプリの音声をAirPlayで飛ばす
- Androidデバイス上の音楽配信アプリの音声をどうにかこうにか飛ばす
- Androidデバイス上の音楽配信アプリの音声をBluetoothで飛ばす
- もういっそのことRPi3上で音楽配信アプリを再生するけど操作はAndroidスマホ上でやる
- 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というネットワーク経由で音を再生する仕組みがある。
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を借りて実験だ。
構成
こんな感じ。
Raspberry Pi 3をAirPlayに対応させる
以下を導入すれば完了。
といっても、パッケージで提供されていないのでソースコードからビルドする必要がある。
今回は以下の手順を参考にさせて頂いた。
前提として前回までの環境構築が完了しており、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をタップ。
送信先に「Raspberrypi」が現れているのでそれを選択すれば再生される。
むむむ、AirPlay便利。
Raspberry Pi Raspberry Pi3 ModelB
- 出版社/メーカー: RASPBERRY-PI
- メディア:
- この商品を含むブログを見る
- 出版社/メーカー: KSY
- メディア: エレクトロニクス
- この商品を含むブログ (1件) を見る
東芝 microSDHC 16GB EXCERIA 48MB/s UHS-I Class10 TOSHIBA THN-M301R0160 海外向パッケージ品 [並行輸入品]
- 出版社/メーカー: 東芝
- メディア: エレクトロニクス
- この商品を含むブログを見る
waves Raspberry Pi 3 Model B 用 ケース ヒートシンク 3点付 Pi2 共用 国内発送 黒
- 出版社/メーカー: waves(ウェイブス)
- メディア: エレクトロニクス
- この商品を含むブログを見る