出自 Arch Linux 中文维基
< MPD

組織和管理音樂庫

MPD 不負責管理用戶的音樂庫。想要管理功能,請查看 beetspicard

同步播放記錄至 Last.fm/Libre.fm

注意: 0.18 版本的 MPD 移除了 Last.fm 相關支持。不過,一些客戶端提供了獨立於 MPD 的記錄功能。

下面有一些方法用於將 MPD 的歌曲播放記錄同步至 Last.fmLibre.fm

mpdas

mpdas 是一款支持 MPD 的音頻記錄器客戶端,使用 curllibmpd 並由 C++ 編寫而成。mpdas 支持最新的音頻記錄器協議(2.0),同時能在無網絡連接的情況下,將未同步的播放記錄緩存至 ~/.mpdascache

可以安裝 mpdasAUR 軟體包。

Mpdas 配置簡單,請參考官方的說明/etc/mpdasrc 本身就是一份非常基礎的配置示例。

要讓 mpdasmpd 一同啟動,請在啟動 mpd 的文件中增加 mpdas 的啟動條目(例如 xinitrc):

[[ -z $(pgrep -xU $UID mpdas) ]] && mpdas &

mpd以 systemd 用戶服務啟動,最好也將 mpdas 作為一個用戶單元啟動

提示:若在系統啟動後遇 mpdas.service 啟動失敗,請考慮使用 mpd.socket,即套接字啟動

mpdscribble

mpdscribble 是一個守護進程,它因為作為一個半官方的 MPD 記錄器,並且使用了 MPD 中新的「idle」功能,記錄更精確,可以說是同步播放記錄的最佳方案。由於不需要更改任何 /etc 目錄下的文件,因此無需 root 權限即可進行配置。詳情請訪問官方網站

Mpdscribble 自帶一份配置示例:/usr/share/mpdscribble/mpdscribble.conf.example,將其複製到 ~/.mpdscribble/mpdscribble.conf 然後按需編輯。

注意: Mpdscribble 解釋器不支持行尾注釋,請將注釋寫在單獨的行中。

用戶密碼也可以使用 md5hash 形式:

echo -n "password" | md5sum | cut -f 1 -d " "

可以在 systemd 用戶實例下使用 mpdscribble.servicempdscribble 自動啟動。詳情請參考 systemd/用戶

同樣可以讓 mpdscribblempd 一同自動啟動,請在啟動 mpd 的文件中增加一條啟動條目(例如 ~/.xinitrc):

[[ -z $(pgrep -xU $UID mpdscribble) ]] && mpdscribble &
注意: 若遇到 [last.fm] handshake failed, username or password incorrect (BADAUTH) 錯誤,請確保用戶名和密碼都是正確的,且密碼不應是 32 字符長度

Sonata

Sonata 內置了歌曲記錄功能,儘管該功能需要程序全程處於運行狀態。此外,如果播放時未能成功將記錄轉發至 Last.fm,Sonata 也不會緩存這些記錄,這意味著這些記錄不會被計入統計數據。

YAMS

YAMS 是一個 MPD 的 Last.FM 歌曲記錄守護進程,用 Python 編寫而成。

由於 YAMS 是針對 2.0 版本的 Last.FM 記錄接口編寫的,YAMS 不會將用戶名和密碼信息存儲至本地,而是使用一個 cookie。與其他的記錄器類似,YAMS 可以保存失敗的記錄上傳並之後將其重新上傳。YAMS 也提供了很多的配置選項,這些選項可以定義何時或如何創建歌曲記錄(包括忽略掉一首曲子的重複播放記錄)。

可以安裝 python-yamsAUR 軟體包。

必須在交互式終端內運行 yams 命令(至少需要運行一次)並跟隨指示操作,才能完成身份認證。

身份驗證完成後,可通過二進位文件啟動 YAMS:

yams 默認以守護進程運行(yams -N 將以前台進程運行 YAMS)。

yams -k 將終止當前運行的實例。

yams -a 將附加上當前運行的實例的日誌文件,此時用戶可以觀察運行輸出。

yams -h 將輸出所有命令行選項。

YAMS 自帶一個 systemd 服務文件,可在身份認證完成後,通過 yams.service 用戶單元啟動

禁用啟動時恢復播放的功能

