基于嵌入式的以太網數字語音廣播系統設計
3 廣播系統軟件設計本文引用地址:http://www.104case.com/article/149545.htm
該設計實現語音數據的實時播放,所以要求語音數據傳輸的實時性得到保障,而對于數據的完整性要求不是太嚴格,少量的丟包也不會影響整體的播放效果,所以該系統的語音數據傳輸采用UDP傳輸方式,同時本系統工作在局域網內,臨時用戶較少,故采用IP地址靜態分配,簡化播放終端軟件部分的實現。
3.1 廣播系統服務器端語音數據的采集、存儲與發送
語音數據的采集利用低層WAVE音頻API函數實現,為了不造成語音數據的丟失,該設計利用雙緩沖來存儲語音數據,實現流程如圖3所示。
當一個錄音緩沖區滿時,系統立刻將另一個錄音緩沖區發送給錄音設備繼續錄音,而應用程序此時要讀取已經錄音滿的緩沖區中的數據,并進行處理。然后調用waveInAddBuffer函數將該緩沖區重新賦給錄音設備,循環利用。
為了防止錄音過程中語音數據的丟失,只是簡單地利用雙緩沖是不夠的,還要注意的一點是,當一個緩沖區錄音滿以后,應用程序對該緩沖區的數據進行處理,同時第二個緩沖區用于錄音,數據處理的時間一定要小于第二個緩沖區錄音滿需要的時間,否則在第二個緩沖區錄音滿以后第一個緩沖區還沒有重新賦給錄音設備,就會造成語音數據的丟失。當語音信號采樣率大的時候適當增加緩沖區的大小,可以有效地解決這個問題。
為了將廣播的內容進行保存以備后需,需要將廣播內容保存在一個WAV文件中。WAV文件具有固定的頭格式,在保存語音數據之前,需要先將WAV文件的頭部設定好,否則保存的WAV文件無法播放。在每一次錄音緩沖區滿時,首先找到WAV文件的結尾處,然后將采集到的數據依次寫在文件尾部。當整個廣播過程結束時,所有的語音數據都被保存在了WAV文件中,實現了語音數據的存儲。
當一個錄音緩沖區滿后,這時就需要將已經采集到的語音數據通過網絡發送出去。在設計中首先利用Csocket類創建一個套接字,接下來只需要將采集到的數據封裝成IP包發送出去。該設計中語音信號的采樣率為44.1 kHz,16位雙聲道。為了避免語音數據丟失,錄音緩沖區的大小設定為1024B。
3.2 區域廣播的實現
以太網數字語音廣播系統的一個重要應用就是不僅可以實現全區廣播,同時可以實現局域廣播功能,即對指定的終端進行廣播。因此,在語音IP數據包的網絡傳輸中采用UDP組播包的形式進行數據傳輸。采用組播包傳輸數據,在局域網內所有包含在該組中的終端都可以接收到數據,實現全區廣播。為了實現局域廣播功能,該設計中在語音數據前面添加了一個結構體,如下所示,同時還有一個配置文件用于存儲系統各終端的IP地址。
struct STRING
{String IPNO1;
String IPNO2;
…
String IPNO9;
String IPNO10};
當需要對某幾個終端進行區域廣播時,在廣播系統服務器端的面板上(如圖4所示)將這幾個終端對應的編號選上。這時就將被選中終端的IP地址從配置文件中讀出并賦給該結構體中對應的變量。當終端接收到IP組播包時,首先判斷該結構體是否有和自己的IP地址相同的變量,如果有,則進行數據的接收播放,如果沒有則對數據進行丟棄處理,這樣就實現了區域廣播功能。相對于采用控制信號控制播放終端加入或者離開組播組,或者通過動態維護復雜的映射表以實現區域廣播功能的方法。該方法不需要在每次廣播之前對播放終端進行交互控制,也不需要動態跟蹤終端狀態,只需要在終端第一次加入系統時將終端對應的IP地址寫入配置文件即可,功能實現簡單。
3.3 廣播系統播放終端軟件的實現
廣播系統播放終端分為兩個部分來實現,音頻數據接收部分用于接收語音數據并進行存儲轉發,音頻解碼器實現語音信號的D/A轉換并播放。音頻數據接收部分采用Socket編程實現從以太網上接收語音數據,在接收到語音數據包以后,首先要對數據包進行判斷,是否是發給自己的數據包。終端通過將IP包中結構體struct STRING的成員變量與自己的IP地址進行比較,如果有成員變量和自己的IP地址相等,則存儲該數據包中的數據,否則丟棄。
評論