树莓派的初始配置与AirPlay

我那台树莓派3B已经吃灰很久,除去大学时做过的一个机器人之外并没有给它找到合适的用途,所以自从机器人因为某些原因被拆掉后一直把它放在柜子里。

受古典戏剧影响,我的审美倾向正趋于“平淡”,对桌上硕大的副屏和繁多配件愈感碍眼。当初购买只是好奇尝试,但长期使用并没有提升多少效率反而会使我无法专注,便决定移除它们。抛掉4K副屏,13寸MacBook Pro的图形算力显然得到不小释放,能清晰感觉到过渡动画更加细腻,也不再有频繁的卡顿掉帧。另外,拔掉外置红轴机械键盘才发现苹果的蝶式键盘并没有那么不堪,是一种不同于长键程的清脆手感,我很喜欢。

macbook pro

MBP无需其它配件就已经很好用,唯一不足是与桌面音箱比起来寒酸的内置扬声器,毕竟那么悬殊的音腔体积。我有一对不支持蓝牙和网络的漫步者经典桌面音箱EDIFIER R1200TII,之前一直插在雷电3拓展坞上,用一根线连接电脑就能自动切换到它。但我想更进一步,让我的iPhoneiPad也能以无线方式播放音频。

首先想到的自然是蓝牙,在京东上买一个海备思蓝牙接收器,但结果很失望,不仅有无法消除的底噪,而且只能连接一台设备,换其它设备要重新配对,不是我想要的效果。另一种方案就是AirPlay,闲置的树莓派作为AirPlay接收器,由它控制播放收到的音频流,可以让这台音箱以低成本融入到苹果的设备生态里。

初始化

树莓派已经吃灰太久,要重新安装Raspberry Pi OS with desktop操作系统。

这个系统有一些初始配置:

  • 默认用户名为pi,密码为raspberry
  • 默认主机名为raspberrypi
  • 默认关闭SSHVNC

因为SSHVNC是默认关闭的,所以必须在有显示器和键鼠的情况下手动开启之后才能通过网络连接到树莓派,然后就可以扔掉显示器直接用远程桌面了。

# 在同一个局域网中通过主机名访问树莓派
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种方式,BalenaSoundShairport Sync

BalenaSound本质是一个支持AirPlayIOT系统,树莓派安装此系统会在开机后自动接入它提供的物联网平台,同时在局域网内能通过AirPlay把音频串流到树莓派连接的音箱上。这种方式非常简单,开箱即用,但因为要安装定制的操作系统,树莓派自身的灵活性是受限的。

Shairport Sync则只是一个单纯的开源Linux软件,可以安装到任何支持的操作系统中,包括Raspberry Pi OS,显然更适合开发者。

Simple Installation Instructions

官网提供完善的安装文档,对树莓派有单独介绍,只是要注意配置文件/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 OptionsAudio中选择输出设备为Headphones即可。

raspi-config

arrow_upward