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を使うことで別のコンピュータに音声を送って聴くことができます。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です