漫游媒体
便携音乐不一定非要限制在耳机里。这是一个逐步指南,教你如何设置一个音乐系统,像小狗一样跟随你 дома。
和你们中的许多人一样,我将所有音乐以数字形式存储在我家中的中央服务器上。问题是当我从一个房间走到另一个房间时,音乐不会跟着我。我可以随身携带一个 iThingy 或者放在手机上,但我宁愿不戴耳机,而且无论手机扬声器在同类产品中多么出色,它们仍然是小小的手机扬声器。幸运的是,我有很多以前升级换代剩下的电脑硬件,所以对我来说,为家里的每个区域配备一些小型、旧的系统相当容易。现在,我不使用小型设备听音乐,而是使用设备标记我的位置,让音乐跟随我到任何地方。
该系统易于构建,并且主要使用现成的开源程序。除了播放器和控制系统之外,您还需要一种标记您在家中位置的方法。我使用手机上的蓝牙无线电,但您也可以使用 RFID 标签、带有运动检测或面部识别的网络摄像头,或者几乎任何可以让系统知道您在哪里的东西。不过,对于此设置,我假设您正在使用蓝牙设备。
这个项目的核心部分是基于服务器的音乐播放器。我正在使用 Music Player Dæmon (MPD),这是一个很棒的基于服务器的系统,根据 GNU 通用公共许可证发布,并且可以从大多数 Linux 发行版的存储库中获得。使用您喜欢的软件包管理系统安装该软件。除了这个播放器之外,您还需要设置一个流媒体系统。Icecast 满足此要求,并且也很容易获得。也安装它。
配置 MPD 相当简单。您的发行版的默认文件可能与下面的示例非常相似,但您可能需要更改一些内容。music_directory
条目应指向包含音乐文件的目录,并且一个 bind_to_address
应包含服务器的非环回名称或地址。如果它仅绑定到 127.0.0.1,则外部设备可能难以连接到它。
audio_output
部分定义了音乐播放时的输出位置。在本例中,您需要将其转码为 Ogg 格式并将其发送到同一主机上的 Icecast 服务器(尽管如果您的设置有意义,您可以在不同的系统上运行它们)。在本节中,端口和密码必须与 Icecast 服务器的配置匹配,并且挂载点将定义服务器名称之后的 URI 部分。为了简单起见,我将其保留为 /。如果您在设置此配置文件后启动 MPD,它将缺少要播放到的 Icecast 套接字,因此您需要接下来设置它。我在下面的配置中添加了一些注释,以帮助记录那里的选项
music_directory "/data/arown/files/audio" #Point this at
the top level of your music directory. If you have more than
one, a directory of symbolic links may help you.
playlist_directory "/var/lib/mpd/playlists" #The following
files must be writable. I suggest making the directory owned
by the user running MPD.
db_file "/var/lib/mpd/database"
log_file "/var/lib/mpd/log"
state_file "/var/lib/mpd/state"
user "mpd" #This is the user that the MPD
program runs under. I highly suggest making this a nonroot user.
bind_to_address "templar" #Place your machine name here, not
"localhost" or "127.0.0.1" if you want to reach the MPD
server from another machine.
bind_to_address "/var/lib/mpd/socket"
port "6600" #This is the client control port for
starting and stopping the MPD player as well as building
playlists and changing server side volume.
log_level "verbose"
input {
plugin "curl"
}
audio_output {
type "shout"
encoding "ogg" #This is the media type for the stream,
if your player wants MP3, use encoding "mp3" and be sure you
have the proper tools to transcode to MP3 on your box.
name "MusicPuppy"
host "localhost" #The name of the box
that the Icecast server is hosted on.
port "8000" #The port of the
Icecast server.
mount "/" #This is the part
of the URI after the hostname. I have left it to "/" for
simplicity, but often things like "/music.ogg" are used
to make it clearer to the user.
password "passthis" #The source password to the
Icecast server. You probably should change this to something
complex because you'll never have to type it in.
bitrate "128" #The bitrate to transcode to. You
may want to raise or lower this based on your CPU, bandwidth
or your quality preference.
format "44100:24:2" #This is three variables:
44,100 represents the sample frequency, 24 is the bitwidth,
and 2 is the number of audio channels. Experimenting here
may give you better or worse quality, depending on your audio
hardware and number of speakers.
}
filesystem_charset "UTF-8"
为了完成服务器部分,您需要配置 Icecast 以流式传输从 MPD 接收的音乐。Icecast 示例配置文件很长,但我剪掉了我更改的区域。
确保此处的 source-password 与 MPD 服务器的密码匹配。这允许 MPD 服务器授权将音乐流式传输到 Icecast
<authentication>
<!-- Sources log in with username 'source' -->
<!-- This password must match the MPD password above -->
<source-password>passthis</source-password>
<!-- Relays log in username 'relay' -->
<relay-password>passthis</relay-password>
<!-- Admin logs in with the username given below -->
<admin-user>admin</admin-user>
<admin-password>passthis</admin-password>
</authentication>
确保绑定地址和端口正确。如果 MPD 服务器在同一台计算机上,则绑定地址可以是 localhost。端口必须与上面 MPD 配置中的端口匹配
<listen-socket>
<port>8000</port>
<bind-address>127.0.0.1</bind-address>
</listen-socket>
当您在此配置文件中时,将默认密码从 “hackme” 和 “hackmemore” 更改为更安全的密码,并检查日志的位置以进行调试。我的日志在 /var/log/icecast 中,但您的日志可能有所不同。
启动 Icecast 后,服务器配置应该完成。此时,也启动 MPD。它应该将自身连接到 Icecast 端口,并且日志应该没有错误。接下来,需要一个 MPD 客户端才能在服务器上设置播放列表。我为此使用 MPDroid,这是一个 Android 变体,我用它从手机控制播放列表,但是可以通过您的软件包管理器或从 http://mpd.wikia.com/wiki/Clients 获得适用于各种平台的客户端。启动客户端,并向播放列表添加几首歌曲进行测试,然后告诉它播放。Icecast 访问日志(不是 MPD 日志)应显示已连接 SOURCE
,并且应显示 200
返回。例如
127.0.0.1 - - [20/Jul/2011:01:15:03 -0700] "SOURCE /
↪HTTP/1.0" 200 19 "-" "MPD" 424
这显示了来自本地计算机上的 MPD 的传入连接、当前日期和时间以及这是一个 SOURCE 请求而不是播放器请求的事实。它显示了访问的目录 “/”、使用的协议和返回代码 “200”。这是一个很好的验证来源,可以验证 MPD 和 Icecast 之间的连接已建立并正常工作,但这并不能告诉您实际上是否正在传递任何数据。为此,您需要进行端到端测试。
要测试它,您需要一个支持 Ogg 格式(或者如果您选择了 MP3,则支持 MP3 格式)的音乐播放器。我为此示例选择了 Rhythmbox,因为它支持 Ogg,在各种发行版中都很流行,并且具有命令行控制系统,您可以使用该系统启动和停止音乐以及设置服务器 URI。安装并启动 Rhythmbox(或启动您最喜欢的具有这些功能的播放器)并将其设置为从 Icecast URI 播放。例如,我的 URI 是 http://templar:8000/。如果您已将 MPD 配置文件中的 mount
指令更改为 "/music.ogg"
,则 URI 将为 http://templar:8000/music.ogg。无论哪种方式,当音乐播放器指向此 URI 时,Icecast access.log 文件应显示如下内容
mj-12 - - [01/Aug/2011:15:28:52 -0700] "GET /
↪HTTP/1.1" 200 1194382 "-" "-" 70
此行的格式与上面的格式非常相似。唯一的真正区别是这是一个 GET 请求而不是 SOURCE 请求。在访问日志中看到此行,而在错误日志中没有相应的错误,这表明媒体播放器正在正确地从 Icecast 服务器请求音乐流。
如果此时您没有听到音乐,请回顾设置并检查日志文件。检查 MPD 中的音量级别,并确保 MPD 客户端显示正在播放歌曲。许多 MPD 客户端还允许您直接流式传输音乐,因此您也可以验证它是否正常工作。
下一步是设置您的蓝牙令牌。在我的例子中,这是我的 Android 手机,但几乎任何蓝牙设备都可以工作。范围各不相同,因此蓝牙接收器的放置对于避免您尝试覆盖的区域中的重叠或间隙非常重要。
用于蓝牙支持的 Linux 软件包称为 Bluez。它广泛可用,并且是大多数发行版的一部分。如果您的系统上尚未安装此软件包,请安装它。您不需要进行任何配置更改,因为您只需要识别蓝牙设备是否在范围内。您不需要与其配对或在设备之间传输数据。安装 Bluez 软件包后,启动该软件。您的日志应显示该软件已正确启动,并且已正确识别您的蓝牙硬件。
为了找到蓝牙令牌,需要暂时将其置于可发现模式。将其打开,然后从命令行运行以下扫描命令
mike@templar:~$ hcitool scan
Scanning ...
D4:E9:C0:37:00:0D eris
记下蓝牙 ID,并确保名称字段不为空。它可以是任何东西,但必须是某个东西。完成此步骤后,您可以关闭蓝牙设备上的可发现模式以提高安全性。现在您拥有了所需的所有信息。
以下脚本检查蓝牙设备是否在范围内,并根据结果停止或启动音乐播放器。将 SERVER_URI
变量替换为您的 MPD/Icecast 服务器,并将 BTADDR 变量替换为您的设备的蓝牙 ID(此 ID 来自上面的 hcitool scan
命令)
#!/bin/bash
SERVER_URI="http://templar:8000/"
BTADDR="D4:E9:C0:37:00:0D"
DBUSADDR=`grep -z DBUS_SESSION_BUS_ADDRESS /proc/*/environ 2>
↪/dev/null|
sed 's/DBUS/\nDBUS/g' | tail -n 1`
if [ "x$DBUSADDR" != "x" ]; then
export $DBUSADDR
else
echo "Cannot find DBUS Session for Rhythmbox. Please
be sure the application is running"
exit 1
fi
NAME=`hcitool name $BTADDR`
if [ -z "$NAME" ] ; then
`rhythmbox-client --pause`
else
`rhythmbox-client --play-uri=$SERVER_URI`
fi
将此脚本另存为 /usr/local/bin/musiccontrol.sh。接下来,将该脚本添加为每分钟运行一次的 crontab 条目。此条目必须以与拥有 Rhythmbox 进程的用户相同的用户身份运行。
以正确的用户身份编辑 crontab
mike@templar:~$ crontab -e
添加以下行,然后保存并退出
* * * * * /usr/local/bin/musiccontrol.sh
现在,打开蓝牙设备(这次不需要可发现,因为您已经有了地址)。在下一分钟的开始时,cron 脚本将看到蓝牙设备,然后告诉 Rhythmbox 开始播放来自 MPD/Icecast 服务器的音乐。如果将蓝牙设备移出范围,cron 脚本将不再看到蓝牙设备,并将停止音乐。
Rhythmbox、蓝牙和此 cron 脚本必须在您打算为您播放音乐的每台机器上设置。如果您仅在一台计算机上执行此操作,则只有该计算机在您进入或离开范围时才会开始和停止音乐。如果您在多台硬件上设置系统,它将为您转换音乐。当移出某一台服务器的范围并进入另一台服务器的范围时,音乐将自动在您之前所在的房间中停止,并在您现在所在的房间中开始。
这只是自动移动媒体的简单设置。可以为家中的不同成员设置多个蓝牙设备,并且可以建立优先级系统。可以使用 “motion” 软件包的运动检测来进一步区分家中具有重叠蓝牙的区域。您甚至可以在 OpenCV 项目的帮助下使用面部识别。从这里开始,您可以有很多选择。
耳机图片 来自 Shutterstock.com。