Music Player Daemon
Music Player Daemon (MPD) 是一个具有服务器-客户端架构的音频播放器。MPD 播放音频文件、组织播放列表并维护音乐数据库,同时消耗的资源非常少。要与之交互,需要一个单独的 客户端。
mopidy 是 MPD 的替代品,用 Python 编写。它不是一个完整的 MPD 替代品——它的优势在于它有插件可以从 Spotify、SoundCloud 和 Google Play Music 等云服务播放音乐。
安装
配置
MPD 可以运行在 #每个用户的配置 或 #系统范围的配置 模式下(设置适用于所有用户)。此外,还可以通过 #多 MPD 设置 运行多个 MPD 实例。设置 MPD 的方式取决于其预期的使用方式:本地的每个用户配置更容易设置,并且在桌面系统上可能更适应。系统范围的设置可能更适合一个总是在线的音频服务器,并且有多个用户但共享一个 MPD 实例。
为了让 MPD 能够播放音频,必须设置并运行 ALSA,可选地配合 PulseAudio 或 PipeWire。接下来的 #音频配置 部分描述了 ALSA、PulseAudio 或 PipeWire 所需的参数。
MPD 在 mpd.conf(5) 文件中进行配置,该文件可能位于不同路径,具体取决于选择的设置(系统范围或每个用户)。简而言之,两个常用位置是:
~/.config/mpd/mpd.conf,在每个用户的配置模式下,这是第一个被搜索的位置。/etc/mpd.conf,在系统范围的配置中。
以下是一些最常用的配置选项:
pid_file- MPD 存储其进程 ID 的文件db_file- 音乐数据库state_file- MPD 的当前状态记录在此playlist_directory- 保存播放列表的目录music_directory- MPD 扫描音乐的目录sticker_file- 贴纸数据库
每个用户的配置
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 配置文件以及其他 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 中的文件发生更改时自动刷新数据库。
音频配置
默认情况下,没有配置音频输出,这会导致 MPD 使用 ALSA 进行自动检测。不过,也可以手动配置输出;MPD 甚至支持同时向多个输出发送音频。
所有音频输出都接受一个 name 设置,该名称会显示在 MPD 客户端的输出控制对话框中。(常用设置完整列表)
可以使用 device 选项指定具体的 ALSA 设备;可以通过 alsa-utils 软件包中的 aplay --list-pcm 命令列出设备。(ALSA 特定设置完整列表)
~/.config/mpd/mpd.conf
audio_output {
type "alsa"
name "ALSA sound card"
# Optional
#device "iec958:CARD=Intel,DEV=0"
#mixer_control "PCM"
}
以下配置了一个 PulseAudio 输出(特定设置列表)。可以使用 pactl list short sinks 获取接收器标识符。
~/.config/mpd/mpd.conf
audio_output {
type "pulse"
name "PulseAudio output"
# Optional
#sink "alsa_output.pci-0000_c1_00.6.analog-stereo"
}
以下配置了一个 PipeWire 输出(特定设置列表)。目标标识符可以通过 pw-cli ls Node 命令获取,作为 node.name 属性;音频输出可以通过 media.class = "Audio/Sink" 属性识别(如果可用,也可以通过 pactl list short sinks 获取)。
~/.config/mpd/mpd.conf
audio_output {
type "pipewire"
name "PipeWire output"
# Optional
#target "bluez_output.F4_9D_8A_B4_8D_37.1"
}
pavucontrol 等工具更改 MPD 的输出目标。监听 Unix 域套接字
如果 MPD 将仅在本地使用,那么在 IPC 套接字上运行 MPD 而不是使用网络堆栈,可以提高性能和安全性。
为此,将 bind_to_address 设置为变量或绝对路径。MPD 在使用相对路径时会失败。
~/.config/mpd/mpd.conf
bind_to_address "$XDG_RUNTIME_DIR/mpd/socket"
然后导出环境变量 MPD_HOST="$XDG_RUNTIME_DIR/mpd/socket"。
使用 systemd 自动启动
mpd 包提供了一个 用户服务 文件。该服务以用户身份启动进程,无需更改权限或在 MPD 配置文件中使用 user 和 group 变量。
启动/启用 用户单元 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 工具创建一个 MPD 配置,该配置针对 bit perfect 音频播放进行了优化,无需任何重采样或转换,使用 ALSA 接口的硬件地址 (hw:x,y)。
系统范围配置
默认的 /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 通配符列表。然后,当前目录和所有子目录中匹配的文件将被排除在后续更新之外。
使用 systemd 启动
MPD 可以使用 mpd.service 通过 systemd 进行控制。首次启动可能需要一些时间,因为 MPD 将扫描您的音乐目录。
通过启动一个客户端应用程序来测试一切(ncmpc 是一个轻量级且易于使用的客户端),然后播放一些音乐!
套接字激活 (Socket activation)
mpd 提供了一个 mpd.socket 单元。如果启用了 mpd.socket(并且禁用了 mpd.service),systemd 不会立即启动 MPD,它只会监听相应的套接字。然后,每当 MPD 客户端尝试连接到其中一个套接字时,systemd 就会启动 mpd.service 并透明地将这些端口的控制权移交给 MPD 进程。
如果您希望监听不同的 UNIX 套接字或网络端口(甚至多个套接字/端口),或者您根本不想监听网络端口,请相应地编辑 mpd.socket 单元,**并**修改 /etc/mpd.conf 以匹配配置(有关详细信息,请参阅 mpd.conf(5))。
用户 ID 启动流程
MPD 永远不应该以 root 身份运行;您可以使用配置文件中的 user 选项让 MPD 在初始化后更改其用户 ID。如果您以非特权用户身份启动 MPD,请不要使用此选项。为了描述 MPD 如何放弃其超级用户权限并切换到配置文件中设置的用户权限,以下列出了正常 MPD 启动的步骤:
- 由于 MPD 是由 systemd 以 root 身份启动的,它首先读取
/etc/mpd.conf文件。 - MPD 读取配置文件中的
user变量,并从 root 切换到该用户。 - MPD 然后读取配置文件的其余部分并相应地进行自我配置。配置文件中使用
~指的是用户的家目录,而不是 root 的目录。
多 MPD 设置
运行 Icecast 服务器
对于第二个 MPD(例如,使用 Icecast 输出,通过网络共享音乐),使用与上面相同的音乐和播放列表,只需复制上面的配置文件并创建一个新文件(例如,/home/username/.mpd/config-icecast),然后仅更改 log_file、error_file、pid_file 和 state_file 参数(例如 mpd-icecast.log、mpd-icecast.error 等)。使用相同的目录路径作为音乐和播放列表目录将确保第二个 MPD 使用与第一个 MPD 相同的音乐集合,例如,在第一个守护进程下创建和编辑一个播放列表也会影响第二个守护进程。用户不必为第二个守护进程重新创建相同的播放列表。像上面一样从 ~/.xinitrc 调用第二个守护进程——但要确保使用不同的端口号,以避免与第一个 MPD 守护进程冲突。
卫星设置
上面 #运行 Icecast 服务器 中描述的方法可行,但至少在理论上,当两个 MPD 实例尝试同时写入同一个数据库文件时,可能会导致数据库出现问题。MPD 有一个 卫星模式,其中一个实例可以从已运行的 MPD 实例接收数据库。
在您的 config-icecast 中添加此内容,其中 host 和 port 反映了您的主 MPD 服务器:
database {
plugin "proxy"
host "localhost"
port "6600"
}
客户端
需要一个单独的客户端来控制 MPD。请参阅 MPD 网站上的长列表客户端 mpd website。流行的选项包括:
Command-line
- mpc — 使用 C 编写的 MPD 服务器命令行用户界面。
控制台
- clerk — 使用 Rofi 的 MPD 客户端。
- gomp — 受 ncmpcpp 启发的 MPD 客户端,内置封面视图和 LastFM 集成。
- inori — 具有折叠库视图和有效搜索功能的 MPD 客户端。
- mmtc — 简约的 mpd 终端客户端,旨在简单但高度可配置。
- ncmpc — 使用 C++ 编写的 MPD ncurses 客户端。
- ncmpcpp — ncmpc 的几乎完全克隆,使用 C++ 编写,并带有一些附加功能(标签编辑器、搜索引擎)。
- ncmpy — 基于 Python 编写的curses MPD 客户端。
- nncmpp — 另一个 MPD 客户端。实际上是 Sonata 的简化 TUI 版本。
- pms — 使用 Go 编写的高度可配置且易于访问的 ncurses 客户端。
- rmpc — 受 ncmpcpp 和 ranger 启发的、支持通过各种图形协议显示专辑封面的可配置 MPD 客户端。
- vimpc — 基于 ncurses 的 MPD 客户端,具有类似 vi 的按键绑定。
图形界面
- Ario — 功能非常丰富的 GTK3 MPD GUI 客户端,灵感来自 Rhythmbox。
- Cantata — 未维护的、功能丰富的 Qt5 MPD 客户端,具有高度可配置的界面。
- CoverGrid — GTK3 GUI 客户端,侧重于专辑而不是单曲。
- Euphonica — Libadwaita MPD 客户端,带可视化器、维基和同步歌词。
- MPD Plasma Widget — 用于 KDE Plasma 桌面的 Plasmoid 部件。
- https://store.kde.org/p/2258843 || 通过 Plasma 桌面环境内置的部件商店安装。
- myMPD — 独立且移动友好的基于 Web 的 MPD 客户端,占用空间小且功能强大。
- Plattenalbum — 一个现代、小巧的 GTK4 MPD 客户端,用 Python 编写。
- QMPDClient — Qt5 GUI 客户端。
- Quimup — 简单的 Qt5 MPD 前端,用 C++ 编写。
- RompЯ — MPD 的 Web 客户端。
- SkyMPC — 简单的 MPD 客户端,由 Qt5 提供支持。
- Sonata — 优雅的 Python GTK 客户端。
- Xfce MPD Panel Plugin — MPD 插件 for Xfce4 面板。
- Xfmpc — 图形 GTK MPD 客户端,注重低占用。
- ympd — 基于 C 编写的独立 MPD Web GUI,使用 Websockets 和 Bootstrap/JS。
- https://ympd.org/ || ympdAUR
- Ymuse — 简单、功能齐全、响应迅速的 GTK 前端(客户端),用 Go 编写,用于 Music Player Daemon。
Misc
- mpd-mpris — MPD 的 MPRIS 实现。
- mpdris2-rs — 为 mpd 提供 MPRIS V2.2 D-Bus 接口。
- mpc.el — Emacs 中的 Music Player Daemon 客户端。