回答

收藏

[教程] 树莓派利用AirPlay实现无线音响外放

Raspberry Pi Raspberry Pi 13113 人阅读 | 0 人回复 | 2015-11-10

本帖最后由 haothree 于 2015-11-10 14:18 编辑

除使用蓝牙实现连接无线音箱外放,树莓派另外一个强大的功能,那就是可以实现苹果(Apple)的AirPlay播放技术,在WiFi局域网基础上的,在接入有AirPlay播放技术的局域网上,苹果的设备就会显示支持AirPlay。综合AirPlay的优势,我开始在Raspberry Pi(树莓派)上实现相关功能。
1. 升级Raspberry Pi系统的软件
  1. sudo apt-get update
  2. sudo apt-get upgrade
复制代码
2. 将音频输出变更为默认的音频输出口
通常情况下树莓派的音频输出使用的是HDMI接口,我们需要下面的命令将其变更为普通音频输出口:
  1. 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. 安装系统所必需的软件包
  1. sudo apt-get install git libao-dev libssl-dev
  2. sudo apt-get install libcrypt-openssl-rsa-perl libio-socket-inet6-perl
  3. sudo apt-get install libwww-perl avahi-utils libmodule-build-perl
复制代码
4. 安装Perl Net-SDP协议软件
  1. cd ~
  2. git clone https://github.com/njh/perl-net-sdp.git perl-net-sdp
  3. cd perl-net-sdp
  4. perl Build.PL
  5. sudo ./Build
  6. sudo ./Build test
  7. sudo ./Build install
  8. cd ..
复制代码
5. 使用Shairport将树莓派设置为AirPlay接收器
  1. cd ~
  2. git clone https://github.com/hendrikw82/shairport.git
  3. cd shairport
  4. make
复制代码
6. 启动Shairport以支持AirPlay
  1. ./shairport.pl -a WangyePi
复制代码
这里我们指定了一个名字叫做WangyePi,大家可以根据实际进行修改,自此,你可以使用苹果设备来访问AirPlay了,当然每次使用这个命令略显不便,下面介绍如何将其变成系统服务。
7. 将Shairport设置为系统服务
  1. cd shairport
  2. sudo make install
  3. sudo cp shairport.init.sample /etc/init.d/shairport

  4. cd /etc/init.d
  5. sudo chmod a+x shairport
  6. sudo update-rc.d shairport defaults
复制代码
好了,上面的步骤将移植Shairport到系统路径下,同时创建名称为shairport的服务,你可以使用sudo service控制这个服务。
接下来编辑这个启动文件:
  1. sudo nano /etc/init.d/shairport
复制代码
找到DAEMON_ARGS="-w $PIDFILE"这行,并且修改成DAEMON_ARGS="-w $PIDFILE -a WangyePi",同样的这里WangyePi为你的AirPlay名字。
启动AirPlay看看效果吧:
  1. 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参数,我的最终修改如下:
  1. #!/bin/bash
  2. #
  3. # This starts and stops shairport
  4. #
  5. ### BEGIN INIT INFO
  6. # Provides:          shairport
  7. # Required-Start:    $network
  8. # Required-Stop:
  9. # Short-Description: shairport - Airtunes emulator!
  10. # Description:       Airtunes emulator!
  11. # Default-Start:     2 3 4 5
  12. # Default-Stop:      0 1 6
  13. ### END INIT INFO


  14. # Source function library.
  15. . /lib/lsb/init-functions

  16. NAME=shairport
  17. DAEMON="/usr/local/bin/shairport.pl"
  18. PIDFILE=/var/run/shairport/$NAME.pid
  19. DAEMON_ARGS="-w $PIDFILE -a AirPi"

  20. [ -x $binary ] || exit 0

  21. RETVAL=0

  22. start() {
  23.     echo -n "Starting shairport: "
  24.     start-stop-daemon -c pulse --start --quiet --pidfile "$PIDFILE" \
  25.                       --exec "$DAEMON" -b --oknodo -- $DAEMON_ARGS
  26.     log_end_msg $?
  27. }

  28. stop() {
  29.     echo -n "Shutting down shairport: "
  30.     start-stop-daemon -c pulse --stop --quiet --pidfile "$PIDFILE" \
  31.                 --retry 1 --oknodo
  32.     log_end_msg $?
  33. }

  34. restart() {
  35.     stop
  36.     sleep 1
  37.     start
  38. }

  39. case "$1" in
  40.     start)
  41.         start
  42.     ;;
  43.     stop)
  44.         stop
  45.     ;;
  46.     status)
  47.         status shairport
  48.     ;;
  49.     restart)
  50.         restart
  51.     ;;
  52.     *)
  53.         echo "Usage: $0 {start|stop|status|restart}"
  54.     ;;
  55. esac

  56. exit 0
复制代码
然后创建PID所在文件夹并设置权限:
  1. sudo mkdir /var/run/shairport
  2. sudo chown pulse /var/run/shairport
复制代码
最后重启shairport服务,看看是不是正常了。
  1. sudo service shairport restart
复制代码
分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条