MPD/提示与技巧

来自 Arch Linux 中文维基

组织和管理音乐库[编辑 | 编辑源代码]

MPD 不负责管理用户的音乐库。想要管理功能,请查看 beetspicard

同步播放记录至 Last.fm/Libre.fm[编辑 | 编辑源代码]

注意: 0.18 版本的 MPD 移除了 Last.fm 相关支持。不过,一些客户端提供了独立于 MPD 的记录功能。

下面有一些方法用于将 MPD 的歌曲播放记录同步至 Last.fmLibre.fm

mpdas[编辑 | 编辑源代码]

mpdas 是一款支持 MPD 的音频记录器客户端,使用 curllibmpd 并由 C++ 编写而成。mpdas 支持最新的音频记录器协议(2.0),同时能在无网络连接的情况下,将未同步的播放记录缓存至 ~/.mpdascache

可以安装 mpdasAUR 软件包。

Mpdas 配置简单,请参考官方的说明/etc/mpdasrc 本身就是一份非常基础的配置示例。

要让 mpdasmpd 一同启动,请在启动 mpd 的文件中增加 mpdas 的启动条目(例如 xinitrc):

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

mpd以 systemd 用户服务启动,最好也将 mpdas 作为一个用户单元启动

提示:若在系统启动后遇 mpdas.service 启动失败,请考虑使用 mpd.socket,即套接字启动

mpdscribble[编辑 | 编辑源代码]

mpdscribble 是一个守护进程,它因为作为一个半官方的 MPD 记录器,并且使用了 MPD 中新的“idle”功能,记录更精确,可以说是同步播放记录的最佳方案。由于不需要更改任何 /etc 目录下的文件,因此无需 root 权限即可进行配置。详情请访问官方网站

Mpdscribble 自带一份配置示例:/usr/share/mpdscribble/mpdscribble.conf.example,将其复制到 ~/.mpdscribble/mpdscribble.conf 然后按需编辑。

注意: Mpdscribble 解释器不支持行尾注释,请将注释写在单独的行中。

用户密码也可以使用 md5hash 形式:

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

可以在 systemd 用户实例下使用 mpdscribble.servicempdscribble 自动启动。详情请参考 systemd/用户

同样可以让 mpdscribblempd 一同自动启动,请在启动 mpd 的文件中增加一条启动条目(例如 ~/.xinitrc):

[[ -z $(pgrep -xU $UID mpdscribble) ]] && mpdscribble &
注意: 若遇到 [last.fm] handshake failed, username or password incorrect (BADAUTH) 错误,请确保用户名和密码都是正确的,且密码不应是 32 字符长度

Sonata[编辑 | 编辑源代码]

Sonata 内置了歌曲记录功能,尽管该功能需要程序全程处于运行状态。此外,如果播放时未能成功将记录转发至 Last.fm,Sonata 也不会缓存这些记录,这意味着这些记录不会被计入统计数据。

YAMS[编辑 | 编辑源代码]

YAMS 是一个 MPD 的 Last.FM 歌曲记录守护进程,用 Python 编写而成。

由于 YAMS 是针对 2.0 版本的 Last.FM 记录接口编写的,YAMS 不会将用户名和密码信息存储至本地,而是使用一个 cookie。与其他的记录器类似,YAMS 可以保存失败的记录上传并之后将其重新上传。YAMS 也提供了很多的配置选项,这些选项可以定义何时或如何创建歌曲记录(包括忽略掉一首曲子的重复播放记录)。

可以安装 python-yamsAUR 软件包。

必须在交互式终端内运行 yams 命令(至少需要运行一次)并跟随指示操作,才能完成身份认证。

身份验证完成后,可通过二进制文件启动 YAMS:

yams 默认以守护进程运行(yams -N 将以前台进程运行 YAMS)。

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 bit 位深度输出至多个程序[编辑 | 编辑源代码]

为什么要选择这样的格式?
因为这是 CD 音频的标准格式,ALSA 本身也允许多个程序仅通过 dmix(dmix 默认的使用低质量的重采样算法)播放声音,而 dmix 默认会将所有音频重采样至 48 KHz(或是正在播放的音频的格式的采样率)以下。而且,若不这么配置,至少对于 mpd.conf 而言,如果不进行更改,一些用户可能会遇到播放时的咔哒声(clicking sounds)。
这么做有什么缺点?
这些设置将导致“所有”音频(若有必要)被重采样至此格式(44.1 KHz 16 bit),例如实际上是 48 KHz 采样率的 DVD 或电视素材。但是目前没有方法让 ALSA 动态改变格式,不过对于经常听、且次数远多于其他音频的 CD 用户而言,偶尔将 48 KHz 降采样至 44.1 KHz 也不算是太大的采样率损失。

