Music Player Daemon (简体中文)
MPD(Music Player Daemon,音乐播放器守护进程)是一个服务器-客户端架构的音频播放器。占用极少资源的同时有着播放音频、管理播放列表和音乐等功能。与它进行交互需要一个单独的 客户端。
安装
设置
MPD 可以以 #单用户配置、#全系统范围配置 (即配置应用给所有用户)模式运行,也可以在 #MPD 多实例运行设置[损坏的链接:无效的章节] 下同时运行多个实例。将 MPD 设置成哪种方式运行取决于使用它的方式:例如,单用户配置更容易设置,也可能更适合桌面系统环境。全系统范围配置则更适合多用户共享单个 MPD 实例的常在线音频服务器。
为了让 MPD 能够播放音频,须要先设置好 ALSA (可选 PulseAudio),并让它们正常工作。下文的 #音频配置[损坏的链接:无效的章节] 小节会说明 ALSA 或者 PulseAudio 所需的参数。
MPD 由 mpd.conf(5) 文件进行配置,运行方式不同(单用户或全系统范围),文件的位置也不同。简单来说,有以下两个常用位置:
-
~/.config/mpd/mpd.conf
—— 单用户配置模式,这是第一个会搜索的位置, -
/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 配置文件。 - 避免不可预见的文件夹和文件权限错误。
全系统范围配置
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
权限并且可以读包含音乐的目录,这经常与用户的音乐目录的默认设置冲突。
有很多方法可以解决这个问题,下面是其中不错的一个
- 将 MPD 作为用户运行
- 将 mpd 用户添加到登录组,并授予用户目录组权限。
# 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 directory
,player_thread: problems opening audio device while playing "Song Name.mp3"
这是因为 MPD 用户需要是 audio 组的成员来访问 /dev/snd/
下的音频设备。将 MPD 用户添加到 audio 组里来解决这个问题。
# gpasswd -a mpd audio
MPD 启动时间轴
下面列出的是 MPD 正常启动的时间轴,用以描述何时 MPD 放弃超级用户权限,而使用配置中用户组的权限。
- 以 root 身份通过 systemd 启动 MPD 后,MPD 首先读取
/etc/mpd.conf
文件。 - 然后 MPD 读取
/etc/mpd.conf
中的用户变量,从 root 切换到该用户。 - 最后 MPD 读取
/etc/mpd.conf
中的设置内容,根据内容配置自己。
注意,MPD 会改变运行用户,从 root 切换到 /etc/mpd.conf
文件中命名的一个用户。这样,在配置文件中使用 ~
会正确的指向 home 用户目录,而不是 root 目录。将所有的 ~
修改成 /home/username
来避免在 MPD 行为这一方面上的困惑很有必要。
本地配置(单用户)
好的做法是为所有需要的文件和播放列表创建一个单独目录。该目录可以是任何一个你可以读写的目录。例如: ~/.config/mpd/
或者 ~/.mpd/
。本章节假设该目录是 ~/.config/mpd/
,其对应 $XDG_CONFIG_HOME
( XDG 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 自启动
mpd 提供了用户服务文件 /usr/lib/systemd/user/mpd.service
。配置文件预计存在 ~/.mpdconf
或者 ~/.config/mpd/mpd.conf
中,如果想要使用不同的路径,参考 systemd (简体中文)#修改现存单元文件。进程不会以 root 启动,所以在 MPD 配置文件中不能使用 user
和 group
变量,进程已经拥有用户权限,因此没有必要进一步更改他们。
所有你需要做的是启用和启动 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原则的客户端。 拥有所有的基本功能。
- ncmpc — 一个使用NCursers的客户端。
- ncmpcpp — 差不多是完全克隆ncmpc的客户端, 但是有一些用C++写成的新功能(tag editor, search engine)
- 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。
- QmpdClient — 用 Qt 4.x 写的图形客户端。
- Sonata — 一个用 Python 写的客户端,非常优雅。
- gmpc — GTK2 写的 MPD 前端。被设计为轻量且易用,同时也对所有的 MPD 的特性提供完全访问。为用户提供几种不同的方法来浏览音乐。可以通过很多可获得的插件来扩展。
- http://gmpclient.org/[失效链接 2021-11-13 ⓘ] || gmpcAUR
- Cantata — 多功能的 Qt4, Qt5 或者 KDE4 客户端,具有很多可配置的接口。
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 上可以查看到客户端列表。