組織和管理音樂庫
MPD 不負責管理用戶的音樂庫。想要管理功能,請查看 beets包 或 picard包。
同步播放記錄至 Last.fm/Libre.fm
下面有一些方法用於將 MPD 的歌曲播放記錄同步至 Last.fm 或 Libre.fm。
mpdas
mpdas 是一款支持 MPD 的音頻記錄器客戶端,使用 curl包 和 libmpd包 並由 C++ 編寫而成。mpdas 支持最新的音頻記錄器協議(2.0),同時能在無網絡連接的情況下,將未同步的播放記錄緩存至 ~/.mpdascache
。
可以安裝 mpdasAUR 軟體包。
Mpdas 配置簡單,請參考官方的說明。/etc/mpdasrc
本身就是一份非常基礎的配置示例。
要讓 mpdas 隨 mpd 一同啟動,請在啟動 mpd 的文件中增加 mpdas 的啟動條目(例如 xinitrc):
[[ -z $(pgrep -xU $UID mpdas) ]] && mpdas &
若 mpd 是以 systemd 用戶服務啟動,最好也將 mpdas 作為一個用戶單元啟動。
mpdscribble
mpdscribble包 是一個守護進程,它因為作為一個半官方的 MPD 記錄器,並且使用了 MPD 中新的「idle」功能,記錄更精確,可以說是同步播放記錄的最佳方案。由於不需要更改任何 /etc
目錄下的文件,因此無需 root 權限即可進行配置。詳情請訪問官方網站。
Mpdscribble 自帶一份配置示例:/usr/share/mpdscribble/mpdscribble.conf.example
,將其複製到 ~/.mpdscribble/mpdscribble.conf
然後按需編輯。
用戶密碼也可以使用 md5hash 形式:
echo -n "password" | md5sum | cut -f 1 -d " "
可以在 systemd 用戶實例下使用 mpdscribble.service
讓 mpdscribble 自動啟動。詳情請參考 systemd/用戶。
同樣可以讓 mpdscribble 與 mpd 一同自動啟動,請在啟動 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 自身的算法(通常會更低)。請查看下面的內容以了解如何選擇。 }
若希望讓 ALSA resp. 決定 MPD 使用的位深度,注釋掉 resp. 並省略 dimx.format 這一行,同時將 mpd 的 format 更改為 "44100:*:2"。
用 LIRC 控制 MPD
已有一些客戶端被設計用於在 lircd 與 MPD 之間進行通信,然而在實際使用過程中,這些客戶端由於功能限制,並不實用。
建議將 mpc 與 irexec 一同使用。mpc 是一個命令行播放器,它僅僅能夠將命令發送至 MPD,隨後立即退出(這一點與 irexec 配合極佳),命令執行器已經包含在 lirc 中了。irexec 會在接收到一個遠程控制按鈕的消息時執行特定的命令。
首先,請根據 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 文件的程序,分別是:cantataAUR 和 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 或 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 腳本,使用 libnotify包 為 Music 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" }
配置完成後就應該可以通過 mpc
和 amixer
控制歌曲音量(也可能需要重啟才能控制音量)。
控制遠程 MPD 服務端
如果 MPD 服務端設備上有 ssh 服務,可以通過 ssh 登錄並使用 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