跳转至内容

Music Player Daemon/技巧和窍门

来自 ArchWiki

返回 Music Player Daemon.

组织库

MPD 不管理您的音乐库。请查看 beetspicard

Last.fm/Libre.fm 播放记录

注意 mpd 0.18 版本已移除 Last.fm 支持。但是,一些客户端提供独立于 mpd 的播放记录功能。

在使用 MPD 时,要将您的歌曲播放记录发送到 Last.fmLibre.fm,有几种可能性。

mpdas

mpdas 是一个为 MPD 编写的 AudioScrobbler 客户端,使用 C++ 编写。它使用 curllibmpd。mpdas 支持最新的 AudioScrobbler 协议 (2.0),并且在没有网络连接时会将未记录的播放记录缓存在 ~/.mpdascache 中。

可以在 AUR 中找到 mpdasAUR 包。

mpdas 的配置非常简单,请参阅官方 README/etc/mpdasrc 的一个非常基本的示例也作为 /etc/mpdasrc 提供。

要与 mpd 一起自动启动 mpdas,请在启动 mpd 的文件中添加一个条目 (例如 xinitrc)

[[ -z $(pgrep -xU $UID mpdas) ]] && mpdas &

mpd 作为 systemd 用户服务启动时,最好也以 用户单元的形式 启动 mpdas

提示 如果在系统启动后收到失败的 mpdas.service,请考虑使用 mpd.socket套接字激活

mpdscribble

mpdscribble 是一个守护进程,可以说是最好的替代方案,因为它被半官方地认为是 MPD 的播放记录器,并且使用了 MPD 中新的“idle”功能以实现更精确的播放记录。此外,您不需要 root 权限来配置它,因为它不需要对 /etc 进行任何更改。访问 官方网站 获取更多信息。

包含一个示例配置:/usr/share/mpdscribble/mpdscribble.conf.example,将其复制到 ~/.mpdscribble/mpdscribble.conf 并进行编辑。

注意 其解析器不支持行尾注释。请将它们写在自己的行上。

您的密码也可以是 md5hash 的形式

echo -n "password" | md5sum | cut -f 1 -d " "

要自动启动 mpdscribble,您可以使用 systemd 用户实例下的 mpdscribble.service。有关详细信息,请参阅 systemd/User

或者,您可以与 mpd 一起自动启动 mpdscribble,在启动 mpd 的文件中添加一个条目 (例如 ~/.xinitrc)

[[ -z $(pgrep -xU $UID mpdscribble) ]] && mpdscribble &
注意 如果您收到 [last.fm] handshake failed, username or password incorrect (BADAUTH) 错误,请确保您的用户名和密码正确,并且您的密码不是 32 个字符长[死链接 2025-08-16—SSL 错误]

Sonata

Sonata 内建支持播放记录,但这需要程序一直运行。此外,Sonata 不会缓存无法及时转发到 Last.fm 的歌曲,这意味着它们不会被添加到统计数据中。

YAMS

YAMS 是一个用 Python 编写的 MPD 的 Last.FM 播放记录守护进程。

由于它是为 Last.FM 的 播放记录 API v2.0 编写的,YAMS 不会在本地存储您的用户名或密码,而是选择使用 cookie。与其他播放记录器类似,YAMS 可以保存失败的播放记录并在稍后上传。它还提供了相当多的配置选项,用于何时/如何进行播放记录 (包括忽略连续播放多次的曲目重复记录)。

可以在 AUR 中找到 python-yamsAUR 包。

为了进行身份验证,用户 *必须* 在交互式终端中至少运行一次 yams 命令,并按照打印的说明进行操作。

之后,YAMS 可以使用其二进制文件启动

yams 默认作为守护进程运行 (yams -N 会在前台运行)。

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 位深度,同时运行多个程序

为什么选择这些格式? 因为它们是 CD 音频的标准格式,因为 ALSA 本身只允许一个程序“发声”是通过 dmix — 它默认使用较差的重采样算法 — 并且因为 dmix 默认会将任何低于此的值重采样到 48 KHz (或当时正在播放的任何更高格式)。此外,如果至少 mpd.conf 没有这样更改,一些用户会听到点击声。

缺点是什么? 这些设置会导致 *所有* 内容 (如果需要) 被重采样为此格式,例如来自 DVD 或电视的内容,它们通常是 48 KHz。但是,没有已知的方法可以让 ALSA 动态更改格式,特别是如果您收听的 CD 比其他任何内容都多,偶尔的 48 到 44.1 的转换损失并不算太大。

