Linux(arch)にAirPlay serverを構築
appleのairplay、便利ですね。同じネットワーク上のスピーカーやディスプレイを少ないステップで使用できる便利な機能です。
これのサーバーをlinux上に構築します。UxPlayというサーバツールがあるのでこれを使ってAirplayをLinuxで再生できるようにします。今回はオーディオ専用です。
環境
OS: Arch Linux x86_64
Kernel: Linux 6.17.5-arch1-1
Shell: zsh 5.9
CPU: AMD Ryzen 7 7735HS (16) @ 4.83 GHz
GPU: AMD Radeon 680M [Integrated]
Memory: 1.03 GiB / 30.12 GiB (3%)
install
AURに最新があるのでyayなどでインストール。
# 一応-Ssで検索
yay -Ss uxplay
aur/uxplay-git r590.51807d9-3 (+11 0.01)
AirPlay Unix mirroring server
aur/uxplay 1:1.72.2-3 (+10 0.99)
AirPlay Unix mirroring server
# install
yay -S uxplay
port開放
以下のポートを開放する必要がある。
UDP 5353, 6000, 6001, 7011TCP 7100, 7000, 7001
ufwによるポート許可
sudo pacman -S ufw
sudo systemctl status ufw
sudo systemctl enable ufw
sudo systemctl start ufw
sudo ufw allow 5353/udp
sudo ufw allow 6000/udp
sudo ufw allow 6001/udp
sudo ufw allow 7011/udp
sudo ufw allow 7100/tcp
sudo ufw allow 7000/tcp
sudo ufw allow 7001/tcp
sudo ufw enable
sudo systemctl restart ufw
sudo ufw status
起動
-async optで音質向上があるらしい。(2s程度の遅延があるが)
uxplay -async
UxPlay 1.72: An Open-Source AirPlay mirroring and audio-streaming server.
using system MAC address ***
Initialized server socket(s)
*** ERROR: No DNS-SD Server found (DNSServiceRegister call returned kDNSServiceErr_Unknown)
どうやらAvahiが入っていないらしい。
sudo pacman -S avahi
sudo systemctl enable avahi-daemon --now
もう一回
uxplay -async
UxPlay 1.72: An Open-Source AirPlay mirroring and audio-streaming server.
using system MAC address c8:53:09:3c:3e:4f
Initialized server socket(s)
ちゃんと起動しました。
iOSから再生
ちゃんとAirPlayのリストには表示されたが接続ができない。多分ポート関連かな?

エラー: iOSから接続できない -> portを固定することで解決
portの許可などが反映されてないことを考えて再起動。再起動は全てを解決することもある。
治らず。
実際に使用しているポートがズレることがある?らしいので、-pで固定。
すると実際に使用しているポートが表示されるのでこれをufwでまた開放する。
uxplay -async -p 7000
UxPlay 1.72: An Open-Source AirPlay mirroring and audio-streaming server.
using network ports UDP 7000 7001 7002 TCP 7000 7001 7002
using system MAC address c8:53:09:3c:3e:4f
Initialized server socket(s)
ufwは連番なら範囲指定可能なため以下で開放。
sudo ufw allow 7000:7002/tcp
sudo ufw allow 7000:7002/udp
ufw reloadやsystemctl restartで再読み込み。
ちゃんと接続された。
GUIなしで起動しているとスピーカーから音が出ない
多分GUIで起動しているlinuxなら問題ない。
ALSAで音声デバイスを管理する
現在archコンピューターにはDitooというスピーカーをUSBで接続しているのでこれを使う。ちゃんと認識はされてるぽい。
sudo pacman -S alsa-utils alsa-firmware alsa-plugins
aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: audio [Ditoo usb audio], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
デフォルトの出力先を設定。~/.asoundrcに記述するらしい。
今回使うスピーカーはcard0のdevide0
pcm.!default {
type hw
card 0 # ここを使いたいカード番号に変更
device 0 # 使いたいデバイス番号に変更
}
ctl.!default {
type hw
card 0
}
ただこれだけだとスピーカーが使われなかったから、alsamixerを起動して、F6でスピーカーを選択したら普通に再生された。
uxplayを自動起動
面倒だったらuxplay -p 7000 &とかでもいいとは思うけれど。
以下ファイルを設置。
[Unit]
Description=AirPlay Unix mirroring server
Requires=avahi-daemon
After=avahi-daemon
[Service]
Type=simple
ExecStart=uxplay -p 7000
Restart=on-failure
# もしlog(普通に起動したの時の出力)を書き出さない場合は👇をコメントアウト
StandardOutput=file:%h/uxplay.log
[Install]
WantedBy=default.target
以下でenable & start。
systemctl --user daemon-reload
systemctl --user enable uxplay
systemctl --user start uxplay
再生してみて
音質に関しては音に詳しい人からしたら分かりませんが、音自体は普通。
ただ、接続が切れたようなプチッといった感じのノイズが入ることがある。特に曲が変わった際の冒頭付近。
-asyncをつけることでそこそこ解消されるが、冒頭付近は安定しない気がする...
ただUxPlay以外にもいろんな機能を跨いで実装しているAirPlay環境(USBスピーカー)なので、実際にどこが原因かは不明。
リソース
btopという高機能なモニターで確認する。
| 項目 | 値 |
|---|---|
| 通信量 | 1.0Mbips +-0.3くらい |
| CPU | 0.2% |
| RAM | 300M |
誤差ですね。RAMも現代のコンピューターなら普通でしょう。
終わり
Discussion