Ubuntu16.04(虚拟机)上MPD(MusicPlayerDaemon)+MPC运行环境搭建
Contents
MPD播放器为C/S架构,MPD为Server,它的Client 有很多,MPC为其典型稳定的Client。
在往嵌入式板子(配置里的 MT7688 就是 OpenWrt 常见的路由主控)上做音乐播放器之前,先在 Ubuntu 虚拟机里把 MPD/MPC 的编译、配置、播放整条链路跑通——PC 上验证方案的成本,远低于直接在板子上摸索。
需求
- Ubuntu 16.04 虚拟机上从源码编译安装 MPD 与 MPC
- 能播放本地音乐文件,也能播放 URL 音频流
技术实现原理
C/S 架构:为什么播放器要拆成服务端和客户端
MPD 是后台守护进程,管解码、播放、歌库、播放列表;客户端只发命令(走 TCP 6600 端口的文本协议),像遥控器。拆开的好处直接体现在行为上:播放状态保存在 daemon 里,客户端退出音乐不停;多个客户端(mpc 命令行、ympd 网页界面)可以同时连上来操作同一个播放现场。
两套编译命令并存的原因
MPD 0.20 这一代用 autotools(./configure && make);libmpdclient 和 mpc 已经改用 meson + ninja——meson 是 Python 写的构建系统生成器,ninja 是它生成的、面向速度的构建执行器。所以文中两种风格的编译命令都是对的,不是笔误。
FFmpeg 是解码核心
MPD 自己不做格式解码:MP3/OGG/FLAC 这些格式的支持来自 FFmpeg 的库,--enable-ffmpeg 打开。不装 FFmpeg 就编译,出来的 MPD 认不了几种格式。
mpd.conf 关键配置项
music_directory:歌库目录;db_file:歌库索引数据库。MPD 启动时扫描歌库建库,客户端的搜索、列表全靠它——新增歌曲后要mpc update重建,不然客户端看不到新文件;bind_to_address/port:客户端的接入点,6600 是 MPD 的标准端口;audio_output:声音往哪里出。type “alsa” 走 Linux 标准 ALSA 音频层,name 按板子声卡填(本例 MT7688)。
MPD 简介
MPD官网: https://www.musicpd.org/
OPENWRT安装教程: https://tnetter.wordpress.com/2015/03/14/install-mpd-di-openwrt/
用户手册:https://www.musicpd.org/doc/user/ 用户手册:https://mpd.readthedocs.io/en/stable/user.html
开源代码
基于web的MPD GUI:https://ympd.org/
1.源码下载
在github 上有其源码
下载地址:https://github.com/MusicPlayerDaemon/
包括
- MPD
- libmpdclient
- mpc
2. 编译
编译环境要求
- C++17 编译器 (例如: GCC 8 or clang 7)
- Meson 0.56.0 and Ninja
- Boost 1.58
- pkg-config
2.1安装所需要的依赖包
1)boost
boost 是C++ 库,mpd 和mpc都是C++,在实现过程会用的boost库,所有需要在ubuntu上先安装boost 。
boost下载地址:http://www.boost.org/users/history/version_1_66_0.html
|
|
编译完后会有如下log输出:
|
|
2)meson、Ninja
编译libmpdclient 需要meson、Ninja
meson下载、编译、 安装:
源码下载:https://github.com/mesonbuild/meson
|
|
安装Ninja:
|
|
3)FFmpeg 安装
mpd 是基于FFmpeg 实现的,所有必须在编译mpd 前安装FFmpeg库: 下载地址:https://github.com/FFmpeg/FFmpeg
|
|
2.2 编译mpd
|
|
说明:
--with-boost=指定boost库所在的路径如:/home/mpddev/code/mpd/boost_1_66_0
|
|
编译成功后,会在src/路径下生产mpd 可执行程序。
2.3 编译libmpdclient
进入libmpdclient 目录,创建编译输出文件夹(mkdir output)
|
|
可参照:https://github.com/MusicPlayerDaemon/libmpdclient
2.4 编译mpc
方法同libmpdclient:
进入mpc目录,创建编译输出文件夹(mkdir output)
|
|
可参照:https://github.com/MusicPlayerDaemon/mpc
3. 运行mpd 和mpc
准备好mpd.conf配置文件
/etc/mpd.conf
内容:
|
|
直接运行,在一个终端执行:
|
|
作为启动mpd服务
|
|
打开另一个终端执行mpc
如查询mpd的版本信息:
mpc version
mpc 更多命令和使用方法,可执行:mpc help 查看。
4.播放测试
4.1 播放本地音乐
把音乐拷贝到mpd.conf中music_directory所配置的目录下,如我的配置是:
|
|
复制一个mp3文件到/Media/SD-P1/music目录下,并改名为test.mp3等。
启动mpd后,通过mpc进行添加播放列表和播放音频文件:
|
|
4.2 播放url 资源
gstreamer 上有大量各种格式的音频文件可用于测试:
https://gstreamer.freedesktop.org/media/
测试方法同样是先确保mpd 已经起来,然后使用
|
|
例如:
|
|
5. 运行时遇到的问题
问题1:
mpc: error while loading shared libraries: libmpdclient.so.2: cannot open shared object file: No such file or directory
根因:源码 make install 把库装进了 /usr/local/lib,而动态链接器默认没把这个目录纳入搜索范围,运行时找不到 libmpdclient.so.2。
解决:
|
|
问题2:
mpc 播放MP3时提示“mpd: Failed to read mixer for ‘My ALSA Device’: no such mixer control: PCM”,如下log:
|
|
解决: 修改mpd.conf
|
|
修改为:
|
|
这组修改起效的原理:device 改成 plughw:0,0(带 plug 前缀,允许格式转换)的同时把 mixer_type 设为 software——音量控制从“找硬件上的 PCM 混音控件”改为在软件层做,不再依赖声卡有没有那个控件,报错自然消失。
踩坑记录与注意事项
- 找不到共享库(问题1)的通用解法:软链到 /usr/lib 能用,但更常规的做法是把 /usr/local/lib 写进 /etc/ld.so.conf 再执行
ldconfig刷新缓存——软链一个库要手工维护版本号,路径配置一次管所有库; - 硬件混音报错(问题2)的本质:hw/plughw 直接访问声卡时绕过了 ALSA 的软混音层(dmix),没有硬件混音控件的声卡就会报 no such mixer control;要么 software mixer(本文做法),要么 device 用 “default” 走混音层;
- 新增歌曲客户端看不到:db_file 索引不会自动更新,
mpc update一下; - mpc add 只是进列表:要
mpc play <编号>才真正播,编号是播放列表里的位置; - 虚拟机里无声先查输出设备:虚拟机声卡是模拟设备,hw:0,0 的编号和物理机不同,配置照抄物理机的多半无声,device 先用 “default” 试;
- 调试用前台模式:
mpd --stdout --no-daemon --verbose把日志直接打到终端,比后台服务里翻日志文件快; - –with-boost 路径要对:编译 MPD 时这个参数指错,configure 阶段就找不到 Boost,报错信息会提示检测失败。
Author 软件开发大郭
LastMod 2022-08-15