MPD/提示与技巧
组织和管理音乐库[编辑 | 编辑源代码]
MPD 不负责管理用户的音乐库。想要管理功能,请查看 beets包 或 picard包。
同步播放记录至 Last.fm/Libre.fm[编辑 | 编辑源代码]
下面有一些方法用于将 MPD 的歌曲播放记录同步至 Last.fm 或 Libre.fm。
mpdas[编辑 | 编辑源代码]
mpdas 是一款支持 MPD 的音频记录器客户端,使用 curl包 和 libmpd包 并由 C++ 编写而成。mpdas 支持最新的音频记录器协议(2.0),同时能在无网络连接的情况下,将未同步的播放记录缓存至 ~/.mpdascache
。
可以安装 mpdasAUR 软件包。
Mpdas 配置简单,请参考官方的说明。/etc/mpdasrc
本身就是一份非常基础的配置示例。
要让 mpdas 随 mpd 一同启动,请在启动 mpd 的文件中增加 mpdas 的启动条目(例如 xinitrc):
[[ -z $(pgrep -xU $UID mpdas) ]] && mpdas &
若 mpd 是以 systemd 用户服务启动,最好也将 mpdas 作为一个用户单元启动。
mpdscribble[编辑 | 编辑源代码]
mpdscribble包 是一个守护进程,它因为作为一个半官方的 MPD 记录器,并且使用了 MPD 中新的“idle”功能,记录更精确,可以说是同步播放记录的最佳方案。由于不需要更改任何 /etc
目录下的文件,因此无需 root 权限即可进行配置。详情请访问官方网站。
Mpdscribble 自带一份配置示例:/usr/share/mpdscribble/mpdscribble.conf.example
,将其复制到 ~/.mpdscribble/mpdscribble.conf
然后按需编辑。
用户密码也可以使用 md5hash 形式:
echo -n "password" | md5sum | cut -f 1 -d " "
可以在 systemd 用户实例下使用 mpdscribble.service
让 mpdscribble 自动启动。详情请参考 systemd/用户。
同样可以让 mpdscribble 与 mpd 一同自动启动,请在启动 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 自身的算法(通常会更低)。请查看下面的内容以了解如何选择。 }
若希望让 ALSA resp. 决定 MPD 使用的位深度,注释掉 resp. 并省略 dimx.format 这一行,同时将 mpd 的 format 更改为 "44100:*:2"。
用 LIRC 控制 MPD[编辑 | 编辑源代码]
已有一些客户端被设计用于在 lircd 与 MPD 之间进行通信,然而在实际使用过程中,这些客户端由于功能限制,并不实用。
建议将 mpc 与 irexec 一同使用。mpc 是一个命令行播放器,它仅仅能够将命令发送至 MPD,随后立即退出(这一点与 irexec 配合极佳),命令执行器已经包含在 lirc 中了。irexec 会在接收到一个远程控制按钮的消息时执行特定的命令。
首先,请根据 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 文件的程序,分别是:cantataAUR 和 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 或 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 脚本,使用 libnotify包 为 Music 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" }
配置完成后就应该可以通过 mpc
和 amixer
控制歌曲音量(也可能需要重启才能控制音量)。
控制远程 MPD 服务端[编辑 | 编辑源代码]
如果 MPD 服务端设备上有 ssh 服务,可以通过 ssh 登录并使用 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