下面的示例假定没有其他已知设置与之冲突或会覆盖它。这尤其适用于当前用户潜在的 ~/.asoundrc 设置。MPD 通常会忽略该设置,因此,下面的示例应当转入 /etc/asound.conf

/etc/asound.conf
defaults.pcm.dmix.rate 44100 # 强制使用 44.1 KHz
defaults.pcm.dmix.format S16_LE # 强制使用 16 bits
/etc/mpd.conf
audio_output {
        type                    "alsa" # 使用 ALSA 输出插件。
	name			"your_custom_name" # 必须存在,但不必与实际的声卡名一致,例如 /etc/asound.conf 中的此项。
        options                 "dev=dmixer"
        device                  "plug:dmix" # 这两行让 MPD 输出至 dmix。
	format	        	"44100:16:2" # 实际格式。
	auto_resample		"no" # 用于绕过 ALSA 自身的算法(通常会更低)。请查看下面的内容以了解如何选择。
}
注意: MPD 会对 mp3 格式进行特殊处理:永远使其输出为 24 bit。由 format 行所指定的强制转换会在此特殊处理之后进行。

若希望让 ALSA resp. 决定 MPD 使用的位深度,注释掉 resp. 并省略 dimx.format 这一行,同时将 mpd 的 format 更改为 "44100:*:2"。

注意: 在以两种不同位深度解码的文件(例如,一个 mp3 和一个 16 位 flac)之间进行“交叉淡入淡出”(Crossfading)时,除非转换处于激活状态,否则不起作用。

用 LIRC 控制 MPD[编辑 | 编辑源代码]

已有一些客户端被设计用于在 lircd 与 MPD 之间进行通信,然而在实际使用过程中,这些客户端由于功能限制,并不实用。

建议将 mpc 与 irexec 一同使用。mpc 是一个命令行播放器,它仅仅能够将命令发送至 MPD,随后立即退出(这一点与 irexec 配合极佳),命令执行器已经包含在 lirc 中了。irexec 会在接收到一个远程控制按钮的消息时执行特定的命令。

首先,请根据 LIRC英语LIRC 文章设置好远程控制。

编辑 lirc 启动配置文件,默认位置位于 ~/.lircrc

将下面的内容写入文件:

begin
     prog = irexec
     button = <按钮名称>
     config = <要执行的命令>
     repeat = <0 或 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(1) 查看更多的 mpc 功能及其详细信息。

PulseAudio[编辑 | 编辑源代码]

本地(单用户)[编辑 | 编辑源代码]

无需任何特殊选项,只需要按照 MPD 配置文件中的注释说明,添加一个 PulseAudio 输出即可。

本地(多用户)[编辑 | 编辑源代码]

以单用户运行 MPD 时,声音是无法发送到其他用户的 PulseAudio 服务上的。解决方法:要么让 PulseAudio 作为全系统范围的守护进程运行(然而这是上游极其不推荐的做法),要么配置 MPD,让 MPD 使用 PulseAudio 的 TCP 模块,从而将声音发送到本地:

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

可以用 ; 作为 CIDR 表示法的分隔符表示其他范围的 IP 地址。配置完成后,重启 PulseAudio

接下来编辑 /etc/mpd.conf,添加一个新的 pulse 类型的输出,指向 127.0.0.1 “远程”服务器:

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

添加完毕后,请重启 MPD。

现在,本地的 MPD 应该已经能够使用,所有使用 PulseAudio 的用户都能通过 127.0.0.1 接收到声音。

远程[编辑 | 编辑源代码]

MPD 可以通过网络将声音发送到任何使用了 PulseAudio 的程序。完整的 PulseAudio 系统并不需要在一个运行着 MPD 的服务端上,只需要使用 libpulse 作为发送源,该软件包已经是 MPD 的依赖项。

要让 MPD 把音频发送到另一台计算机上,请参照上述指引,在运行了 MPD 的服务端上,编辑 /etc/mpd.conf,将 IP 地址设置成目标计算机的,同时在目标计算机上,编辑 /etc/pulse/default.pa$XDG_CONFIG_HOME/default.pa(或 ~/.config/pulse/default.pa),在配置中设置好服务端的 IP 地址。

完成配置后,在服务端播放音频时,目标计算机上会显示服务端的源,并且可以像普通的播放源那样控制。MPD 停止后,目标计算机上将没有可用的源。

