用 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 的固件里,分别在下面三个地方有它们的配置文件,需要依次进行修改:
- /etc/config/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'
- /etc/upmpdcli.conf
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
- /etc/mpd.conf
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 呢?