以下假设不存在可能与之冲突或覆盖它的其他设置。这尤其适用于当前用户的潜在 ~/.asoundrc — MPD 以其自己的用户身份会忽略它,因此以下内容应放入 /etc/asound.conf

/etc/asound.conf
defaults.pcm.dmix.rate 44100 # Force 44.1 KHz
defaults.pcm.dmix.format S16_LE # Force 16 bits
/etc/mpd.conf
audio_output {
        type                    "alsa" # Use the ALSA output plugin.
	name			"your_custom_name" # Must be present and does not have to match the actual card name , e.g. what you have in /etc/asound.conf
        options                 "dev=dmixer"
        device                  "plug:dmix" # Both lines cause MPD to output to dmix
	format	        	"44100:16:2" # the actual format
	auto_resample		"no" # This bypasses ALSA's own algorithms, which generally are inferior. See below how to choose a different one.
}
注意 MPD 对 mp3 格式的解码有特殊处理:它始终以 24 位输出。(由 format 行强制的转换是在此之后进行的。)

如果希望将位深度选择留给 ALSA 或 MPD,请注释掉或省略 dmix.format 行,并将 mpd 的 format 行更改为 "44100:*:2"。

注意 在不同位深度的文件之间进行 *交叉渐入* (例如,一个 mp3 和一个 16 位 flac) 在转换激活之前无法正常工作。

使用 lirc 控制 MPD

已经有一些客户端设计用于 lircd 和 MPD 之间的通信,然而,就实际使用而言,它们作用不大,因为它们的功能有限。

建议使用 mpc 和 irexec。mpc 是一个命令行播放器,它只将命令发送到 MPD 并立即退出,这对于 irexec 非常完美,irexec 是 lirc 中包含的命令运行器。irexec 的作用是,一旦收到遥控器按钮,它就会运行指定的命令。

首先,请参考 LIRC 文章设置您的遥控器。

编辑您喜欢的 lirc 启动配置文件,默认位置是 ~/.lircrc

在文件中填写以下模式

begin
     prog = irexec
     button = <button_name>
     config = <command_to_run>
     repeat = <0 or 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 还有更多功能,运行 mpc(1) 获取更多信息。

PulseAudio

本地 (以您自己的用户身份)

不需要特殊选项;只需添加一个脉冲输出,如 mpd 的配置文件注释中所述。

本地 (使用单独的 mpd 用户)

当如 wiki 说明中所述以自己的用户身份运行时,mpd 将无法向另一个用户 的 pulseaudio 服务器发送声音。与其设置一个系统范围的 pulseaudio 守护进程 (这是 upstream 强烈不推荐的做法),不如配置 mpd 使用 pulseaudio 的 TCP 模块将声音发送到 localhost。

首先,编辑 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

可以使用 ; 作为分隔符,添加额外的 IP 地址范围 (cidr 表示法)。完成此操作后,重新启动 pulseaudio。

$ pulseaudio --kill
$ pulseaudio --start -or- start-pulseaudio-x11/kde

接下来,编辑 /etc/mpd.conf 并添加一个新的脉冲输出,指向 127.0.0.1 作为“远程”服务器。

audio_output {
       type		"pulse"
       name		"Local Music Player Daemon"
       server		"127.0.0.1"
}

添加此项后,重新启动 mpd。

现在您应该有一个本地运行的 mpd,可以被所有允许从 127.0.0.1 发送声音的 pulseaudio 服务器的用户使用。

远程

与任何启用了 PulseAudio 的程序一样,mpd 可以通过网络发送声音。运行 mpd 的服务器上不需要完整的 PulseAudio 系统;libpulse 是充当源的唯一要求,并且已经是 mpd 的依赖项。

要将音频从 mpd 发送到另一台计算机,请按照上面的说明进行操作,在运行 mpd 的服务器上编辑 /etc/mpd.conf,使用目标计算机的 IP 地址,并在目标计算机上编辑 /etc/pulse/default.pa$XDG_CONFIG_HOME/default.pa (通常是 ~/.config/pulse/default.pa),使用服务器的 IP 地址。

完成后,服务器的 mpd 源应该在目标计算机上显示为正常源,在播放或暂停时可以像往常一样进行重路由和控制;当 mpd 停止时,目标计算机上将不会显示任何源。

Cue 文件

自 0.17 版本以来,mpd 对 cue 文件支持无需额外步骤。MPD 有自己的集成解析器,可与外部和嵌入式 cue 表一起使用。例如,命令 $ mpc load albumx/x.cue 会加载 music_directory/albumx/x.cue 文件作为播放列表;或者对于 CUESHEET 标签,$ mpc load albumx/x.flac

客户端对 cue 文件的支持有点有限。有两个支持 CUE 文件的可用程序是 cantataAURncmpcpp