mpd 0.16.2 開始有「恢復播放」功能。當該功能啟用時,mpd 總是(即使停止時 mpd 正在播放音樂)以「暫停」狀態啟動。將下面這一行添加到 mpd.conf 以啟用這個功能:

restore_paused "yes"

配置示例:以 44.1 KHz 和 16 bit 位深度輸出至多個程序

為什麼要選擇這樣的格式?
因為這是 CD 音頻的標準格式,ALSA 本身也允許多個程序僅通過 dmix(dmix 默認的使用低質量的重採樣算法)播放聲音,而 dmix 默認會將所有音頻重採樣至 48 KHz(或是正在播放的音頻的格式的採樣率)以下。而且,若不這麼配置,至少對於 mpd.conf 而言,如果不進行更改,一些用戶可能會遇到播放時的咔噠聲(clicking sounds)。
這麼做有什麼缺點?
這些設置將導致「所有」音頻(若有必要)被重採樣至此格式(44.1 KHz 16 bit),例如實際上是 48 KHz 採樣率的 DVD 或電視素材。但是目前沒有方法讓 ALSA 動態改變格式,不過對於經常聽、且次數遠多於其他音頻的 CD 用戶而言,偶爾將 48 KHz 降採樣至 44.1 KHz 也不算是太大的採樣率損失。

下面的示例假定沒有其他已知設置與之衝突或會覆蓋它。這尤其適用於當前用戶潛在的 ~/.asoundrc 設置。MPD 通常會忽略該設置,因此,下面的示例應當轉入 /etc/asound.conf

/etc/asound.conf
defaults.pcm.dmix.rate 44100 # 強制使用 44.1 KHz
defaults.pcm.dmix.format S16_LE # 強制使用 16 bits
/etc/mpd.conf
audio_output {
        type                    "alsa" # 使用 ALSA 輸出插件。
	name			"your_custom_name" # 必須存在,但不必與實際的音效卡名一致,例如 /etc/asound.conf 中的此項。
        options                 "dev=dmixer"
        device                  "plug:dmix" # 這兩行讓 MPD 輸出至 dmix。
	format	        	"44100:16:2" # 實際格式。
	auto_resample		"no" # 用於繞過 ALSA 自身的算法(通常會更低)。請查看下面的內容以了解如何選擇。
}
注意: MPD 會對 mp3 格式進行特殊處理:永遠使其輸出為 24 bit。由 format 行所指定的強制轉換會在此特殊處理之後進行。

若希望讓 ALSA resp. 決定 MPD 使用的位深度,注釋掉 resp. 並省略 dimx.format 這一行,同時將 mpd 的 format 更改為 "44100:*:2"。

注意: 在以兩種不同位深度解碼的文件(例如,一個 mp3 和一個 16 位 flac)之間進行「交叉淡入淡出」(Crossfading)時,除非轉換處於激活狀態,否則不起作用。

用 LIRC 控制 MPD

已有一些客戶端被設計用於在 lircd 與 MPD 之間進行通信,然而在實際使用過程中,這些客戶端由於功能限制,並不實用。

建議將 mpc 與 irexec 一同使用。mpc 是一個命令行播放器,它僅僅能夠將命令發送至 MPD,隨後立即退出(這一點與 irexec 配合極佳),命令執行器已經包含在 lirc 中了。irexec 會在接收到一個遠程控制按鈕的消息時執行特定的命令。

首先,請根據 LIRC英語LIRC 文章設置好遠程控制。

編輯 lirc 啟動配置文件,默認位置位於 ~/.lircrc

將下面的內容寫入文件:

begin
     prog = irexec
     button = <按钮名称>
     config = <要执行的命令>
     repeat = <0 或 1>
end

示例:

## irexec
begin
     prog = irexec
     button = play_pause
     config = mpc toggle
     repeat = 0
end

begin
     prog = irexec
     button = stop
     config = mpc stop
     repeat = 0
end
begin
     prog = irexec
     button = previous
     config = mpc prev
     repeat = 0
end
begin
     prog = irexec
     button = next
     config = mpc next
     repeat = 0
end
begin
     prog = irexec
     button = volup
     config = mpc volume +2
     repeat = 1
end
begin
     prog = irexec
     button = voldown
     config = mpc volume -2
     repeat = 1
