Open noraworld opened 1 year ago
インストールすべきパッケージがたくさんあったので、どれをすでにインストールしていてどれを新しくインストールするべきか調べるために apt list
コマンドを実行したのだが、[installed]
という項目を見落としていて表示されたものはすべてインストール済みだと勘違いして先に進んでしまったら、案の定 autoreconf -i -f
のところでコケた。のちに [installed]
と書かれていないパッケージはまだインストールされていないものだということに気づき必要なパッケージをインストールしたら無事コマンドが成功した。
サービスの自動起動設定のところまでは特につまづくこともなく順調に構築できていたのだが、再起動しても iPhone に AirPlay の候補が表示されない。デーモンは起動していることを確認済み。
トラブルシューティングを見てみたけど、そもそも AirPlay が認識されない的なものがない。
ファイアーウォールでブロックしてしまっているならそもそもデーモンの起動に失敗するはずだが特にそれはなく、デーモンを使わずに shairport-sync
コマンドを手動で実行してもエラーで落ちたりはしない。
そういえば AirPlay って同じ Wi-Fi ネットワークにいないといけないとかなんとかというのを思い出したので、Raspberry Pi を Wi-Fi に接続してみた。
https://kkkw.hatenablog.jp/entry/20220502/1651471611
何気に Raspberry Pi で Wi-Fi を使うのは今回が初めてだ。
しかしそれでもやはり AirPlay の候補に表示されない……。
再起動しても同じ。
全く分からんので質問してみた。
https://github.com/mikebrady/shairport-sync/discussions/1668
とりあえずもう一度 sudo systemctl start shairport-sync
しようとしたら Failed to start shairport-sync.service: Unit avahi-daemon.service is masked.
と言われてしまったので、sudo systemctl unmask avahi-daemon
しておいた。そしたら再び起動できるようになった。そもそも最初はこんな現象になっていなかったのになぜ途中からこんなことになってしまったのか不明だが。
回答が来た。
https://github.com/mikebrady/shairport-sync/discussions/1668#discussioncomment-5695971
回答の中にある別の Issue を辿ってみると、avahi-daemon
とかのコマンドを実行して調査してみてとか書いてあったけどそもそもそんなコマンドないからおかしいなと思っていた。
そういえば必要なパッケージをインストールしたといったけど、あれは公式ではなくここの記事のものをインストールしただけにすぎなかった。
なので、ちゃんと公式で明記されているパッケージをすべてインストールすることにした。
https://github.com/mikebrady/shairport-sync/blob/acdae45549aedc0262471829c7aefaeff43f68d3/BUILD.md
以下のパッケージがまだ未インストールだったのでインストールした。
avahi-daemon/jammy,now 0.8-5ubuntu5 arm64 [residual-config]
libavcodec-dev/jammy-updates,jammy-security 7:4.4.2-0ubuntu0.22.04.1 arm64
libavformat-dev/jammy-updates,jammy-security 7:4.4.2-0ubuntu0.22.04.1 arm64
libavutil-dev/jammy-updates,jammy-security 7:4.4.2-0ubuntu0.22.04.1 arm64
libplist-dev/jammy 2.2.0-6build2 arm64
libsodium-dev/jammy 1.0.18-1build2 arm64
そして再起動した。
パッケージ全部インストールしたら表示されるようになった!
やっぱりそこらへんの記事だけじゃなくてちゃんと公式ドキュメント読むべきだな......。
しかし接続しようとすると Unable to connect to AirPi
となってしまい接続できない……。
Wi-Fi のパワーセーブモード (低電力モード) がオンになっていると正しく動作しない可能性があると公式のトラブルシューティングに書いてあったのでオフにした。
sudo iw dev wlan0 set power_save off
https://github.com/mikebrady/shairport-sync/blob/acdae45549aedc0262471829c7aefaeff43f68d3/BUILD.md
しかし解決せず。
次にドキュメントに書いてあったのはファイアーウォールを無効にすることなので、これも試してみたらなんとこれがビンゴ。見事、接続することができた!
ただしネットワークの関係上、ファイアーウォールはオフにはしたくないので AirPlay は許可されるように設定しておこう。いや、オフにしたくないというか、オフにするとフォワーディングされないからネットワークが使えなくなるのか、完全に忘れてた。
しかし AirPi のほうにつないでもふつうに iPhone 本体から音が聞こえてくる。全く意味をなしていない……。
とりあえず UFW オンにした状態でも AirPlay が使えるようにポート許可した。
本当は "Classic AirPlay" のほうで良いけど今後のことを考えて "AirPlay 2" のほうを設定した。AirPlay 2 が Classic AirPlay をすべて含んでいるので問題ないはず。
無事、UFW をオンにしたまま AirPlay にもつなぐことができた。なんかときどき設定に失敗するけど。あと音声が iPhone から流れている問題は依然としてあるけど。
翌日、Raspberry Pi の 3.5 mm ステレオミニプラグにケーブルをつなぎ送信機側の Bluetooth トランスミッターと接続して AUX モードにしたら音声が流れるようになった。ただし最初は全く音声が聞こえなくて、alsamixer
を使って音量を上げたりすることで聞こえるようになった。
もともと 3.5 mm ステレオミニプラグだと小さい音が消えてしまう問題があることを数年以上前に経験しているのでそれが影響していたのだろう。
ただ、予想していなかったのは、いわゆる『ちゃんとした音声』じゃないと再生されない。たとえば英単語の音声のように、一瞬しか再生されない、というよりは音声データとして認識されないような音声はそのまま iPhone から音が出てしまう。これが昨日言っていた現象だろう。うーむ、これが使えないとなるとちょっと実用的じゃないな……。
あと音がめちゃくちゃ遅延している。これはトラブルシューティングにあったので調整次第で直せるかもしれない。
Mac と iPhone を同時に接続できないのも問題かもしれない。片方で接続されていて音声が再生されていると、もう片方で接続しようとしたときにエラーになる。ただこれはそういう仕様なのだろうと思う。
今使っているのは Classic AirPlay で、AirPlay 2 にすれば改善されるかも?
いや、「同時再生」っていうのは、たとえば 1 台の iPhone から複数の AirPlay 2 対応デバイスに同時に音を出力できる、って意味なのか。逆は無理なのかな。
今まで Bluetooth で音声をミキシングすることばかりにこだわっていたが、音声を聴くデバイスは Mac や iPhone と、Apple 製品に限られているので AirPlay で音声を取れば良いのでは? と思った。というか AirPlay でも音声が拾えそう、というのがネットサーフィンしていて分かった。
これを参考にしながら進めてみる。
https://101010.fun/iot/raspberry-pi-airplay-server.html