Music Player Daemon

出自 Arch Linux 中文维基

這篇文章或章節的翻譯不反映原文。

原因:No updates since 2015-01-17 except a quick touch up 2021-03-29(在 Talk:Music Player Daemon# 中討論)

MPD(Music Player Daemon,音樂播放器守護進程)是一個伺服器-客戶端架構的音頻播放器。佔用極少資源的同時有着播放音頻、管理播放列表和音樂等功能。與它進行交互需要一個單獨的 客戶端

安裝[編輯 | 編輯原始碼]

安裝 mpd 軟件包,或者開發版本 mpd-gitAUR

設置[編輯 | 編輯原始碼]

MPD 可以以 #單用戶配置#全系統範圍配置 (即配置應用給所有用戶)模式運行,也可以在 #多 mpd 實例設置 下同時運行多個實例。將 MPD 設置成哪種方式運行取決於使用它的方式:例如,單用戶配置更容易設置,也可能更適合桌面系統環境。全系統範圍配置則更適合多用戶共享單個 MPD 實例的常在線音頻伺服器。

為了讓 MPD 能夠播放音頻,須要先設置好 ALSA (可選 PulseAudio),並讓它們正常工作。下文的 #配置音頻 小節會說明 ALSA 或者 PulseAudio 所需的參數。

MPD 由 mpd.conf(5) 文件進行配置,運行方式不同(單用戶或全系統範圍),文件的位置也不同。簡單來說,有以下兩個常用位置:

  1. ~/.config/mpd/mpd.conf —— 單用戶配置模式,這是第一個會搜索的位置,
  2. /etc/mpd.conf —— 全系統範圍配置。

下面是常用的配置選項:

  • pid_file - MPD 存儲進程 ID(PID)的文件
  • db_file - 音樂數據庫
  • state_file - 記錄 MPD 當前狀態
  • playlist_directory - 播放列表存儲文件夾
  • music_directory - MPD 在這個文件夾中掃描音樂
  • sticker_file - 標籤數據庫

單用戶配置[編輯 | 編輯原始碼]

MPD 可配置為單用戶使用。以普通用戶運行它有幾點好處:

  • 在一個文件夾 ~/.config/mpd/ 下 (或任何其他在 $HOME 家目錄下的文件夾)重新部署(管理)所有 MPD 配置文件。
  • 避免不可預見的文件夾和文件權限錯誤。

全系統範圍配置[編輯 | 編輯原始碼]

警告: 使用 PulseAudio 並且將 mpd 設置為全局配置的用戶可能需要 一個小技巧 來作為自己的用戶運行 mpd!

The default /etc/mpd.conf keeps the setup in /var/lib/mpd which is assigned to user as well as primary group mpd.

音樂目錄[編輯 | 編輯原始碼]

音樂目錄需要通過 /etc/mpd.conf 文件中的 music_directory 參數來設置:

music_directory "/path/to/music"

MPD需要擁有 所有 音樂收藏父目錄的 +x 權限並且可以讀包含音樂的目錄,這經常與用戶的音樂目錄的默認設置衝突。

有很多方法可以解決這個問題,下面是其中不錯的一個

# gpasswd -a mpd <your login group>
$ chmod 710 /home/<your home dir>
  • 採取以下方式將音樂集合放到不同的路徑

(a)完全移動 (b)綁定掛載 (c)使用 Btrfs 子卷(需要將這一永久改變寫入 /etc/fstab 中)。可以使用 Access Control Lists 調整備用目錄的權限。

MPD 配置必須僅包含一個目錄,如果音樂集包含在多個目錄下,那麼在 /var/lib/mpd 的主音樂目錄下創建符號連結。記得為被連結的目錄設置相應的權限。

啟動 MPD[編輯 | 編輯原始碼]

可以使用 systemd 來控制 MPD 服務,即mpd.service,第一次啟動 MPD 時會花費一些時間,因為 MPD 會掃描音樂目錄。

安裝一個客戶端程序 (ncmpc 是一個輕便易用的客戶端程序),享受音樂吧!

套接字啟動[編輯 | 編輯原始碼]

如果啟用了 mpd.socket,但沒有啟用 mpd.service,systemd 不會立刻啟動 mpd,而是會監聽相應的套接字。當一個 mpd 客戶端試圖連接其中的套接字,systemd 將啟動 mpd.service, 然後透明地將端口的控制權交給 mpd 進程。

如果你希望監聽不同的 UNIX 套接字或者網絡端口(甚至是每個類型的多個套接字),或者你完全不希望監聽網絡端口。你需要 添加/編輯/刪除 mpd.socket 文件中 [Socket] 章節下的 "ListenStream=" 行,並且更改 /etc/mpd.conf 文件中的相應行(具體查看 mpd.conf(5))。

配置音頻[編輯 | 編輯原始碼]

ALSA 用戶需要做以下設備定義,使用聲卡名字或者 pcm (aplay --list-pcms) 代替下面的 My Sound Card 字段。

/etc/mpd.conf
audio_output {
        type            "alsa"
        name            "My Sound Card"
        mixer_type      "software"      # optional
}

mixer_type "software" 選項告訴 'mpd' 使用自己的獨立軟件音量控制。

PulseAudio 用戶需要做以下修改:

/etc/mpd.conf
audio_output {
        type            "pulse"
        name            "pulse audio"
}

PulseAudio 支持多種高級操作。例如:將音頻傳輸到不同的機器。MPD 的高級設置參考 Music Player Daemon Community Wiki

更改用戶[編輯 | 編輯原始碼]

更改用戶組,可能會導致 MPD 運行出現以下類似錯誤: output: Failed to open "My ALSA Device"[alsa]: Failed to open ALSA device "default": No such file or directoryplayer_thread: problems opening audio device while playing "Song Name.mp3"

這是因為 MPD 用戶需要是 audio 組的成員來訪問 /dev/snd/ 下的音頻設備。將 MPD 用戶添加到 audio 組裏來解決這個問題。

# gpasswd -a mpd audio

MPD 啟動時間軸[編輯 | 編輯原始碼]

下面列出的是 MPD 正常啟動的時間軸,用以描述何時 MPD 放棄超級用戶權限,而使用配置中用戶組的權限。

  1. 以 root 身份通過 systemd 啟動 MPD 後,MPD 首先讀取 /etc/mpd.conf 文件。
  2. 然後 MPD 讀取 /etc/mpd.conf 中的用戶變量,從 root 切換到該用戶。
  3. 最後 MPD 讀取 /etc/mpd.conf 中的設置內容,根據內容配置自己。

注意,MPD 會改變運行用戶,從 root 切換到 /etc/mpd.conf 文件中命名的一個用戶。這樣,在配置文件中使用 ~ 會正確的指向 home 用戶目錄,而不是 root 目錄。將所有的 ~ 修改成 /home/username 來避免在 MPD 行為這一方面上的困惑很有必要。

本地配置(單用戶)[編輯 | 編輯原始碼]

好的做法是為所有需要的文件和播放列表創建一個單獨目錄。該目錄可以是任何一個你可以讀寫的目錄。例如: ~/.config/mpd/ 或者 ~/.mpd/。本章節假設該目錄是 ~/.config/mpd/,其對應 $XDG_CONFIG_HOMEXDG Base Directory Specification 的部分)的缺省值 。

