本帖最后由 haothree 于 2015-11-10 14:18 编辑
除使用蓝牙实现连接无线音箱外放,树莓派另外一个强大的功能,那就是可以实现苹果(Apple)的AirPlay播放技术,在WiFi局域网基础上的,在接入有AirPlay播放技术的局域网上,苹果的设备就会显示支持AirPlay。综合AirPlay的优势,我开始在Raspberry Pi(树莓派)上实现相关功能。 1. 升级Raspberry Pi系统的软件 - sudo apt-get update
- sudo apt-get upgrade
复制代码2. 将音频输出变更为默认的音频输出口 通常情况下树莓派的音频输出使用的是HDMI接口,我们需要下面的命令将其变更为普通音频输出口:- sudo amixer cset numid=3 1
复制代码 这一步我遇到一个错误:
ALSA lib pulse.c:243pulse_connect) PulseAudio: Unable to connect: Access deniedamixer: Control default open error: Connection refused提示没有权限,如果不使用sudo则没有这类问题,比较郁闷。如果你也遇到同样的问题,先跳过,我们继续下面的步骤。
3. 安装系统所必需的软件包 - sudo apt-get install git libao-dev libssl-dev
- sudo apt-get install libcrypt-openssl-rsa-perl libio-socket-inet6-perl
- sudo apt-get install libwww-perl avahi-utils libmodule-build-perl
复制代码4. 安装Perl Net-SDP协议软件 - cd ~
- git clone https://github.com/njh/perl-net-sdp.git perl-net-sdp
- cd perl-net-sdp
- perl Build.PL
- sudo ./Build
- sudo ./Build test
- sudo ./Build install
- cd ..
复制代码5. 使用Shairport将树莓派设置为AirPlay接收器 - cd ~
- git clone https://github.com/hendrikw82/shairport.git
- cd shairport
- make
复制代码6. 启动Shairport以支持AirPlay - ./shairport.pl -a WangyePi
复制代码 这里我们指定了一个名字叫做WangyePi,大家可以根据实际进行修改,自此,你可以使用苹果设备来访问AirPlay了,当然每次使用这个命令略显不便,下面介绍如何将其变成系统服务。
7. 将Shairport设置为系统服务 - cd shairport
- sudo make install
- sudo cp shairport.init.sample /etc/init.d/shairport
-
- cd /etc/init.d
- sudo chmod a+x shairport
- sudo update-rc.d shairport defaults
复制代码 好了,上面的步骤将移植Shairport到系统路径下,同时创建名称为shairport的服务,你可以使用sudo service控制这个服务。
接下来编辑这个启动文件:- sudo nano /etc/init.d/shairport
复制代码 找到DAEMON_ARGS="-w $PIDFILE"这行,并且修改成DAEMON_ARGS="-w $PIDFILE -a WangyePi",同样的这里WangyePi为你的AirPlay名字。
启动AirPlay看看效果吧:- sudo service shairport start
复制代码8. 一些问题 如果上面步骤完成后一切正常的话,那么恭喜你,这一步可以略过了。我亲自试验下来没有那么顺利,假如AirPlay不能播放的话,建议使用tail /var/log/syslog命令查看系统日志以便于确定问题原因,比如我就遇到下面的错误:
May 11 04:57:05 raspberrypi pulseaudio[2563]: [pulseaudio] protocol-native.c: Denied access to client with invalid authorization data.[size=0.875]具体的处理方式如下,之前我注意到sudo amixer cset numid=3 1命令会导致pulseaudio拒绝访问报错,特诡异,居然管理员权限还有不能访问的资源。
[size=0.875]然后我检查了pulseaudio和shairport启动的用户,发现pulseaudio是以pulse账户启动的,而shairport是以root身份启动的,很有可能问题出在这儿,我们只需要让两个都以pulse账户启动就万事大吉了。
[size=0.875]命令sudo nano /etc/init.d/shairport修改shairport启动文件,将PIDFILE=/var/run/$NAME.pid改为PIDFILE=/var/run/shairport/$NAME.pid,然后找到两处start-stop-daemon,分别加上-c pulse参数,我的最终修改如下:- #!/bin/bash
- #
- # This starts and stops shairport
- #
- ### BEGIN INIT INFO
- # Provides: shairport
- # Required-Start: $network
- # Required-Stop:
- # Short-Description: shairport - Airtunes emulator!
- # Description: Airtunes emulator!
- # Default-Start: 2 3 4 5
- # Default-Stop: 0 1 6
- ### END INIT INFO
-
-
- # Source function library.
- . /lib/lsb/init-functions
-
- NAME=shairport
- DAEMON="/usr/local/bin/shairport.pl"
- PIDFILE=/var/run/shairport/$NAME.pid
- DAEMON_ARGS="-w $PIDFILE -a AirPi"
-
- [ -x $binary ] || exit 0
-
- RETVAL=0
-
- start() {
- echo -n "Starting shairport: "
- start-stop-daemon -c pulse --start --quiet --pidfile "$PIDFILE" \
- --exec "$DAEMON" -b --oknodo -- $DAEMON_ARGS
- log_end_msg $?
- }
-
- stop() {
- echo -n "Shutting down shairport: "
- start-stop-daemon -c pulse --stop --quiet --pidfile "$PIDFILE" \
- --retry 1 --oknodo
- log_end_msg $?
- }
-
- restart() {
- stop
- sleep 1
- start
- }
-
- case "$1" in
- start)
- start
- ;;
- stop)
- stop
- ;;
- status)
- status shairport
- ;;
- restart)
- restart
- ;;
- *)
- echo "Usage: $0 {start|stop|status|restart}"
- ;;
- esac
-
- exit 0
复制代码 然后创建PID所在文件夹并设置权限:- sudo mkdir /var/run/shairport
- sudo chown pulse /var/run/shairport
复制代码 最后重启shairport服务,看看是不是正常了。- sudo service shairport restart
复制代码 |