树莓派的初始配置与 AirPlay
立泉我的树莓派 3B 已经吃灰很久,除大学时做过一个机器人之外没有给它找到合适用途,所以自从机器人因为某些原因被拆掉后一直放在柜子里。
受古典戏剧影响,我的审美倾向趋于“平淡”,对桌子上的硕大副屏和繁多配件愈感碍眼。当初购买是好奇尝试,但长期使用没有提升效率反而使我无法专注,决定移除它们。抛掉 4K 副屏,13 寸 MacBook Pro 的图形算力得到不小释放,能清晰感觉到过渡动画变得更细腻,不再有频繁的卡顿掉帧。另外,拔掉外置红轴机械键盘才发现苹果的蝶式键盘并没有那么不堪,是一种不同于长键程的清脆手感,我很喜欢。
MBP 无需其它配件已经很好用,唯一不足是与桌面音箱比起来稍寒酸的内置扬声器,毕竟悬殊的音腔体积摆在那里。我有一对不支持蓝牙和网络的漫步者经典桌面音箱 EDIFIER R1200TII,之前一直插在雷电 3 拓展坞上,用一根线连接电脑能自动切换到它。但我想更进一步,让 iPhone 和 iPad 也能用无线方式投射音频。
首先想到的自然是蓝牙,在京东上买一个海备思蓝牙接收器,但结果很失望,不仅有无法消除的底噪而且只能连接一台设备,换其它设备要重新配对,不是我想要的效果。另一种方案是 AirPlay,闲置的树莓派作为 AirPlay 接收器播放音频流,可让这台音箱以低成本融入到苹果的设备生态里。
初始化
树莓派已经吃灰太久,要重新安装 Raspberry Pi OS with desktop 操作系统,这个系统有一些初始配置:
- 默认账户密码:pi@raspberry
- 默认主机名:raspberrypi
- 默认关闭 SSH 和 VNC
因为 SSH 和 VNC 是默认关闭的,所以必须在有显示器和键鼠的情况下手动开启才能通过网络连接到树莓派,然后即可扔掉显示器用远程桌面。
# 在同一个局域网中通过主机名访问树莓派
ssh pi@raspberrypi
如果不想每次都输密码可以用 SSH Key 登录。
另一个众所周知的 Linux 必备操作是切换软件源,树莓派的默认源archive.raspbian.org
位于欧洲,我这里的访问速度低于 100KB/S,必须切换到国内镜像。这个列表中有很多镜像源,我在用清华大学的mirrors.tuna.tsinghua.edu.cn
。
树莓派 3B 设置 APT 源需修改 2 个文件:
/etc/apt/sources.list
/etc/apt/sources.list.d/raspi.list
# 编辑前备份
sudo cp /etc/apt/sources.list /etc/apt/sources.list.back
sudo cp /etc/apt/sources.list.d/raspi.list /etc/apt/sources.list.d/raspi.list.back
# 编辑 rasbian 的相关软件包地址,切换到清华源
sudo vim /etc/apt/sources.list
# 内容改为
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi
# 编辑 rasperrypi 的相关软件包地址,切换到清华源
sudo vim /etc/apt/sources.list.d/raspi.list
# 内容改为
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui
换源之后升级已安装的软件包即可正常使用树莓派:
# 升级包索引
sudo apt update
# 升级软件包
sudo apt upgrade
AirPlay
树莓派支持 AirPlay 有 2 种方式,BalenaSound 和 Shairport Sync。
BalenaSound 是一个支持 AirPlay 的 IOT 系统,树莓派安装此系统会在开机后自动接入它提供的物联网平台,同时在局域网内能通过 AirPlay 把音频串流到树莓派连接的音箱上。这种方式非常简单,开箱即用,但安装定制操作系统使树莓派自身的灵活性受限。
而 Shairport Sync 则只是一个开源 Linux 软件,可以安装到任何支持的操作系统中,包括 Raspberry Pi OS,显然更适合开发者。
官网提供完善的安装文档,对树莓派有单独介绍。注意配置文件/etc/shairport-sync.conf
中的output_device
参数,它指定播放音频的设备,与实际硬件有关,照搬示例中的hw:0
可能导致串流成功但没有声音。
// Sample Configuration File for Shairport Sync on a Raspberry Pi using the built-in audio DAC
general = {
volume_range_db = 60;
};
alsa = {
output_device = "hw:0";
mixer_control_name = "PCM";
};
确定这个参数只需执行shairport-sync -h
,在输出中找到hardware output devices
,这里的hw:Headphones
即是树莓派的 3.5mm 音频接口:
Usage: shairport-sync [options...]
or: shairport-sync [options...] -- [audio output-specific options]
...
Settings and options for the audio backend "alsa":
-d output-device set the output device, default is "default".
-c mixer-control set the mixer control name, default is to use no mixer.
-m mixer-device set the mixer device, default is the output device.
-i mixer-index set the mixer index, default is 0.
hardware output devices:
"hw:b1"
"hw:Headphones"
所以树莓派的最终配置是:
general = {
// 自定义 AirPlay 设备名
name = "RaspberryPi";
volume_range_db = 60;
};
alsa = {
output_device = "hw:Headphones";
mixer_control_name = "PCM";
};
按说明启动 Shairport Sync:
# 启动 shairport-sync,即可在局域网内找到此 AirPlay 设备
sudo systemctl start shairport-sync
# 故障时重启服务
sudo systemctl restart shairport-sync
# 把 shairport-sync 添加到开机启动
sudo systemctl enable shairport-sync
如果 AirPlay 仍然没有声音,可尝试在树莓派上播放音频观察音箱是否出声。如果没有,可能是音频输出设备没有设置为耳机接口,执行sudo raspi-config
,在 System Options 的 Audio 中选择输出设备为 Headphones 即可。