MPD 首先搜索配置文件 $XDG_CONFIG_HOME/mpd/mpd.conf,其次搜索 ~/.mpdconf。還可以通過命令行參數指定其他路徑。

將示例配置文件複製到所需的位置。例如:

$ cp /usr/share/doc/mpd/mpdconf.example ~/.config/mpd/mpd.conf

編輯 ~/.config/mpd/mpd.conf 並且指定所需文件:

~/.config/mpd/mpd.conf
# Required files
db_file            "~/.config/mpd/database"
log_file           "~/.config/mpd/log"

# Optional
music_directory    "~/Music"
playlist_directory "~/.config/mpd/playlists"
pid_file           "~/.config/mpd/pid"
state_file         "~/.config/mpd/state"
sticker_file       "~/.config/mpd/sticker.sql"

創建所有上述配置中提及的文件和目錄:

$ mkdir ~/.config/mpd/playlists
$ touch ~/.config/mpd/{database,log,pid,state,sticker.sql}

當配置了所需文件的路徑後,就可以啟動 MPD 了。要指定配置文件的自定義位置,運行:

$ mpd config_file

在 tty 登錄時自啟動[編輯 | 編輯原始碼]

要使 MPD 在登錄時啟動,在 ~/.profile (或者其他的 自啟動文件[損壞的連結:無效的章節] )中添加以下命令:

# MPD daemon start (if no other user instance exists)
[ ! -s ~/.config/mpd/pid ] && mpd

在 X 下自啟動[編輯 | 編輯原始碼]

如果你安裝了桌面環境,編輯下面的文件並將其放到 ~/.config/autostart/

