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 スピーカからも音声が流れてきて問題が解決しました。

参照と注釈

  1. MPDは基本的にそのプログラムが走っているコンピュータのスピーカーからしか音を出せませんが、PulseAudioを使うことで別のコンピュータに音声を送って聴くことができます。