Music Player Daemon

来自 ArchWiki

MPD (music player daemon) 是一个具有服务器-客户端架构的音频播放器。它播放音频文件,组织播放列表并维护音乐数据库,同时使用极少的资源。为了与之交互,需要一个单独的客户端

安装

安装 mpd 软件包,或 mpd-gitAUR 以获取开发版本。

配置

MPD 可以在#用户配置#系统级配置模式下运行(设置应用于所有用户)。也可以在#多 MPD 设置中运行 MPD 的多个实例。设置 MPD 的方式取决于其预期用途:本地用户配置更易于设置,并且可能更适合桌面系统。系统级设置可能更适合具有多个用户但共享 MPD 实例的始终在线的音频服务器。

为了使 MPD 能够播放音频,必须设置并运行 ALSA,可以选择使用 PulseAudioPipeWire#音频配置章节随后描述了 ALSAPulseAudioPipeWire 所需的参数。

MPD 在文件 mpd.conf(5) 中配置,该文件可能位于根据所选设置(系统级或用户级)的不同路径中。简而言之,常用的两个位置是

  1. ~/.config/mpd/mpd.conf 在用户配置模式下,这是搜索的第一个位置,
  2. /etc/mpd.conf 在系统级配置中。

以下是一些最常用的配置选项

  • pid_file - MPD 存储其进程 ID 的文件
  • db_file - 音乐数据库
  • state_file - MPD 的当前状态在此处记录
  • playlist_directory - 播放列表保存到的目录
  • music_directory - MPD 扫描音乐的目录
  • sticker_file - sticker 数据库

用户配置

MPD 可以按用户配置。以普通用户身份运行它的好处是

  • 将所有 MPD 配置文件重新组合到一个目录 ~/.config/mpd/ (或 $HOME 下的任何其他目录)中。
  • 避免不可预见的目录和文件权限错误。

配置文件和目录的位置

在用户模式下,配置从 $XDG_CONFIG_HOME/mpd/mpd.conf 读取。我们在此假设 $XDG_CONFIG_HOME 等于 默认~/.config

要构建用户配置,软件包中包含的 MPD 配置示例 是一个很好的起点,使用以下行复制它

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

一个好的做法是使用新创建的 ~/.config/mpd/ 目录来存储配置文件以及其他 MPD 相关文件,如数据库或播放列表。用户必须对此目录具有读写访问权限。

然后编辑配置文件以指定必需和可选的文件和目录

~/.config/mpd/mpd.conf
# Recommended location for database
db_file            "~/.config/mpd/database"

# If running mpd using systemd, delete this line to log directly to systemd.
log_file           "syslog"

# The music directory is by default the XDG directory, uncomment to amend and choose a different directory
#music_directory    "~/music"

# Uncomment to refresh the database whenever files in the music_directory are changed
#auto_update "yes"

# Uncomment to enable the functionalities
#playlist_directory "~/.config/mpd/playlists"
#pid_file           "~/.config/mpd/pid"
#state_file         "~/.local/state/mpd/state"
#sticker_file       "~/.config/mpd/sticker.sql"

如果在配置中启用了播放列表,则必须创建指定的播放列表目录

$ mkdir ~/.config/mpd/playlists

如果设置了 state_file,则必须创建指定的目录

$ mkdir -p ~/.local/state/mpd

MPD 现在可以启动了(可以指定配置文件的可选自定义位置)

$ mpd [config_file]

为了构建数据库文件,MPD 必须扫描上面定义的 music_directory。要请求此任务,必须使用 MPD 客户端之一。例如,使用 mpc 的命令是

$ mpc update

或者,可以设置配置中的 auto_update 选项为 "yes",以便在 music_directory 中的文件发生更改时刷新数据库。

音频配置

如果使用 ALSA,则默认设备的自动检测应该可以开箱即用,无需任何特定设置。如果不是,则随后提供了 ALSA 音频输出定义的语法;必需的 name 参数指定音频输出的唯一名称。可以使用包 alsa-utils 中的 aplay --list-pcm 显示的确切设备可以选择使用 device 选项指示。

~/.config/mpd/mpd.conf
audio_output {
        type          "alsa"
        name          "ALSA sound card"
        # Optional
        #device        "iec958:CARD=Intel,DEV=0"
        #mixer_control "PCM"
}

使用 PulseAudio 的用户将需要进行以下修改

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

也可以配置使用 PipeWire 输出

~/.config/mpd/mpd.conf
audio_output {
        type            "pipewire"
        name            "PipeWire Sound Server"
}

使用 systemd 自动启动

mpd 软件包提供了一个 用户服务 文件。该服务以用户身份启动进程,无需更改权限,也无需在 MPD 配置文件中使用 usergroup 变量。

启动/启用 用户单元 mpd.service (即使用 --user 标志)。