end
begin
     prog = irexec
     button = pbc
     config = mpc random
     repeat = 0
end
begin
     prog = irexec
     button = pdvd
     config = mpc update
     repeat = 0
end
begin
     prog = irexec
     button = right
     config = mpc seek +00:00:05
     repeat = 0
end
begin
     prog = irexec
     button = left
     config = mpc seek -00:00:05
     repeat = 0
end
begin
     prog = irexec
     button = up
     config = mpc seek +1%
     repeat = 0
end
begin
     prog = irexec
     button = down
     config = mpc seek -1%
     repeat = 0
end

請運行 mpc(1) 查看更多的 mpc 功能及其詳細信息。

PulseAudio

本地(單用戶)

無需任何特殊選項,只需要按照 MPD 配置文件中的注釋說明,添加一個 PulseAudio 輸出即可。

本地(多用戶)

以單用戶運行 MPD 時,聲音是無法發送到其他用戶的 PulseAudio 服務上的。解決方法:要麼讓 PulseAudio 作為全系統範圍的守護進程運行(然而這是上游極其不推薦的做法),要麼配置 MPD,讓 MPD 使用 PulseAudio 的 TCP 模塊,從而將聲音發送到本地:

首先,編輯 PulseAudio 的配置,使用 $XDG_CONFIG_HOME/pulse/default.pa 這一用戶配置(特指 ~/.config/pulse/default.pa 這一配置文件),或者在全系統範圍的配置文件 /etc/pulse/default.pa 中取消注釋 TCP 模塊相關內容並將 127.0.0.1 設置為允許的 IP 地址,如下所示:

### Network access (may be configured with paprefs, so leave this commented
### here if you plan to use paprefs)
#load-module module-esound-protocol-tcp
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1
#load-module module-zeroconf-publish

可以用 ; 作為 CIDR 表示法的分隔符表示其他範圍的 IP 地址。配置完成後,重啟 PulseAudio

接下來編輯 /etc/mpd.conf,添加一個新的 pulse 類型的輸出,指向 127.0.0.1 「遠程」伺服器:

audio_output {
       type		"pulse"
       name		"Local Music Player Daemon"
       server		"127.0.0.1"
}

添加完畢後,請重啟 MPD。

現在,本地的 MPD 應該已經能夠使用,所有使用 PulseAudio 的用戶都能通過 127.0.0.1 接收到聲音。

遠程

MPD 可以通過網絡將聲音發送到任何使用了 PulseAudio 的程序。完整的 PulseAudio 系統並不需要在一個運行著 MPD 的服務端上,只需要使用 libpulse 作為發送源,該軟體包已經是 MPD 的依賴項。

要讓 MPD 把音頻發送到另一台計算機上,請參照上述指引,在運行了 MPD 的服務端上,編輯 /etc/mpd.conf,將 IP 地址設置成目標計算機的,同時在目標計算機上,編輯 /etc/pulse/default.pa$XDG_CONFIG_HOME/default.pa(或 ~/.config/pulse/default.pa),在配置中設置好服務端的 IP 地址。

完成配置後,在服務端播放音頻時,目標計算機上會顯示服務端的源,並且可以像普通的播放源那樣控制。MPD 停止後,目標計算機上將沒有可用的源。

Cue 文件

由於 0.17 版本的 MPD 已經集成了能夠處理外部或嵌入式 cue 腳本的解釋器,無需額外操作即可支持 cue 文件。 例如,$ mpc load albumx/x.cue 命令將 music_directory/albumx/x.cue 文件加載為播放列表,若文件是例如 $ mpc load albumx/x.flac,則加載為 CUESHEET 標籤。

支持 cue 文件的客戶端較為有限。有兩個支持 cue 文件的程序,分別是:cantataAURncmpcpp英語ncmpcpp

HTTP 串流

自 0.15 版本起,MPD 內置了 HTTP 串流守護程序(服務端)。這讓 MPD 可以將音樂廣播至 HTTP 客戶端。

但這並不意味著把這個功能直接作為一個串流方案使用(例如替代 Spotify、Deezer 等)。首先,它只允許播放一個音頻流,多個用戶無法同時收聽多個音頻流。其次,MPD 會對音頻做大量緩衝,因此,即使客戶端離線了一段時間也依然能夠播放,但也是因為這個原因,切換歌曲時會有非常明顯的延遲。若要將 MPD 作為串流方案使用,請參考 #以衛星模式串流音樂