HTTP 流媒体

自 0.15 版本以来,MPD 内建了一个 HTTP 流媒体守护进程/服务器。这允许 MPD 将其音乐广播到 HTTP 客户端。

这不适用于流媒体解决方案 (例如 Spotify、Deezer 等的替代品)。首先,它只允许播放一个流,因此多个用户不能同时收听不同的音乐。其次,MPD 会大量缓冲音频,以便在客户端暂时断开连接时也能可靠播放,因此在更改歌曲时会引入不可忽略的延迟。要将 MPD 用作流媒体解决方案,请参阅 #使用卫星设置进行音乐流媒体传输

配置

要激活此服务器,只需在 mpd.conf 中将其设置为输出设备即可。

audio_output {
	type		"httpd"
	name		"My HTTP Stream"
	encoder		"opus"		# optional
	port		"8000"
#	quality		"5.0"			# do not define if bitrate is defined
	bitrate		"128000"			# do not define if quality is defined
	format		"48000:16:1"
	always_on       "yes"			# prevent MPD from disconnecting all listeners when playback is stopped.
	tags            "yes"			# httpd supports sending tags to listening streams.
}

格式

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 不需要远程浏览所有文件。

此外,您还需要一种方法让服务器向客户端提供音乐文件。MPD 支持多种 存储插件 来获取音乐。例如,如果您选择 curl 插件,您将需要在服务器上安装一个 WebDAV 服务器。

最后,您需要一个安全的通信隧道来连接服务器和每个客户端。这是因为用于控制 MPD 的协议未加密且不提供身份验证。 VPN 或 SSH 隧道在这里会很有用。

配置

在服务器上,编写将构建数据库的 MPD 实例的配置文件

/etc/mpd.conf
pid_file            "/run/mpd/mpd.pid"
playlist_directory  "/var/lib/mpd/playlists"
music_directory     "/path/to/your/music/"

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 setup
music_directory     "https://optional_user:optional_password@example.com/path/to/your/music/"

# NFS setup
music_directory     "nfs://example.com/path/to/your/music/"

# Samba setup
music_directory     "smb://example.com/path/to/your/music/"

# Note the proxy here
database {
    plugin  "proxy"
    host    "example.com"
    port    "6600"
}

audio_output {
    type  "alsa"
    name  "Some output name"
}
  • libsmbclient 有一个严重的错误会导致 MPD 崩溃,因此默认情况下禁用此插件,并且在错误修复之前不应使用 [1][死链接 2025-08-16—HTTP 426]
  • 在 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 包。它在用户会话中运行并监视 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 脚本,它通过 libnotifyMusic Player Daemon 提供通知支持。它还可以显示从 *last fm* 加载的专辑封面,或从用户本地音乐库加载。

可以在 AUR 中找到 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

# This is where musnify-mpd will look for when searching the local album covers.
musiclibrary = ~/Music
#

[apiKey]
# If you want to fetch the album covers from LastFm,
# enable this option and provide a apiKey.
# You can get your apiKey here: https://www.last.fm/api/account/create
#
# lastfm = YOUR_LASTFM_API_KEY

要启用来自 last.fm 的艺术作品,您需要编辑 ~/.config/musnify-mpd 并提供一个 apiKey。您可以在 此处 创建您的 apiKey。

mpd-notification

通知由 mpd 播放的曲目。它在后台运行,并在 mpd 产生事件时 (例如,播放新曲目、暂停或停止播放) 生成通知。它还支持本地或 .mp3 专辑封面。

可以在 AUR 中找到 mpd-notificationAUR 包。

安装后,只需运行 mpd-notification 即可运行一次。mpd-notification.service 用户单元 可以被 启用 以自动启动它。

添加独立的音量控制 (ALSA)

虽然 MPD 默认不允许您调整自己的音量 (mpc volume 会影响全局音量),但您可以使用 softvol ALSA 模块轻松创建一个 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"
}

之后,您应该可以通过 mpcamixer 调整歌曲音量。(您可能需要重新启动才能使控件正常工作。)

控制远程 mpd 服务器

要控制远程 mpd 服务器,如果您在同一台机器上运行 ssh 服务器,则可以登录并使用 ncmpcpp 来控制它。

或者,如果您的 mpd 服务器正在监听一个可访问的接口/端口 (例如,在 mpd 机器上运行 $ ss -p -l -t 显示 mpd 监听 0.0.0.0),那么您可以设置 MPD_HOST 变量,它将本地客户端 (如 mpc) 指向远程服务器。

$ export MPD_HOST=ip.of.server
$ export MPD_PORT=6600      # optional
$ mpc play