Raspberry Pi 的應用 - iOS & OSX 的好朋友,AirPlay 無線喇叭

by 3/09/2015 5 意見

自製「AirPort Express」實現 iPhone、iPod、iPad、Mac 透過 AirPlay 無線播放音樂 這篇文章中,我們在一般的 PC 上用 CentOS 實作了 AirPlay Service 讓 OSX 及 iOS 無線播放音樂,如果我們要改用 Raspberry Pi 來實作,步驟有什麼不一樣呢 ???

最後更新日期 - 2016/05/01
由於 shairport 已經停止維護,請參閱 AirPlay 讓音樂不只受「線」制,更要讓每個房間也一同享「樂」 的內容,更換成 shairport-sync 來實作。

事前準備

  • Raspberry Pi Model B / B+,A / A+ 需自行安裝 USB 有線或無線網路卡。
  • Raspbian 作業系統。
  • 僅支援音樂的傳送,不支援影片及照片串流的傳送,所以就算我們播放影片,也是只有音樂會傳過去,畫面依然只會在 iPhone 的螢幕上顯示。
  • 所有傳送端及接收端的設備,不論是有線還是無線,都必須連到同一個網段的區域網路裡。
  • App 本身必須支援 AirPlay,若是不支援的話,就算 iPhone 已經連上了 AirPlay,同樣無法遠端播放。
  • 作者已經說不繼續維護了,只能祈禱 Apple 不要把協定來個大改版,否則只能希望有其他神人接手改寫。

安裝套件


先連上 shairport 在 GitHub 的網頁

找到 下載連結,並複製下來。

用 SSH 連進 Raspberry Pi,貼上連結位址來下載。
wget https://github.com/abrasive/shairport/archive/master.zip

將原始碼解壓縮。
unzip master.zip

系統需求提到了下列相依套件,有 OpenSSL、libao、PuluseAudio、avahi。

OpenSSL 預設已經安裝好了,所以要自行安裝其他的套件。
sudo apt-get -y install libssl-dev libavahi-client-dev libasound2-dev

前置作業完成了,接著就準備正式開始了。

開始檢查組態。
cd shairport-master
./configure


咦?! 檢查完成了,不過怎麼有兩個錯誤訊息。
libao or its dev package not found
PulseAudo or its dev package not found

查詢一下 libao 及 PulseAudio 的開發用套件。
sudo apt-cache search libao

sudo apt-cache search pulseaudio

原來是欠了這兩個套件,把它們安裝上去吧。
sudo apt-get -y install libao-dev libpulse-dev

再檢查一次,這次就沒有問題了。
./configure

開始編譯
make

編譯完成後,直接就執行它。
./shairport -a 'RPi2 AirSpeaker'

怎麼又有問題了,這次的錯誤訊息又是什麼呢。
WARNING: could't create avahi client: Daemon not running!

原來是我們沒有安裝 avahi 的 daemon 程式,那就把它安裝起來吧。
sudo apt-get -y install avahi-daemon

這次終於成功了,「RPi2 AirSpeaker」是自訂的名稱,會在 iOS、OS X 上顯示出來,按下「Ctrl + C」,將服務中斷掉。
./shairport -a 'RPi2 AirSpeaker'

如果加上「-d」參數讓可以讓它在背景常駐。
./shairport -a 'RPi2 AirSpeaker' -d


設定服務


不過,每次開機都得手動啟動的話,實在是有點太麻煩,不如將它建立成背景服務來自動啟動吧。

先在 shairport 目錄裡,將它安裝起來。
sudo make install

將必要的相關檔案,複製到 /etc 目錄裡。
sudo cp -rf ~/shairport-master/scripts/debian/* /etc/

接著修改 daemon 設定檔。
sudo vi /etc/default/shairport

找到「#USER=shairport」改成「USER=pi」,「#GROUP=audio」改成「GROUP=pi」,而「#AP_NAME=」可以改成自訂的名稱,例如:「AP_NAME=RPI-Speaker」。

這樣子就可以用 service 指令來啟動。
sudo service shairport restart

也可以讓它在開機時自動啟動了。
sudo update-rc.d shairport defaults


Client 端實測


先測試一下 Mac 上是不是可以找到。
打開 iTunes,在音量調整條右側,就可以看到 AirPlay 的圖示。

點選它之後,除了這次在 Raspberry Pi 上實作的 AirPlay 喇叭之外,是不是也看到了在 CentOS 上實作的呢!

等到連線完成,就可以使用了。

接著,我們在 iPhone 上也來測試一下吧。

打開 iOS 上的控制中心,在 AirDrop 旁邊出現了 AirPlay 的字樣。

點選它之後,同樣出現了兩個 AirPlay 的喇叭。

選擇「RPi2 AirSpeaker」。

這樣子就可以讓 iPhone 連上 AirPlay 喇叭了。


異常排除


如果我們將上面的動作都完成,iOS 或 OS X 也連上 Raspberry Pi 了,但是卻沒有聲音,可能是因為音量太小了,可以用下列指令設定 3.5mm 接頭輸出的音量。
amixer cset numid=1 100%

或是直接用文字模式下的 ALSA 管理程式來設定。
alsamixer


系列文章


參考資料


圖片來源


更新紀錄

  • 2015/03/09 撰文。
  • 2015/05/05 加入音量的調整方式說明。
  • 2015/05/25 加入以 daemon 模式運行的步驟。 
  • 2016/05/01 建議改用 shairport-sync 來實作。

Heracles Jam,江湖人稱「海公公」

IT 技術家 - 創站部落客

一個常用 Windows、慣用 macOS、愛用 Linux 的 3C 阿宅
現職 MIS / 業界講師 / 資訊顧問 / 部落客

5 則留言 :

  1. 殘念!今天照著這篇執行,沒有任何 error,但是沒有聲音
    我的手機是 iPhone6 + iOS 8.2

    回覆刪除
    回覆
    1. 請確認下列幾點:
      1. iPhone 是否與 Raspberry Pi 的 IP 是同一個網段。
      2. Raspberry Pi 的音量是否太小聲。
      3. 不要接上 HDMI 的線。
      4. 測試一下未啟動 shairport 之前,是否可以正常播放音樂。

      刪除
  2. 請問一下,我換了一台 Banana pi 安裝,在 ./configure 的時候出現
    getopt.h not found
    這樣是缺少哪個套件
    謝謝你

    回覆刪除
    回覆
    1. 抱歉!
      因為我沒有用過 Banana Pi,而且它支援的 OS 太多種,所以無法確認你的問題在哪邊。
      不過,我稍微 google 跟 man 了一下,似乎跟 glibc 有些關聯,可以試試從這個方法找找看。

      刪除
    2. 沒關係~我再找找資料,謝謝你

      刪除