配置

在 mpd.conf 中將其設置為一個輸出設備即可激活 HTTP 串流服務:

audio_output {
	type		"httpd"
	name		"My HTTP Stream"
	encoder		"opus"		# 可选
	port		"8000"
#	quality		"5.0"			# 若 bitrate 已设置,请勿设置此项
	bitrate		"128000"			# 若 quality 以设置,请勿设置此项
	format		"48000:16:1"
	always_on       "yes"			# 阻止 MPD 停止播放时中断与所有监听器的连接。
	tags            "yes"			# httpd 支持发送标签至播放流。
}

格式

MPD 支持一些編碼格式,請使用如下的命令查看 MPD 支持的編碼格式:

$ mpd --version

使用

只需要在音樂播放器內打開 mpd 服務端的 URL(以及指定的埠號)即可收聽配置完畢的音頻流。注意:可能需要在 URL 中使用合適的文件擴展名以指定文件格式。例如在使用 Winamp 5.5 時,應使用 http://192.168.1.2:8000/mpd.ogg,不要使用 http://192.168.1.2:8000/。

從另一台計算機上使用 mpd 連接到音頻流:

 mpc add http://192.168.1.2:8000

以衛星模式串流音樂

雖然 #HTTP 串流能夠讓用戶通過 HTTP 廣播音樂,衛星模式能夠讓多個用戶在多個設備上,同時收聽不同的歌曲。

拓撲結構

設置衛星模式需要兩個或更多的設備:一個「服務端」和多個「客戶端」。「服務端」通常是擁有音樂文件的那台設備,它運行 MPD 實例,掃描音樂文件並建立資料庫。「客戶端」是實際播放音樂的設備(例如用戶的手機或筆記本電腦),它們同樣運行 MPD 實例,從服務端的 MPD 資料庫中獲取並播放音樂。雖然服務端上的 MPD 實例並非必要,但它極大地提升了客戶端獲取歌曲的速度,因為客戶端無需遠程掃描服務端上的音樂文件。

同時,還需要一種方法讓服務端把音樂文件分享給客戶端。MPD 支持多種存儲插件用於獲取文件。例如,如果選擇了 curl 插件,服務端需要一個 WebDAV 服務。

最後,服務端和客戶端之間需要一個安全的通信隧道。這是因為控制 MPD 的協議不會加密傳輸信息,也不提供身份驗證功能。此時 VPN英語VPN 或 SSH 隧道將是一個不錯的選擇。

配置

在服務端的配置文件中添加 MPD 構建資料庫的相關配置:

/etc/mpd.conf
pid_file            "/run/mpd/mpd.pid"
playlist_directory  "/var/lib/mpd/playlists"
music_directory     "音樂文件的路徑"

database {
    plugin           "simple"
    path             "/var/lib/mpd/mpd.db"
    cache_directory  "/var/lib/mpd/cache"
}

audio_output {
    type  "null"
    name  "This server does not need to play music, but it can"
}

添加好配置後,請繼續配置 WebDAV 服務、NFS 服務或是 Samba 共享。

在每個客戶端的配置文件中添加 MPD 播放音樂的相關配置:

/etc/mpd.conf
pid_file            "/run/mpd/mpd.pid"
playlist_directory  "/var/lib/mpd/playlists"

# WebDAV 配置
music_directory     "https://optional_user:optional_password@example.com/path/to/your/music/"

# NFS 配置
music_directory     "nfs://example.com/path/to/your/music/"

# Samba 配置
music_directory     "smb://example.com/path/to/your/music/"

# 注意這裡的代理設置
database {
    plugin  "proxy"
    host    "example.com"
    port    "6600"
}

audio_output {
    type  "alsa"
    name  "Some output name"
}
注意:
  • libsmbclient 有一個會導致 MPD 崩潰的嚴重缺陷,因此該插件默認是禁用狀態,在該缺陷被修復之前請不要嘗試使用。
  • Android 設備上的配置文件需要存放在用戶存儲的根目錄下,與 Android 目錄一起。同時,MPD 寫入的文件需要位於應用程式目錄,通常位於 /data。例如:
/storage/emulated/0/mpd.conf
music_directory  "http://example.com/Music"
log_file         "/data/user/0/org.musicpd/cache/log"
state_file       "/data/user/0/org.musicpd/cache/state"

audio_output {
    type  "sles"
    name  "Android only supports OpenSL ES"
}

MPRIS 支持

另請參見 MPRIS

mpDris2

安裝 mpdris2AUR 軟體包。mpDris2 運行在當前用戶會話內,監控 MPD 服務的運行狀態。

將默認的配置文件 /usr/share/doc/mpdris2/mpDris2.conf 複製到 ~/.config/mpDris2/mpDris2.conf,按需編輯配置內容。

安裝完成後,啟動或啟用 mpDris2.service 用戶單元

mpd-mpris

安裝 mpd-mpris 軟體包。

安裝完成後,啟動或啟用 mpd-mpris.service 用戶單元

mpd-mpris 默認連接到 localhost:6600(同時也是 MPD 的默認主機、埠)。將 /usr/lib/systemd/user/mpd-mpris.service 複製到 ~/.config/systemd/user/ 並編輯運行參數即可更改這個默認連接地址。

消息通知

mpdris2AUR 軟體包可以支持顯示圖形化的消息通知。 若想要一些更「輕量」或「具體」的方案,而不需要 mpris 支持,請參考下列替代方案:

musnify-mpd

musnify-mpd 是一個簡單的 python 腳本,使用 libnotifyMusic Player Daemon 提供消息通知功能的支持。 它也可以顯示從 last.fm 或用戶本地音樂庫加載到的專輯封面。

可以安裝 musnify-mpdAUR 軟體包。

安裝完成後可能需要配置 MPD 的「主機」和「埠號」。請先將「.example」文件複製到 ~/.config/musnify-mpd 然後編輯:

$ mkdir ~/.config/musnify-mpd 
$ cp /usr/share/doc/musnify-mpd/musnify-mpdconfig.example ~/.config/musnify-mpd/musnify-mpd.config

配置示例:

~/.config/musnify-mpd/musnify-mpd.config
[mpd]
host = localhost
port = 6600

# musnify-mpd 將從如下的位置搜索本地專輯封面。
musiclibrary = ~/Music
#

[apiKey]
# 若希望從 LastFm 獲取專輯封面,
# 請啟用下面的選項並提供一個 apiKey。
# 可以從此處獲取 apiKey:https://www.last.fm/api/account/create
#
# lastfm = YOUR_LASTFM_API_KEY

mpd-notification

mpd-notification 用於提示 mpd 所播放的歌曲信息。它運行於後台,並在 MPD 產生事件時(例如:開始、暫停或停止播放一首歌曲)發送通知。對於本地或 .mp3 專輯作品集同樣支持。

可以安裝 mpd-notificationAUR 軟體包。

安裝完成後,只需要運行一次 mpd-notification。也可以選擇啟用 mpd-notification.service 用戶單元使其自動啟動。

添加一個獨立的 ALSA 音量控制

雖然 MPD 默認不允許用戶調整它自己的音量(mpc volume 會影響全局音量),用戶仍然可以通過 ALSA 的「softvol」模塊製作一個控制 MPD 的音量滑條。請將下面的內容添加到 asound.conf

pcm.mpd {
    type softvol
    slave.pcm "default"
    control.name "MPD Playback Volume"
    control.card 0
}

同時連結到 MPD:

mpd.conf
audio_output {
    type "alsa"
    name "ALSA"
    device "mpd"
    mixer_control "MPD"
}

配置完成後就應該可以通過 mpcamixer 控制歌曲音量(也可能需要重啟才能控制音量)。

控制遠程 MPD 服務端

如果 MPD 服務端設備上有 ssh 服務,可以通過 ssh 登錄並使用 ncmpcpp英語ncmpcpp 控制 MPD。

而如果 MPD 服務端監聽了一個可用的接口或埠(例如,在運行 MPD 的設備上使用 $ ss -p -l -t 能觀察到 MPD 正在監聽 0.0.0.0),此時設置 MPD_HOST 環境變量可以讓本地客戶端如 mpc 等指向運行著 MPD 服務的遠程伺服器。

$ export MPD_HOST=ip.of.server
$ export MPD_PORT=6600      # 可选
$ mpc play