之前有一篇文章介紹了如何使用藍(lán)牙實(shí)現(xiàn)手機(jī)連接無線音箱外放,在網(wǎng)上搜索相關(guān)資料的過程中,我發(fā)現(xiàn)了樹莓派另外一個(gè)強(qiáng)大的功能,那就是可以實(shí)現(xiàn)蘋果(Apple)的AirPlay播放技術(shù),簡單的介紹一下,AirPlay類似于藍(lán)牙音響播放,但是其是建立在WiFi局域網(wǎng)基礎(chǔ)上的,在接入有AirPlay播放技術(shù)的局域網(wǎng)上,蘋果的設(shè)備就會顯示支持AirPlay。綜合AirPlay的優(yōu)勢,我開始在Raspberry Pi(樹莓派)上實(shí)現(xiàn)相關(guān)功能。
同樣的,關(guān)于樹莓派一些好玩的功能國外資料較為豐富,經(jīng)過查閱后《Raspberry Pi Airplay Tutorial》(原文超級詳細(xì))這一篇文章對我?guī)椭^大,具體步驟如下。
1. 升級Raspberry Pi系統(tǒng)的軟件
sudo apt-get updatesudo apt-get upgrade |
2. 將音頻輸出變更為默認(rèn)的音頻輸出口
通常情況下樹莓派的音頻輸出使用的是HDMI接口,我們需要下面的命令將其變更為普通音頻輸出口:
sudo amixer cset numid=3 1 |
這一步我遇到一個(gè)錯(cuò)誤:
ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect: Access deniedamixer: Control default open error: Connection refused
提示沒有權(quán)限,如果不使用sudo則沒有這類問題,比較郁悶。如果你也遇到同樣的問題,先跳過,我們繼續(xù)下面的步驟。
3. 安裝系統(tǒng)所必需的軟件包
sudo apt-get install git libao-dev libssl-devsudo apt-get install libcrypt-openssl-rsa-perl libio-socket-inet6-perlsudo apt-get install libwww-perl avahi-utils libmodule-build-perl |
4. 安裝Perl Net-SDP協(xié)議軟件
cd ~git clone https://github.com/njh/perl-net-sdp.git perl-net-sdpcd perl-net-sdpperl Build.PLsudo ./Buildsudo ./Build testsudo ./Build installcd .. |
5. 使用Shairport將樹莓派設(shè)置為AirPlay接收器
cd ~git clone https://github.com/hendrikw82/shairport.gitcd shairportmake |
6. 啟動Shairport以支持AirPlay
./shairport.pl -a WangyePi |
這里我們指定了一個(gè)名字叫做WangyePi,大家可以根據(jù)實(shí)際進(jìn)行修改,自此,你可以使用蘋果設(shè)備來訪問AirPlay了,當(dāng)然每次使用這個(gè)命令略顯不便,下面介紹如何將其變成系統(tǒng)服務(wù)。
7. 將Shairport設(shè)置為系統(tǒng)服務(wù)
cd shairportsudo make installsudo cp shairport.init.sample /etc/init.d/shairport cd /etc/init.dsudo chmod a+x shairportsudo update-rc.d shairport defaults |
好了,上面的步驟將移植Shairport到系統(tǒng)路徑下,同時(shí)創(chuàng)建名稱為shairport的服務(wù),你可以使用sudo service
控制這個(gè)服務(wù)。
接下來編輯這個(gè)啟動文件:
sudo nano /etc/init.d/shairport |
找到DAEMON_ARGS="-w $PIDFILE"
這行,并且修改成DAEMON_ARGS="-w $PIDFILE -a WangyePi"
,同樣的這里WangyePi為你的AirPlay名字。
啟動AirPlay看看效果吧:
sudo service shairport start |
8. 一些問題
如果上面步驟完成后一切正常的話,那么恭喜你,這一步可以略過了。我親自試驗(yàn)下來沒有那么順利,假如AirPlay不能播放的話,建議使用tail /var/log/syslog
命令查看系統(tǒng)日志以便于確定問題原因,比如我就遇到下面的錯(cuò)誤:
May 11 04:57:05 raspberrypi pulseaudio[2563]: [pulseaudio] protocol-native.c: Denied access to client with invalid authorization data.
具體的處理方式如下,之前我注意到sudo amixer cset numid=3 1
命令會導(dǎo)致pulseaudio拒絕訪問報(bào)錯(cuò),特詭異,居然管理員權(quán)限還有不能訪問的資源。
然后我檢查了pulseaudio和shairport啟動的用戶,發(fā)現(xiàn)pulseaudio是以pulse賬戶啟動的,而shairport是以root身份啟動的,很有可能問題出在這兒,我們只需要讓兩個(gè)都以pulse賬戶啟動就萬事大吉了。
命令sudo nano /etc/init.d/shairport
修改shairport啟動文件,將PIDFILE=/var/run/$NAME.pid
改為PIDFILE=/var/run/shairport/$NAME.pid
,然后找到兩處start-stop-daemon
,分別加上-c pulse
參數(shù),我的最終修改如下:
#!/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=shairportDAEMON="/usr/local/bin/shairport.pl"PIDFILE=/var/run/shairport/$NAME.pidDAEMON_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 |
然后創(chuàng)建PID所在文件夾并設(shè)置權(quán)限:
sudo mkdir /var/run/shairportsudo chown pulse /var/run/shairport |
最后重啟shairport服務(wù),看看是不是正常了。
sudo service shairport restart |
參考文檔
2014年5月12日更新
在上面第8點(diǎn)有些問題的敘述上需要更正一下,今天發(fā)現(xiàn)建立在/var/run
路徑下的shairport
目錄消失,導(dǎo)致shairport啟動失敗,于是我將啟動文件/etc/init.d/shairport
修改如下:
#!/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=shairportDAEMON="/usr/local/bin/shairport.pl"PIDDIR=/var/run/shairportPIDFILE=$PIDDIR/$NAME.pidDAEMON_ARGS="-w $PIDFILE -a AirPi" [ -x $binary ] || exit 0 RETVAL=0 start() { echo -n "Starting shairport: " if [ ! -d $PIDDIR ]; then mkdir -p $PIDDIR chown pulse:pulse $PIDDIR fi 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 |
聯(lián)系客服