注意: 配置文件从 ~/.config/mpd/mpd.conf 读取,如果您想指示自定义配置文件路径,请参阅 systemd#编辑提供的单元

在 tty 登录时自动启动

要在登录时启动 MPD,请将以下内容添加到 ~/.profile 或另一个 自动启动文件

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

脚本配置

mpd-configure 工具创建一个针对 bit perfect 音频播放优化的 MPD 配置,不进行任何重采样或转换,使用 ALSA 接口硬件地址 (hw:x,y)。

系统级配置

注意: 使用系统级 MPD 配置的 PulseAudio 用户必须实施一个 变通方法,以便以其自己的用户身份运行 MPD!

默认的 /etc/mpd.conf 将设置保存在 /var/lib/mpd 中,该目录分配给用户以及主组 MPD。

音乐目录

音乐目录由配置文件 /etc/mpd.conf 中的选项 music_directory 定义。

MPD 需要对音乐收藏的所有父目录具有执行权限,并且还需要对包含音乐文件的所有目录具有读取权限。这可能与用户目录(如 ~/Music,音乐存储在此处)的默认配置冲突。

虽然有多种解决方案来解决此问题,但以下方法之一应该最实用

  • 切换到#用户配置模式
  • mpd 用户添加到用户的组,并授予用户目录组执行权限。这样,mpd 用户就有权打开用户目录
# gpasswd -a mpd user_group_name
$ chmod 710 /home/user_directory
  • 将音乐收藏存储在不同的路径中,可以是
    • 完全移动它,
    • 使用绑定挂载,
    • 或使用 Btrfs#子卷(您应该通过在 /etc/fstab 中添加条目来使此更改持久化)。

MPD 配置文件必须仅定义一个音乐目录。如果音乐收藏包含在多个目录下,请在 /var/lib/mpd 中的主音乐目录下创建符号链接。请记住相应地设置被链接目录的权限。

要从更新中排除文件或文件,请在其父目录中创建一个名为 .mpdignore 的文件。该文件的每一行可能包含 shell 通配符列表。然后,当前目录和所有子目录中匹配的文件将从后续更新中排除。

注意: MPD 能够读取某些存档文件格式中的音乐文件,如果它们位于音乐目录中,则会在更新期间添加这些文件;tar 已知是一个例外。

使用 systemd 启动

可以使用 mpd.service 使用 systemd 控制 MPD。首次启动可能需要一些时间,因为 MPD 将扫描您的音乐目录。

通过启动客户端应用程序(ncmpc 是一个轻巧且易于使用的客户端)并播放一些音乐来测试一切!

Socket 激活

mpd 提供了一个 mpd.socket 单元。如果启用了 mpd.socket(并禁用了 mpd.service),systemd 将不会立即启动 MPD,它只会监听适当的 socket。然后,每当 MPD 客户端尝试连接到这些 socket 之一时,systemd 将启动 mpd.service 并透明地将这些端口的控制权移交给 MPD 进程。

如果您希望监听不同的 UNIX socket 或网络端口(甚至每种类型的多个 socket),或者如果您希望完全不监听网络端口,请编辑 mpd.socket 单元以进行适当的调整,修改 /etc/mpd.conf 以匹配配置(有关详细信息,请参阅 mpd.conf(5))。

用户 ID 启动工作流程

MPD 永远不应以 root 身份运行;您可以使用配置中的 user 选项使 MPD 在初始化后更改其用户 ID。如果您以非特权用户身份启动 MPD,请不要使用此选项。为了描述 MPD 如何放弃其超级用户权限并切换到配置中设置的用户的权限,下面列出了正常 MPD 启动的步骤

  1. 由于 MPD 由 systemd 以 root 身份启动,因此它首先读取 /etc/mpd.conf 文件。
  2. MPD 读取配置中的 user 变量,并从 root 更改为该用户。
  3. 然后,MPD 读取配置文件的其余部分并相应地配置自身。配置文件中使用 ~ 指向用户的主目录,而不是 root 的目录。

多 MPD 设置

运行 Icecast 服务器

对于第二个 MPD(例如,使用 Icecast 输出以通过网络共享音乐),使用与上面相同的音乐和播放列表,只需复制上面的配置文件并创建一个新文件(例如,/home/username/.mpd/config-icecast),并且仅更改 log_fileerror_filepid_filestate_file 参数(例如 mpd-icecast.logmpd-icecast.error 等)。为音乐和播放列表目录使用相同的目录路径将确保第二个 MPD 使用与第一个 MPD 相同的音乐收藏,例如,在第一个守护程序下创建和编辑播放列表也会影响第二个守护程序。用户不必为第二个守护程序重新创建相同的播放列表。从上面的 ~/.xinitrc 中以相同的方式调用第二个守护程序 - 但请务必使用不同的端口号,避免与第一个 MPD 守护程序冲突。

