一、背景
- 背景:在华清学习之余,自行研究了智能家居的东西,为了解决智能家居中背景音乐问题研究如下:调查发现现有技术中有DLNA、AirPlay、Miracast三种。文章后有些项并未验证,后续慢慢实验。
其中DLAN应用最多,但是DLNA不是实时传输,而是在传输数据之前,会先缓冲一小段时间,因此DLNA只能传输移动设备上的图片、视频、音乐等。无法实现多屏同步显示的镜像功能,这是DLNA标准最大的缺陷所在。
Miracast(WiFi-Display)是实时的,它可以实时传输源端(Source)的输出。源端任何屏幕的操作都会被传输到接收(Sink)端。如果源端是播放媒体文件,源端负责先对媒体文件解码,然后再编码成H.264的格式。接收端只需要做H.264的解码就可以了。相对DLNA,Miracast对于WiFi通路的要求要更高一些。
出于技术考虑,DLAN<AirPlay<Miracast,但各自都有局限性。就体验而言,苹果的AirPlay体验最好。支持多设备同时播放。但是苹果的限制极高,在进行下列实验时,需要有苹果设备或者iTunes软件才可以进行。
- 技术定位:初级
- 整体思路:主要利用shairport-sync来实现
二、操作步骤
2.1 开发前的准备工作
准备工作一
- 更新软件,安装依赖
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install autoconf automake libtool
$ sudo apt-get install avahi-daemon
$ sudo apt-get install libltdl-dev libao-dev libavahi-compat-libdnssd-dev
$ sudo apt-get install build-essential git xmltoman autoconf automake libtool libdaemon-dev libpopt-dev libconfig-dev libasound2-dev avahi-daemon libavahi-client-dev libssl-dev
使用sudo apt-get install <packgename>时出现提示无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。
可以换个命令sudo aptitude install <packgename>,因为aptitude会自动把所有依赖的库都帮你顺着找到,并下载好。而apt-get下载某个包中它的所有依赖项都必须存在,这就是为什么我们每次执行apt-get的时候都需要先apt-get update的更新软件包的原因。
如果提示找不到aptitude,可以先使用sudo apt-get install aptitude进行下载
准备工作二
- 关闭WiFi节能(非必要)
$ sudo iwconfig wlan0 poweroff
2.2 编译安装 shairport-sync
- 下载、编译、安装
$ git clone https://github.com/mikebrady/shairport-sync.git
$ cd shairport-sync
$ autoreconf -i -f
$ sudo ./configure --sysconfdir=/etc --with-alsa --with-avahi --with-ssl=openssl --with-systemd
$ make
$ sudo make install
2.3 设置开机自启并启动
$ sudo iwconfig wlan0 poweroff
2.4更改设备名称
Shairport-sync的配置文件在:/etc/shairport-sync.conf
编辑这个文件,更改:name = "名称",然后重启服务:
sudo systemctl restart shairport-sync.service
或者直接sudo reboot重启也行 iφ(゜▽゜*)♪
2.4切换声卡(未验证)
如果你用的不是树莓派的板载声卡而是外接的usb声卡,那么你需要配置一下才能实现音乐播放,否则播放的时候是没有声音的或者没有声音从声卡传出来;
树莓派使用的是alsa的音频架构, alsa的配置文件是alsa.conf,它位于/usr/share/alsa目录下,通常还有/usr/share/alsa/card和/usr/shara/alsa/pcm两个子目录用来设置card相关的参数、别名以及一些PCM默认设置。一般不修改里面的内容。
alsa.conf 引用了/etc/asound.conf 和 ~/.asoundrc两个文件,这两个文件可以配置默认声卡和指定音频输入和输出声卡。
通过修改/etc/asound.conf的内容,可以修改默认的声卡信息,也可以指定特定的MIC和Speack。
defaults.pcm.card 1
defaults.pcm.device 0//一定要设置device号码
defaults.ctl.card 1
pcm.!default {
type asym
playback.pcm {
type plug
slave.pcm "hw:0,0"
}
capture.pcm {
type plug
slave.pcm "hw:1,0"
}
三、总结
- 通过此次实验主要学会了使用aptitude指令来解决依赖问题,整个实验难度不高,但是却卡在了依赖问题上。
- 缺少依赖倒置编译无法生成make包进而无法make。
- 最后我在树莓派4上成果运行,效果还可以,Windows下的iTunes可以同步播放,基本听不出延迟,于homepod延迟接近。(小米网络收音机虽然也支持airplay但是不会和电脑播放的同步,会提前于电脑)。但是声音比较小(可能存在个体差异),暂时没有发现解决方法。
参考:WIFI-Direct(Wifi直连)、AirPlay、DLAN、Miracast功能介绍
https://github.com/mikebrady/shairport-sync/blob/master/INSTALL.md
树莓派airplay_weixin_33887443的博客-优快云博客
基于树莓派的手机音频播放功能实现_zhonglunshun的专栏-优快云博客_树莓派aux
四、后续
4.1直接安装(已验证)
可以直接用apt-get安装,已经实验可行性(在乌班图服务器和乌班图桌面版均好使)。ubuntu 16.04 的软件仓库里已经集成了 shairport-sync,这样只需要执行 apt install 就可以安装了,安装后自动开机自启。
但是 shairport 还需要 avahi-daemon 这个服务,avahi-daemon 是开源的,它实现了苹果的 mDNS 协议(在苹果的设备上对应的服务是 Banjour)。shairport 需要在 avahi 上注册自己。
按照_weixin_39978444的博客-优快云博客的方法直接使用sudo apt install avahi-daemon;sudo apt install shairport-sync这两条指令。
$ sudo apt-get install libssl-dev libavahi-client-dev libasound2-dev libao-dev libpulse-dev
$ sudo apt-get install shairport-sync
Ubuntu配置机顶盒踩坑记录(Airplay/DLNA)/UPuP/Miracast
关于Raspbian上安装AirPlay服务之后的问题_鸟不知把小绿带到哪里去了-优快云博客
4.2 路由器安装shairplay(未验证)
小度路由添加airplay_u014682756的专栏-优快云博客