MPD (Music Protocol Daemon)のインストール
MPD を Ubuntu マシンにインストールして、Bluetooth スピーカーで聴く設定方法です。
rtmpdump で録音した番組を聴く方法を色々試してみましたが、MPD はファイルの同期など必要なく録画したテレビ番組を見るようにただリモンの再生ボタンを押すだけという手軽さが気に入りました。
ここでは MPD のインストール方法と、ちょっとハマった Bluetooth スピーカで聴くための設定方法を書きます。
MPD とは
MPD (Music Protocol Daemon)は、コンピュータに貯めてある音楽ファイルを再生させるためのプログラムです。
コンピュータに貯めた音楽ファイルを再生する方法は次の 3 パターンがあります。
- 手元のスマホやパソコンにコピー(同期)して再生する。
- 音楽ファイルを配信して手元で再生する。
- 音楽ファイルを貯めているコンピュータで直接再生する。
MPD は、最後の音楽ファイルを貯めているコンピュータで再生するためのプログラムです。そのため基本的にそのコンピュータに接続されたスピーカーからしか音を出せません(注1)。移動しながら聴くというよりは、家や職場など決まった場所で聴くのに向いています。逆に言うと移動しないためデジタル信号を音に変換する DAC やスピーカーの大きさに制限がなく音に凝ることが可能です。
MPD のインストール
今回のパソコン環境は、次のように Ubuntu 16.10(デスクトップ版)です。
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.10
Release: 16.10
Codename: yakkety
MPD に必要なプログラムは全てパッケージ化されているので、インストールに難しい所は全くありません。
$ sudo apt install mpd avahi-daemon
avahi-daemon は、zeroconf のために必要です。zeroconf を使用しない場合は、インストールする必要はありません。
MPD の設定
MPD の設定ファイルは、/etc/mpd.conf
です。このファイルを編集して自分の環境に合わせます。
私は次のようにして、Music フォルダをパスワード無しで直接公開し、内蔵スピーカと Bluetooth スピーカーで聞けるようにしました。また Zeroconf を有効にしているので、MPD が動いているコンピュータは DHCP で動的に IP アドレスが割り振られていても問題ありません。
# MPDが音楽ファイルを探すディレクトリー設定
music_directory "/home/user/Music"
playlist_directory "/var/lib/mpd/playlists"
db_file "/var/lib/mpd/tag_cache"
log_file "/var/log/mpd/mpd.log"
pid_file "/run/mpd/pid"
state_file "/var/lib/mpd/state"
sticker_file "/var/lib/mpd/sticker.sql"
user "mpd"
# MPDがlistenするアドレス。anyだと全てのインターフェイスでlistenする。
bind_to_address "any"
# 音楽ファイルが追加や削除されると自動的にMPDに反映されるようにする。
auto_update "yes"
# Zeroconfを有効にする。
zeroconf_enabled "yes"
zeroconf_name "Music Player T400"
input {
plugin "curl"
}
# 内蔵スピーカ
audio_output {
type "alsa"
name "Internal Speaker"
mixer_type "disable"
}
# USB接続のスピーカ
# deviceは、aplay -lコマンドを使って調べる。
audio_output {
type "alsa"
name "USB Speaker"
device "hw:1,0"
}
# sinkの値は、pactlコマンドを使って調べます。
# http://aki.sunnyday.jp/blog/?p=1310
# この設定については後で詳しく説明します。
# PluseAudioの設定を修正しないとBluetoothスピーカからは音が出ません。
audio_output {
type "pulse"
name "Bluetooth Speaker"
server "localhost"
sink "bluez_sink.00_1A_7D_E2_36_7B"
}
# ncmpcppでビジュアライゼーションを有効にしたい時だけ。
# https://wiki.archlinuxjp.org/index.php/Ncmpcpp
#audio_output {
# type "fifo"
# name "my_fifo"
# path "/tmp/mpd.fifo"
# format "44100:16:2"
#}
filesystem_charset "UTF-8"
id3v1_encoding "UTF-8"
MPD の設定はこれだけです。
設定がすんだら再起動して設定を反映させます。
$ sudo systemctl restart mpd.service
$ sudo systemctl status mpd.service
● mpd.service - Music Player Daemon
Loaded: loaded (/lib/systemd/system/mpd.service; enabled; vendor preset: enab
Active: active (running) since 木 2017-02-23 09:23:34 JST; 8s ago
Docs: man:mpd(1)
man:mpd.conf(5)
file:///usr/share/doc/mpd/user-manual.html
Main PID: 32426 (mpd)
Tasks: 6 (limit: 4915)
CGroup: /system.slice/mpd.service
└─32426 /usr/bin/mpd --no-daemon
2月 23 09:23:34 T400 systemd[1]: Started Music Player Daemon.
2月 23 09:23:35 T400 mpd[32426]: Feb 23 09:23 : server_socket: bind to '0.0.0.0
MPD のテストと音楽ファイルを再生
Zeroconf の確認
まず初めに zeroconfi が有効になっているか確認します。私は Android のZeroConf Browserを使用しました。
MPD が見つからない時は、avahi が動いているかと MPD の設定で zeroconf を有効にしているか確認します。avahi が動いているかは、netstat
コマンドを使用します。
$ netstat -ln46|grep 5353
udp 0 0 0.0.0.0:5353 0.0.0.0:*
udp 0 0 0.0.0.0:5353 0.0.0.0:*
udp6 0 0 :::5353 :::*
zeroconf で MPD を見つけるには、avahi-utils
パッケージに含まれるavahi-browse
コマンドも使用できます。ただしこのコマンドは、コマンドを実行したコンピュータ上のサービスを表示しません。
$ avahi-browse -t -all
+ enp0s25 IPv6 Music Player on RERUN Music Player Daemon local
+ enp0s25 IPv4 Music Player on RERUN Music Player Daemon local
systemd での問題
Ubuntu など systemd を使用しているマシンでは、次のようなログを残して Zeroconf で MPD を見つけられないことがあります。
/var/log/mpd/mpd.log
zeroconf: No global port, disabling zeroconf
この場合は、Creating a home music server using mpdにあるように mpd.socket を停止します。
sudo systemctl stop mpd.service
sudo systemctl stop mpd.socket
sudo systemctl disable mpd.socket
sudo systemctl start mpd.service
これで Zeroconf で MPD を見つけられるようになります。
MPD で音楽を再生
MPD は音楽を再生するサーバなので、クライアントプログラムが必要です。
クライアントプログラムには、次のように色々な種類があります。
- CUI
- mpc, ncmpc, ncmpcpp など。mcp は純粋にコマンドラインで使用するプログラムなのでシェルプログラムと組み合わせて使用するのに都合が良いです。ncmpc と ncmpcpp は、ncurses を使用するので、CUI と言っても GUI のような感じで使用できます。ncmpc と ncmpcpp の使い方はほとんど同じなので、使い方はNcmpcppを参照して下さい。
- GUI
- sonata, ario など。sonata は、初期設定ではアルバム名が表示されませんが、設定で変更できます。それでも ario の方が私は好みでした。
- Android
- MPDroid, plainMPDC など。MPDroid が人気みたいですが、私は plainMPDC が気に入りました。ただ plainMPDC は結構頻繁に MPD と接続できなることが欠点です。
Bluetooth スピーカ
MPD の音声を Bluetooth スピーカに送る設定の部分は合っているはずですが、Bluetooth スピーカから音が出ない、または再生できないといういうエラーになります。ここでだいぶ悩みました。
mpd.conf から Bluetooth に関わる部分を抜き出すと次のようになっています。
audio_output {
type "pulse"
name "Bluetooth Speaker"
server "localhost"
sink "bluez_sink.00_1A_7D_E2_36_7B"
# sink "bluez_sink.00_1A_7D_E2_36_7B.a2dp_sink" # On Ubuntu 17.04
}
鍵となるのは、server と sink の設定です。server は PulseAudio の動いているホスト名で、sink は音声の送り先です。
sink の値が間違っているのかと思いpactl
コマンドを使って調べましたが、間違っていません。
$ sudo pactl list|grep Sink
Sink #0
Sink #37
Monitor of Sink: alsa_output.pci-0000_00_1b.0.analog-stereo
Monitor of Sink: n/a
Monitor of Sink: bluez_sink.00_1A_7D_E2_36_7B
a2dp_sink: High Fidelity Playback (A2DP Sink) (sinks: 1, sources: 0, priority: 10, available: yes)
そしてはたとひらめきました。
PulseAudio の設定に server を指定するということはネットワークに関する設定が絡んでいるのでないかと推定しました。そこでググるとTCP サポートと匿名クライアントがヒットしました。内容を要約すると PulseAudio をネットワーク経由で使うには、ネットワークモジュールのロードと設定が必要だということです。
Ubuntu 16.10 のデスクトップ版では PulseAudio の設定は/etc/pulse/default.pa
にあります。これを確認すると、ネットワークモジュールがロードされないような設定になっています。
そこで PulseAudio の設定ファイルを次のように修正しました。
# ローカルホストからの接続のみをパスワード無しで受け入れる。
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1
設定を修正したら、PulseAudio を再起動させます。pulseaudio
コマンドを使用する方法もあるようですが、sysctl
コマンドまたはservice
で再起動する方法が分からなかったのでパソコンごと再起動しました。
再起動したらpacmd
コマンドで module-native-protocol-tcp がロードされているか確認します。
$ pacmd list-modules
<SNIP>
index: 11
name: <module-native-protocol-tcp>
argument: <auth-ip-acl=127.0.0.1>
used: -1
load once: no
properties:
module.author = "Lennart Poettering"
module.description = "Native protocol (TCP sockets)"
module.version = "9.0"
<SNIP>
これで MPD クライアントから再生を指示すると Bluetooth スピーカからも音声が流れてきて問題が解決しました。
参照と注釈
- MPD – ubuntu documentation
- Raspberry Pi 3 + mpd + Bluetooth 接続のスピーカー – いきあたりばったり
- PulseAudio で他の端末から音を出す – Qiita
- MPDは基本的にそのプログラムが走っているコンピュータのスピーカーからしか音を出せませんが、PulseAudioを使うことで別のコンピュータに音声を送って聴くことができます。