基於Orangpi Zero和Linux ALSA實現WIFI無線音箱(一)


作品已經完成,先上源碼:

https://files.cnblogs.com/files/qzrzq1/WIFISpeaker.zip

全文包含三篇,這是第一篇,作為前言和概述。

第二篇:基於Orangpi Zero和Linux ALSA實現WIFI無線音箱(二)

第三篇:基於Orangpi Zero和Linux ALSA實現WIFI無線音箱(三)

 

以下是正文:

一、前言

  先說為什么要做這個作品。作者手頭上有一閑置的藍牙音箱,可恨的是筆記本電腦沒有藍牙功能,而USB口只有兩個,即使買個藍牙適配器也不夠用USB口用,也不考慮用USB Hub,看着這么多線就讓人覺得糟心。剛好還有一塊OrangPi Zero,突發奇想,打算利用它和家里的WIFI無線網絡實現無線音箱的功能。其實類似功能音箱某寶上也有,不過大部分都是打着雲音箱、智能音箱的旗號,個人覺得這類音箱都有一個很大問題:只能播放網絡音樂或者使用DLNA、Airplay等協議從手機或電腦推送音頻,可是實際上很多瀏覽器、播放器並不支持DLNA或Airplay推送,這就很大的限制了這種音箱的使用范圍。例如作者習慣使用Potplayer(不支持DLNA和Airplay)作為PC端的音樂播放器和視頻播放器,這種情況下,這些智能音箱就完全沒用了。另外,在安卓上也有一些類似的app,類似Soundwire、wifiaudio等,能實現電腦聲卡輸出的音頻實時錄音並傳輸到安卓手機上,把手機充當wifi音箱,但在Linux環境上目前沒發現類似軟件。

二、硬件連接

  說干就干,先說硬件:OrangPi Zero硬件引出了音頻接口,如下圖所示。本作品直接使用耳機接口的LINEOUTR、LINEOUTL和GND引腳,分別代表左右聲道,這樣硬件環境就搭建好了。

  

 

三、軟件運行環境

  發送端:Windows7,開發工具Visual Studio 2012,C++語言。根據微軟MSDN,Core Audio APIs只支持Windows Vista以上操作系統,所以發送端軟件也只能在Vista以上系統運行。

  接收端:Orangpi Zero,運行Armbian 5.38,python3.5

四、系統原理圖

   發送端和接收端通過底層socket進行數據的發送和接受。socket意為套接字,是實現TCP/IP協議的一種最常用的方式,在各種編程環境下都有成熟的應用。了解網絡通訊的人都知道,網絡通訊最主要的兩種通訊協議是TCP協議和UDP協議,以下是我對這兩種協議的理解:

1、TCP協議是建立連接的通訊,是可靠的通訊,能保證發出去的數據包不丟失、不重復。

2、UDP協議是無連接的通訊,是不可靠的通訊,UDP盡最大努力保證數據可靠傳輸,但不保證一定能不出差錯、不丟包。

  這兩種通訊方式的優缺點也很明顯,TCP要建立連接、麻煩、效率低,一般使用在對數據准確率要求高而實時性不高的情況。相反,UDP協議不建立連接,操作簡單,不管對方能否收到,發送端都不停地發送,UDP協議在實時性要求比較高的場合非常合適,例如傳輸視頻、音頻數據時,一兩幀數據丟失、錯誤並不會影響用戶的體驗。所以,在本作品中,使用UDP協議的socket接口進行網絡通訊。系統框圖如下所示:

  發送端原理看似較簡單,但實際上作者花的最多的時間就在調試發送端上,在下一節將詳細講述發送端的原理和過程。以下是發送端和接收端運行界面:

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM