目次
MPD (Music Player Daemon) でネットワークオーディオ環境を作ってみた。
MPD はクライアント・サーバー型の音楽プレーヤーソフトウェア。以下のような特徴がある。
- クライアントは再生・停止・曲のキューイングを行う(つまりはリモコン)
- サーバーは音楽ファイルの読み込みとスピーカーでの再生を行う
MPD のクライアントがあれば PC でもスマホでもスピーカーのリモコンとして使える。なので例えば平日昼間は仕事用の PC で作業していて仕事集中用のプレイリストを再生するけど、仕事が終わったら私用の PC に切り替えて EDM プレイリストでアゲアゲエブリナイ、といったことが MPD クライアントさえあればシームレスに行うことができる。
環境にもよるが、MP3、AAC、FLAC、Vorbis、Opus など主要なコーデックに対応している。音声ファイルだけではなく HTTP ストリーム再生にも対応しているので一部の Web ラジオも再生できる。私はこれでよく Truckers.FM や BigRig.FM を聞いている。
MPD クライアント
リモコン側の MPD クライアントはいくつか出ている。私は Windows では SkyMPC を、macOS と Linux では ncmpcpp を使っている。ncmpcpp は各種ディストロのパッケージに登録されていると思う。macOS でも Homebrew や MacPorts からインストールできる。
特に ncmpcpp は端末内で使えるので SSH 作業のお供によい。なおクライアントを終了してもサーバー側の音楽再生は続く。PC を閉じてあとはスマホからコントロールということもできる。スマホは yaMPC を使っている。
MPD サーバー
MPD サーバーは以下の構成にした。
- OS: Fedora Server 34
- PC: Intel NUC (Core i3-5010U, 16G メモリ, 128GB SSD)
- スピーカー: Sony LF-S50G (Bluetooth 接続)
スピーカーは死蔵してた LF-S50G を使った。LF-S50G は Google アシスタント対応で、スマートスピーカーが流行ったころに購入したものだが、スマホが Andoird から iPhone に変わったころから全く使わなくなったため Bluetooth スピーカーとして使用することにした。OS は特にこだわりがあるわけではないが、なんとなく Bluetooth 周りは新しめのバージョンを使った方がむしろ安定しそうな気がしたので Fedora を使うことにした。
MPD のインストール
Fedora の場合、MPD は公式リポジトリーには入っていないので RPMFusion のリポジトリーからインストールする必要がある。ついでに PulseAudio と Bluetooth 関連、Windows 共有フォルダ用のソフトウェアもインストールしておく。
$ sudo dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
$ sudo dnf install mpd
PulseAudio の設定
PulseAudio はオーディオを扱うアプリケーションとオーディオデバイスの橋渡しをするためのソフトウェアで、Ubuntu や Fedora などの Linux デスクトップでも使われている。最近の Linux デスクトップは Bluetooth も普通に認識して使えるので、PulseAudio を使えば Bluetooth スピーカーも難なく使えると考えた。
PulseAudio は Fedora Server のような非デスクトップ環境ではインストールされていないので、以下のようにインストールする。
$ sudo dnf install pulseaudio pulseaudio-module-bluetooth
PulseAudio はデスクトップ環境と連携して動くような想定らしく、非デスクトップ環境では自動的には起動してくれない。なので systemd のサービスとして登録するなど手を入れる必要がある。/etc/systemd/system/pulseaudio.service に .service ファイルを作成した。
[Unit]
Description=Pulse Audio
[Service]
User=root
Type=simple
ExecStart=/usr/bin/pulseaudio --system --disallow-exit --disable-shm -F /etc/pulse/default.pa
[Install]
WantedBy=multi-user.target
作成したら起動。
$ sudo systemctl daemon-reload
$ sudo systemctl start pulseaudio
$ sudo systemctl enable pulseaudio
Bluetooth スピーカーの接続
Bluetooth スピーカーはもちろんペアリングして使う必要がある。bluetoothctl コマンドを実行すると Bluetooth デバイスと通信するための対話環境に入る。
Bluetooth スピーカーのペアリングボタンを押してペアリングモードにしてから、scan on でデバイスを検索する。
[bluetoothctl]# scan on
そうすると Bluetooth デバイスのアドレスが表示されるので、スピーカーのアドレスを探して pair コマンドでペアリングする。
[bluetoothctl]# pair xx:xx:xx:xx:xx:xx
ペアリングが成功したら connect コマンドで接続。
[bluetoothctl]# connect xx:xx:xx:xx:xx:xx
Bluetooth スピーカーから接続完了の音が鳴れば接続成功。毎回ペアリングは面倒なので、trust コマンドを実行して自動で接続されるようにする。
[bluetoothctl]# trust xx:xx:xx:xx:xx:xx
PulseAudio のアクセス設定
PulseAudio は pulse-access グループのユーザーでないとアクセスできないので以下のようにグループに追加しておく。ついでに自分のユーザー (jsaito) も設定と動作確認に必要なので追加しておく。
$ sudo gpasswd -a mpd pulse-access
$ sudo gpasswd -a jsaito pulse-access
なお Fedora Server の場合はデフォルトでは SELinux が PulseAudio へのアクセスをブロックするようだ。audit2allow してみたがダメだったので不本意だが SELinux は無効にした。
音楽ファイル置き場のマウント設定
音楽ファイルは NAS の Windows 共有フォルダーに入っているので、cifs-utils をインストールしてマウントするようにした。Fedora Server の場合 cifs-utils はデフォルトではインストールされてないのでインストールする。
$ sudo dnf install cifs-utils
/etc/fstab に以下のような記述をする。
//192.168.100.20/jsaito /mnt/mynas.jsaito cifs ro,file_mode=0444,dir_mode=0555,uid=982,credentials=/etc/smbpasswd,iocharset=utf8,defaults 0 0
MPD は音楽ファイルの読み取りしかしないので、読み取り専用でマウントするようにした。uid=982 はマウントした共有フォルダーのファイルの所有者を指定するオプションで、mpd ユーザーの uid を指定した。この値は環境によって変わるので id コマンドで確認しておく。
$ id mpd
uid=982(mpd) gid=979(mpd) groups=979(mpd),63(audio),982(pulse-access)
credentials=/etc/smbpasswd は共有フォルダーに接続するためのユーザーIDとパスワードを指定するためのオプションで、/etc/smbpasswd は以下のような内容になっている。詳しくは man mount.cifs に書いてある。
username=jsaito
password=supersecretpassword
/etc/fstab の設定が終わったらマウントして OK かどうか確認する。
$ sudo mount /mnt/mynas.jsaito
MPD の設定
MPD の設定ファイルは /etc/mpd.conf にある。コメントがいろいろ書いてあるが要点だけ抜き出すと以下になる。
# 音楽ファイル置き場のパス
music_directory "/mnt/mynas.jsaito/Media Library/Music"
# これらはデフォルト値
playlist_directory "/var/lib/mpd/playlists"
db_file "/var/lib/mpd/mpd.db"
log_file "/var/log/mpd/mpd.log"
state_file "/var/lib/mpd/mpdstate"
user "mpd"
input {
plugin "curl"
}
# sink の値は pactl list sinks で調べる
audio_output {
type "pulse"
name "Bluetooth Speaker"
sink "bluez_sink.xx_xx_xx_xx_xx_xx.a2dp_sink"
}
music_direcotry はマウントした共有フォルダのパスを指定した。audio_output の sink の値は pactl list sinks で調べる。
$ pactl list sinks
シンク #1
状態: RUNNING
名前: bluez_sink.xx_xx_xx_xx_xx_xx.a2dp_sink
..snip..
設定したら MPD を起動。
$ sudo systemctl start mpd
$ sudo systemctl enable mpd
他の端末の MPD クライアントから接続できるように、ファイアウォールの 6600/tcp を許可しておく。
$ sudo firewall-cmd --add-port=6600/tcp
$ sudo firewall-cmd --add-port=6600/tcp --permanent
クライアントから接続し、音楽ファイルデータベースを更新して曲が再生できたら完成。
参考
以下の記事が参考になった。Raspberry Pi の例が多かった。
- Setting up a headless Raspberry Pi as a Music Player Daemon server
- Raspberry piをNAS兼音楽プレイヤーにする(MPD編) – ぷちのいず
- Raspberry Pi 3 + mpd + Bluetooth接続のスピーカー – いきあたりばったり
MPD だけを動かすには Intel NUC はオーバースペック気味なので、例えば音声合成 API を使ってスマートスピーカー風の機能をつけるなどして遊んでみたいと思う。
Tweet