Linux下实现苹果AirPlay音频服务器

一、背景

  • 背景:在华清学习之余,自行研究了智能家居的东西,为了解决智能家居中背景音乐问题研究如下:调查发现现有技术中有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的博客-CSDN博客

软件包间的依赖关系

基于树莓派的手机音频播放功能实现_zhonglunshun的专栏-CSDN博客_树莓派aux

四、后续

4.1直接安装(已验证)

可以直接用apt-get安装,已经实验可行性(在乌班图服务器和乌班图桌面版均好使)。ubuntu 16.04 的软件仓库里已经集成了 shairport-sync,这样只需要执行 apt install 就可以安装了,安装后自动开机自启。

但是 shairport 还需要 avahi-daemon 这个服务,avahi-daemon 是开源的,它实现了苹果的 mDNS 协议(在苹果的设备上对应的服务是 Banjour)。shairport 需要在 avahi 上注册自己。

按照_weixin_39978444的博客-CSDN博客的方法直接使用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服务之后的问题_鸟不知把小绿带到哪里去了-CSDN博客

4.2 路由器安装shairplay(未验证)

小度路由添加airplay_u014682756的专栏-CSDN博客

4.3 STM32(未验证)

基于STM32和W5500实现AirPlay音频播放_WIZnet2012专栏-CSDN博客

猜你喜欢

转载自blog.csdn.net/m0_45961169/article/details/125781452