用 upmpdcli 和 mpd 把 Openwrt 配置成 WiFi 音箱

/ 0评 / 0

用 iPhone 来当作音源将音乐推送到连接了 USB 声卡的 Openwrt 路由器是十分方便的事,因为 AirPlay 推送起来实在是太方便了,但这种情况放在 Android 上就很难。

我知道类似于网易云音乐、QQ音乐这样的 App 是可以用 DLNA (QPlay)来放歌的,但是 Spotify 和 Pandora ,而这两者恰好是我的主力音乐 App。

我一直都想在工作的时候可以用 Android 手机把音乐经过 Openwrt 推送到自制的 LM3886 功放来驱动那一对落地音箱,虽然在 iPhone 上是早就能实现了,但是,要是连 Android 也可以的话,岂不是美上加美么?

于是最近我着手重新编译了几个版本的 Openwrt 固件,其中就有我的主力设备 360T7 USB版。

熬了好几天的夜啊!

在 Openwrt 中,充当 DLNA 推流客户端的软件有 Gmediarender 和 Upmpdcli,但是在 hanwckf/immortalwrt-mt798x 的源码里,要把 Gmediarender 给选中的话就会选中一大堆依赖(Lean的源码不会),同时最后还会编译出错。所以没办法,我只能选择了 Upmpdcli 和 MPD-Mini,好在这两个选中后编译出来的体积并不大,可是 Upmpdcli 的配置就没有 Gmediarender 那么容易了。

用 Gmediarender 充当 DLNA 推流客户端的话只需要一句命令就能解决的事,到了 Upmpdcli 这里就必须要写配置文件。

下面的命令写在/etc/rc.local的 exit 0 前面就可以正常使用了。

/usr/bin/gmediarender -I br-lan -p 50001 -f K2P -u a07e8dfe-26a4-11e2-9dd1-5404a632c90e -d --logfile /tmp/gmedia.log & >> /dev/null

在恩山论坛里,好几个人也曾经想折腾一下 Upmpdcli,但是好像大家都没有成功的样子,所以想站在别人的肩膀上偷偷懒是行不通的了,只能靠自己了。

在集成了(或安装) MPD-Mini(经过测试,MPD-Mini 只有最基本的功能,不支持 Pipe 音频流,如果想搭配别的软件实现更多玩法,必须要装 MPD-Full) 和 Upmpdcli 的固件里,分别在下面三个地方有它们的配置文件,需要依次进行修改:

config upmpdcli lan
        option interface 'br-lan'
        option friendly_name 'DLNA'
        option mpd_host '127.0.0.1'
        option mpd_port '6600'
        option upmpd_port '0'
        option config '/etc/upmpdcli.conf'

# Add additional interfaces #
config upmpdcli wifi
        option interface 'wlan0'

config upmpdcli wan
        option interface 'eth0'
pidfile = /tmp/upmpdcli.pid
upnpav = 1
openhome = 0
lumincompat = 0
saveohcredentials = 1
checkcontentformat = 1
enablel16 = 1

mpdhost = localhost
mpdport = 6600
avtautoplay = 1

先新建一个目录用来存放 mpd 运行时产生的文件:

mkdir /etc/mpd
bind_to_address "0.0.0.0"
port "6600"
#music_directory "/etc/mpd/music"
playlist_directory "/tmp/mpd/playlists"
db_file "/etc/mpd/database"
log_file "syslog"
pid_file "/etc/mpd/mpd.pid"
state_file "/etc/mpd/state"
sticker_file "/etc/mpd/sticker.sql"
audio_output {
    type        "alsa"
    name        "USB Audio"
    device      "hw:0,0"
    mixer_type  "hardware"
}

/etc/config/upmpdcli 的优先级高于 /etc/upmpdcli.conf,因此对于发现服务的名称可以在 /etc/config/upmpdcli 中设置就可以了。其中 enablel16 = 1 是很重要的一句参数,因为我首次运行时没有加这句,导致在使用 AirAudio 连接 DLNA 服务时弹出 unsupported:: audio/l16 的错误。

修改好之后,建议重启路由器,因为使用 restart 命令的时候可能会提示端口已经在使用中的错误。

重启后,使用 netstat 命令查看服务运行的端口是否正常:

# netstat -antlpu | grep mpd
tcp        0      0 127.0.0.1:6600          0.0.0.0:*               LISTEN      4393/mpd
tcp        0      0 0.0.0.0:49149           0.0.0.0:*               LISTEN      4799/upmpdcli
tcp        0      0 0.0.0.0:49152           0.0.0.0:*               LISTEN      4799/upmpdcli
tcp        0      0 127.0.0.1:6600          127.0.0.1:34118         ESTABLISHED 4393/mpd
tcp        0      0 127.0.0.1:40450         127.0.0.1:6600          ESTABLISHED 4799/upmpdcli
tcp        0      0 127.0.0.1:34118         127.0.0.1:6600          ESTABLISHED 4799/upmpdcli
tcp        0      0 192.168.9.1:40162       192.168.9.221:42711     ESTABLISHED 4393/mpd
tcp        0      0 127.0.0.1:6600          127.0.0.1:40450         ESTABLISHED 4393/mpd
udp        0      0 0.0.0.0:1900            0.0.0.0:*                           4799/upmpdcli
udp        0      0 127.0.0.1:48302         0.0.0.0:*                           4799/upmpdcli

可以看到,目前我的都正常了,并且 192.168.9.221 这台设备(Android 手机)也正在推流放着 Pandora 里的音乐。

# cat /tmp/mpd/state 
sw_volume: 100
audio_device_state:1:USB Audio
state: play
current: 0
time: 10.709000
random: 0
repeat: 0
single: 0
consume: 0
crossfade: 0
mixrampdb: 0.000000
mixrampdelay: -1.000000
playlist_begin
song_begin: http://192.168.9.221:42711/AirMusic.LPCM
Artist: AirMusic Trial Xiaomi M2007J3SC (Performer)
Album: AirMusic Trial Xiaomi M2007J3SC
Title: 现场音频
song_end
playlist_end

OK,就是这样。

AirAudio 的 Trial 版每 10 分钟就会开始哔哔叫,在获取了 ROOT 权限的设备里,将 AirMusic Recording Service 赋予麦克风使用权限后,可以走内部通道推流,音质更佳。

我在想,是否需要花 $5.99 购买 AirAudio 呢?

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注