查看: 12234|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    2016-8-15 09:30
  • 签到天数: 162 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2015-11-10 14:13:05 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 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
    复制代码
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-4-19 10:50 , Processed in 0.111186 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.