Cue 文件[编辑 | 编辑源代码]

由于 0.17 版本的 MPD 已经集成了能够处理外部或嵌入式 cue 脚本的解释器,无需额外操作即可支持 cue 文件。 例如,$ mpc load albumx/x.cue 命令将 music_directory/albumx/x.cue 文件加载为播放列表,若文件是例如 $ mpc load albumx/x.flac,则加载为 CUESHEET 标签。

支持 cue 文件的客户端较为有限。有两个支持 cue 文件的程序,分别是:cantataAURncmpcpp英语ncmpcpp

HTTP 串流[编辑 | 编辑源代码]

自 0.15 版本起,MPD 内置了 HTTP 串流守护程序(服务端)。这让 MPD 可以将音乐广播至 HTTP 客户端。

但这并不意味着把这个功能直接作为一个串流方案使用(例如替代 Spotify、Deezer 等)。首先,它只允许播放一个音频流,多个用户无法同时收听多个音频流。其次,MPD 会对音频做大量缓冲,因此,即使客户端离线了一段时间也依然能够播放,但也是因为这个原因,切换歌曲时会有非常明显的延迟。若要将 MPD 作为串流方案使用,请参考 #以卫星模式串流音乐

配置[编辑 | 编辑源代码]

在 mpd.conf 中将其设置为一个输出设备即可激活 HTTP 串流服务:

audio_output {
	type		"httpd"
	name		"My HTTP Stream"
	encoder		"opus"		# 可选
	port		"8000"
#	quality		"5.0"			# 若 bitrate 已设置,请勿设置此项
	bitrate		"128000"			# 若 quality 以设置,请勿设置此项
	format		"48000:16:1"
	always_on       "yes"			# 阻止 MPD 停止播放时中断与所有监听器的连接。
	tags            "yes"			# httpd 支持发送标签至播放流。
}

格式[编辑 | 编辑源代码]

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 支持多种存储插件用于获取文件。例如,如果选择了 curl 插件,服务端需要一个 WebDAV 服务。

最后,服务端和客户端之间需要一个安全的通信隧道。这是因为控制 MPD 的协议不会加密传输信息,也不提供身份验证功能。此时 VPN英语VPN 或 SSH 隧道将是一个不错的选择。

配置[编辑 | 编辑源代码]

在服务端的配置文件中添加 MPD 构建数据库的相关配置:

/etc/mpd.conf
pid_file            "/run/mpd/mpd.pid"
playlist_directory  "/var/lib/mpd/playlists"
music_directory     "音乐文件的路径"

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

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

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

# 注意这里的代理设置
database {
    plugin  "proxy"
    host    "example.com"
    port    "6600"
}

audio_output {
    type  "alsa"
    name  "Some output name"
}
注意:
  • libsmbclient 有一个会导致 MPD 崩溃的严重缺陷,因此该插件默认是禁用状态,在该缺陷被修复之前请不要尝试使用。
  • 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 软件包。mpDris2 运行在当前用户会话内,监控 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 或用户本地音乐库加载到的专辑封面。

可以安装 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

# musnify-mpd 将从如下的位置搜索本地专辑封面。
musiclibrary = ~/Music
#

[apiKey]
# 若希望从 LastFm 获取专辑封面,
# 请启用下面的选项并提供一个 apiKey。
# 可以从此处获取 apiKey:https://www.last.fm/api/account/create
#
# lastfm = YOUR_LASTFM_API_KEY

mpd-notification[编辑 | 编辑源代码]

mpd-notification 用于提示 mpd 所播放的歌曲信息。它运行于后台,并在 MPD 产生事件时(例如:开始、暂停或停止播放一首歌曲)发送通知。对于本地或 .mp3 专辑作品集同样支持。

可以安装 mpd-notificationAUR 软件包。

安装完成后,只需要运行一次 mpd-notification。也可以选择启用 mpd-notification.service 用户单元使其自动启动。

添加一个独立的 ALSA 音量控制[编辑 | 编辑源代码]

虽然 MPD 默认不允许用户调整它自己的音量(mpc volume 会影响全局音量),用户仍然可以通过 ALSA 的“softvol”模块制作一个控制 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 服务,可以通过 ssh 登录并使用 ncmpcpp英语ncmpcpp 控制 MPD。

而如果 MPD 服务端监听了一个可用的接口或端口(例如,在运行 MPD 的设备上使用 $ ss -p -l -t 能观察到 MPD 正在监听 0.0.0.0),此时设置 MPD_HOST 环境变量可以让本地客户端如 mpc 等指向运行着 MPD 服务的远程服务器。

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