卫星设置

#运行 Icecast 服务器 中描述的方法有效,但至少在理论上可能会导致数据库出现问题,因为两个 MPD 实例都尝试并发写入同一个数据库文件。MPD 具有 卫星模式,其中一个实例可以从已运行的 MPD 实例接收数据库。

在您的 config-icecast 中添加此内容,其中 host 和 port 反映您的主 MPD 服务器

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

客户端

需要单独的客户端来控制 MPD。请参阅 mpd 网站上的客户端长列表。流行的选项有

命令行

  • mpc — 用 C 语言编写的 MPD 服务器命令行用户界面。
https://www.musicpd.org/clients/mpc/ || mpc

控制台

  • clerk — 使用 Rofi 的 MPD 客户端。
https://github.com/carnager/clerk || clerk-gitAUR
  • gomp — 受 ncmpcpp 启发的 MPD 客户端,具有内置的封面艺术视图和 LastFM 集成。
https://github.com/aditya-K2/gomp || gomp-gitAUR
  • inori — 具有折叠库视图和有效搜索功能的 MPD 客户端。
https://github.com/eshrh/inori || inoriAUR
  • mmtc — 旨在简单但高度可配置的最小 mpd 终端客户端。
https://github.com/figsoda/mmtc || mmtcAUR
  • ncmpc — 用 C++ 编写的 MPD 的 Ncurses 客户端。
https://www.musicpd.org/clients/ncmpc/ || ncmpc
  • ncmpcpp — 几乎是 ncmpc 的精确克隆,用 C++ 编写,并带有一些附加功能(标签编辑器、搜索引擎)。
https://rybczak.net/ncmpcpp/ || ncmpcpp
  • ncmpy — 用 Python 编写的基于 Curses 的 MPD 客户端。
https://repo.cykerway.com/ncmpy || ncmpyAUR
  • nncmpp — 又一个 MPD 客户端。它实际上是 Sonata 的简化 TUI 版本。
https://git.janouch.name/p/nncmpp/ || nncmpp-gitAUR
  • pms — 用 Go 编写的高度可配置且可访问的 ncurses 客户端。
https://github.com/kimtore/pms || pmus-gitAUR
  • rmpc — 受 ncmpcpp 和 ranger 启发的,可通过各种图形协议支持专辑封面的可配置 MPD 客户端。
https://mierak.github.io/rmpc/ || rmpc-gitAUR
  • vimpc — 具有 vi-like 键绑定的基于 Ncurses 的 MPD 客户端。
https://github.com/boysetsfrog/vimpc || vimpc-gitAUR

图形界面

  • Ario — 非常功能丰富的 GTK3 GUI 客户端,灵感来自 Rhythmbox
https://ario-player.sourceforge.net/ || ario
  • Cantata — 未维护的高功能 Qt5 客户端,具有高度可配置的界面。
https://github.com/CDrummond/cantata || cantataAUR
  • CoverGrid — GTK3 GUI 客户端,专注于专辑而不是单曲。
https://www.suruatoel.xyz/codes/mcg || mcgAUR
  • Plattenalbum — 一个现代且小巧的 GTK4 MPD 客户端,用 python 编写。
https://github.com/SoongNoonien/plattenalbum || plattenalbumAUR
  • QMPDClient — Qt5 GUI 客户端。
https://bitcheese.net/QMPDClient/ || qmpdclientAUR
  • Quimup — 用 C++ 编写的 MPD 的简单 Qt5 前端。
https://sourceforge.net/projects/quimup/ || quimupAUR
  • RompЯ — MPD 的 Web 客户端。
https://fatg3erman.github.io/RompR/ || romprAUR
  • SkyMPC — 简单的 MPD 客户端,由 Qt5 驱动。
https://github.com/soramimi/SkyMPC || skympc-gitAUR
  • Sonata — 优雅的 Python GTK 客户端。
https://www.nongnu.org/sonata/ || sonata-gitAUR
  • Xfce MPD 面板插件Xfce4 面板的 MPD 插件。
https://goodies.xfce.org/projects/panel-plugins/xfce4-mpc-plugin || xfce4-mpc-plugin
  • Xfmpc — 专注于低占用空间的图形 GTK MPD 客户端。
https://goodies.xfce.org/projects/applications/xfmpc || xfmpc
  • ympd — 用 C 语言编写的独立 MPD Web GUI,利用 Websockets 和 Bootstrap/JS。
https://ympd.org/ || ympdAUR
  • Ymuse — 用 Go 编写的 Music Player Daemon 的简单、实用且快速的 GTK 前端(客户端)。
https://yktoo.com/en/software/ymuse/ || ymuseAUR

参见