~/.config/autostart/mpd.desktop
[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=Music Player Daemon
Comment=Server for playing audio files
Exec=mpd
StartupNotify=false
Terminal=false
Hidden=false
X-GNOME-Autostart-enabled=false

如果沒有使用桌面環境,將 #在 tty 登錄時自啟動 中的命令加入到 自啟動文件[損壞的連結:無效的章節]

通過 systemd 自啟動[編輯 | 編輯原始碼]

注意: 本章節假設 systemd 用戶會話管理器已經運行。具體信息查看 systemd/用戶

mpd 提供了用戶服務文件 /usr/lib/systemd/user/mpd.service。配置文件預計存在 ~/.mpdconf 或者 ~/.config/mpd/mpd.conf 中,如果想要使用不同的路徑,參考 systemd#修改現存單元文件。進程不會以 root 啟動,所以在 MPD 配置文件中不能使用 usergroup 變量,進程已經擁有用戶權限,因此沒有必要進一步更改他們。

所有你需要做的是啟用和啟動 mpd 用戶服務

注意:
  • mpd 也提供了系統服務文件 /usr/lib/systemd/system/mpd.service,但是當以 root 身份啟動進程時,進程不會讀取用戶配置文件而是會回落到 /etc/mpd.conf全局配置[損壞的連結:無效的章節] 中已經介紹過了。
  • 確保停用任何以前用過的啟動 mpd 的方法。

腳本配置[編輯 | 編輯原始碼]

Rasi 創建了一個腳本,該腳本可以創建合適的目錄結構、配置文件,並且提示用戶音樂目錄的位置。可以在 這裏 下載。

多 mpd 實例設置[編輯 | 編輯原始碼]

在運行 icecast 伺服器中很有用

如果第二個 mpd (例如:通過網絡使用 icecast 輸出來分享音樂)使用和上一個 mpd 相同的音樂和播放列表,只需要複製上一個的配置文件來創建一個新文件(例如:/home/username/.mpd/config-icecast),並且更改 log_file, error_file, pid_file 和 state_file 的參數(例如:mpd-icecast.log, mpd-icecast.error 等等),使用相同的音樂目錄路徑和播放列表目錄將確保第二個 mpd 和第一個 mpd 使用相同的音樂收藏。在第一個 mpd 守護進程下創建和編輯播放列表也會影響第二個守護進程。不需要為第二個守護進程創建相同的播放列表。以相同的方式從上述 ~/.xinitrc 調用第二個守護進程。(僅僅需要確保使用不同的端口號,這樣不會和第一個 mpd 守護進程衝突)。

更好的方法:衛星模式設置

上述的方法在工作過程中,當兩個 mpd 實例寫相同的數據庫文件時,在理論上可能導致數據庫問題。MPD 有一種衛星模式,該模式下,一個實例可以從另一個已經運行的 mpd 實例上接受數據庫。

在 config-icecast 中添加以下代碼,host 和 port 反映了主要 mpd 伺服器的主機和端口。

   database {
   plugin "proxy"
   host "localhost"
   port "6600"
   }

客戶端[編輯 | 編輯原始碼]

需要安裝獨立客戶端才能控制mpd。 常用的有這些:

命令行下[編輯 | 編輯原始碼]

  • mpc — 簡單的基於KISS原則的客戶端。 擁有所有的基本功能。
https://mpd.fandom.com/wiki/Client:Mpc || mpc
  • ncmpc — 一個使用NCursers的客戶端。
https://mpd.fandom.com/wiki/Client:Ncmpc || ncmpc
  • ncmpcpp — 差不多是完全克隆ncmpc的客戶端, 但是有一些用C++寫成的新功能(tag editor, search engine)
https://rybczak.net/ncmpcpp/ || ncmpcpp
  • pms — Highly configurable and accessible ncurses client
http://pms.sourceforge.net/ || pmusAUR[損壞的連結:package not found]
  • vimpc — 基於ncurses的MPD客戶端, 使用類似vi的快捷鍵
https://sourceforge.net/projects/vimpc/ || vimpcAUR[損壞的連結:package not found]

圖形界面下[編輯 | 編輯原始碼]

  • Ario — 一個功能非常豐富的 GTK2 界面的客戶端,靈感來自於 Rhythmbox。
http://ario-player.sourceforge.net/ || ario
  • QmpdClient — 用 Qt 4.x 寫的圖形客戶端。
https://bitcheese.net/QMPDClient || qmpdclientAUR
  • Sonata — 一個用 Python 寫的客戶端,非常優雅。
https://www.nongnu.org/sonata/ || sonataAUR
  • gmpc — GTK2 寫的 MPD 前端。被設計為輕量且易用,同時也對所有的 MPD 的特性提供完全訪問。為用戶提供幾種不同的方法來瀏覽音樂。可以通過很多可獲得的插件來擴展。
http://gmpclient.org/[失效連結 2021-11-13 ⓘ] || gmpcAUR
  • Cantata — 多功能的 Qt4, Qt5 或者 KDE4 客戶端,具有很多可配置的接口。
https://code.google.com/p/cantata/ || cantata

Web界面[編輯 | 編輯原始碼]

  • Patchfork — 用 PHP 和 Ajax 寫的 web 客戶端
https://web.archive.org/web/20170102164901/http://mpd.wikia.com/wiki/Client:Pitchfork || patchfork-gitAUR[損壞的連結:package not found].

mpd wiki 上可以查看到客戶端列表。

參閱[編輯 | 編輯原始碼]