MPD/提示与技巧 - Arch Linux 中文维基

跳转到内容

# MPD/提示与技巧

来自 Arch Linux 中文维基
< MPD
翻译状态：

- 本文（或部分内容）译自 Music Player Daemon/Tips and tricks，最近一次同步于 2026-07-29，若英文版本有所更改，则您可以帮助同步与翻译更改的内容。
- 您可以在 ArchWiki 的对应页面找到本文翻译的原始修订历史。
- 本文可能与英文原文存在出入。

## 组织和管理音乐库

MPD 不负责管理用户的音乐库。想要管理功能，请查看 beets包 或 picard包。

## 同步播放记录至 Last.fm/Libre.fm

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

下面有一些方法用于将 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 作为一个用户单元启动。

提示：若在系统启动后遇 `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.service` 让 mpdscribble 自动启动。详情请参考 systemd/用户。

同样可以让 mpdscribble 与 mpd 一同自动启动，请在启动 mpd 的文件中增加一条启动条目（例如 `~/.xinitrc`）：

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

注意：若遇到 `[last.fm] handshake failed, username or password incorrect (BADAUTH)` 错误，请确保用户名和密码都是正确的，且密码不应是 32 字符长度[失效链接 2025-08-16 ⓘ]。

### 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 文件的程序，分别是：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 崩溃的严重缺陷[失效链接 2025-08-16 ⓘ]，因此该插件默认是禁用状态，在该缺陷被修复之前请不要尝试使用。
- 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

分类：​

- 音乐
- 包含失效链接的页面

MPD/提示与技巧
添加话题