<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式以太網(wǎng)數(shù)字語(yǔ)音廣播系統(tǒng)技術(shù)設(shè)計(jì)

          嵌入式以太網(wǎng)數(shù)字語(yǔ)音廣播系統(tǒng)技術(shù)設(shè)計(jì)

          作者: 時(shí)間:2010-05-11 來(lái)源:網(wǎng)絡(luò) 收藏

          本文引用地址:http://www.ex-cimer.com/article/151868.htm

            3 軟件

            軟件分為服務(wù)器端軟件和播放終端軟件兩部分。

            該實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)播放,所以要求數(shù)據(jù)傳輸?shù)膶?shí)時(shí)性得到保障,而對(duì)于數(shù)據(jù)的完整性要求不是太嚴(yán)格,少量的丟包也不會(huì)影響整體的播放效果,所以該系統(tǒng)的數(shù)據(jù)傳輸采用UDP傳輸方式,同時(shí)本系統(tǒng)工作在局域網(wǎng)內(nèi),臨時(shí)用戶較少,故采用IP地址靜態(tài)分配,簡(jiǎn)化播放終端軟件部分的實(shí)現(xiàn)。

            3.1 廣播系統(tǒng)服務(wù)器端語(yǔ)音數(shù)據(jù)的采集、存儲(chǔ)與發(fā)送

            語(yǔ)音數(shù)據(jù)的采集利用低層WAVE音頻API函數(shù)實(shí)現(xiàn),為了不造成語(yǔ)音數(shù)據(jù)的丟失,該利用雙緩沖來(lái)存儲(chǔ)語(yǔ)音數(shù)據(jù),實(shí)現(xiàn)流程如圖3所示。

            當(dāng)一個(gè)錄音緩沖區(qū)滿時(shí),系統(tǒng)立刻將另一個(gè)錄音緩沖區(qū)發(fā)送給錄音設(shè)備繼續(xù)錄音,而應(yīng)用程序此時(shí)要讀取已經(jīng)錄音滿的緩沖區(qū)中的數(shù)據(jù),并進(jìn)行處理。然后調(diào)用waveInAddBuffer函數(shù)將該緩沖區(qū)重新賦給錄音設(shè)備,循環(huán)利用。

            為了防止錄音過(guò)程中語(yǔ)音數(shù)據(jù)的丟失,只是簡(jiǎn)單地利用雙緩沖是不夠的,還要注意的一點(diǎn)是,當(dāng)一個(gè)緩沖區(qū)錄音滿以后,應(yīng)用程序?qū)υ摼彌_區(qū)的數(shù)據(jù)進(jìn)行處理,同時(shí)第二個(gè)緩沖區(qū)用于錄音,數(shù)據(jù)處理的時(shí)間一定要小于第二個(gè)緩沖區(qū)錄音滿需要的時(shí)間,否則在第二個(gè)緩沖區(qū)錄音滿以后第一個(gè)緩沖區(qū)還沒(méi)有重新賦給錄音設(shè)備,就會(huì)造成語(yǔ)音數(shù)據(jù)的丟失。當(dāng)語(yǔ)音信號(hào)采樣率大的時(shí)候適當(dāng)增加緩沖區(qū)的大小,可以有效地解決這個(gè)問(wèn)題。

            為了將廣播的內(nèi)容進(jìn)行保存以備后需,需要將廣播內(nèi)容保存在一個(gè)WAV文件中。WAV文件具有固定的頭格式,在保存語(yǔ)音數(shù)據(jù)之前,需要先將WAV文件的頭部設(shè)定好,否則保存的WAV文件無(wú)法播放。在每一次錄音緩沖區(qū)滿時(shí),首先找到WAV文件的結(jié)尾處,然后將采集到的數(shù)據(jù)依次寫在文件尾部。當(dāng)整個(gè)廣播過(guò)程結(jié)束時(shí),所有的語(yǔ)音數(shù)據(jù)都被保存在了WAV文件中,實(shí)現(xiàn)了語(yǔ)音數(shù)據(jù)的存儲(chǔ)。

            當(dāng)一個(gè)錄音緩沖區(qū)滿后,這時(shí)就需要將已經(jīng)采集到的語(yǔ)音數(shù)據(jù)通過(guò)網(wǎng)絡(luò)發(fā)送出去。在設(shè)計(jì)中首先利用Csocket類創(chuàng)建一個(gè)套接字,接下來(lái)只需要將采集到的數(shù)據(jù)封裝成IP包發(fā)送出去。該設(shè)計(jì)中語(yǔ)音信號(hào)的采樣率為44.1 kHz,16位雙聲道。為了避免語(yǔ)音數(shù)據(jù)丟失,錄音緩沖區(qū)的大小設(shè)定為1024B。

            3.2 區(qū)域廣播的實(shí)現(xiàn)

            語(yǔ)音廣播系統(tǒng)的一個(gè)重要應(yīng)用就是不僅可以實(shí)現(xiàn)全區(qū)廣播,同時(shí)可以實(shí)現(xiàn)局域廣播功能,即對(duì)指定的終端進(jìn)行廣播。因此,在語(yǔ)音IP數(shù)據(jù)包的網(wǎng)絡(luò)傳輸中采用UDP組播包的形式進(jìn)行數(shù)據(jù)傳輸。采用組播包傳輸數(shù)據(jù),在局域網(wǎng)內(nèi)所有包含在該組中的終端都可以接收到數(shù)據(jù),實(shí)現(xiàn)全區(qū)廣播。為了實(shí)現(xiàn)局域廣播功能,該設(shè)計(jì)中在語(yǔ)音數(shù)據(jù)前面添加了一個(gè)結(jié)構(gòu)體,如下所示,同時(shí)還有一個(gè)配置文件用于存儲(chǔ)系統(tǒng)各終端的IP地址。

            struct STRING

            {String IPNO1;

            String IPNO2;

            …

            String IPNO9;

            String IPNO10};

            當(dāng)需要對(duì)某幾個(gè)終端進(jìn)行區(qū)域廣播時(shí),在廣播系統(tǒng)服務(wù)器端的面板上(如圖4所示)將這幾個(gè)終端對(duì)應(yīng)的編號(hào)選上。這時(shí)就將被選中終端的IP地址從配置文件中讀出并賦給該結(jié)構(gòu)體中對(duì)應(yīng)的變量。當(dāng)終端接收到IP組播包時(shí),首先判斷該結(jié)構(gòu)體是否有和自己的IP地址相同的變量,如果有,則進(jìn)行數(shù)據(jù)的接收播放,如果沒(méi)有則對(duì)數(shù)據(jù)進(jìn)行丟棄處理,這樣就實(shí)現(xiàn)了區(qū)域廣播功能。相對(duì)于采用控制信號(hào)控制播放終端加入或者離開組播組,或者通過(guò)動(dòng)態(tài)維護(hù)復(fù)雜的映射表以實(shí)現(xiàn)區(qū)域廣播功能的方法。該方法不需要在每次廣播之前對(duì)播放終端進(jìn)行交互控制,也不需要?jiǎng)討B(tài)跟蹤終端狀態(tài),只需要在終端第一次加入系統(tǒng)時(shí)將終端對(duì)應(yīng)的IP地址寫入配置文件即可,功能實(shí)現(xiàn)簡(jiǎn)單。

            3.3 廣播系統(tǒng)播放終端軟件的實(shí)現(xiàn)

            廣播系統(tǒng)播放終端分為兩個(gè)部分來(lái)實(shí)現(xiàn),音頻數(shù)據(jù)接收部分用于接收語(yǔ)音數(shù)據(jù)并進(jìn)行存儲(chǔ)轉(zhuǎn)發(fā),音頻解碼器實(shí)現(xiàn)語(yǔ)音信號(hào)的D/A轉(zhuǎn)換并播放。音頻數(shù)據(jù)接收部分采用Socket編程實(shí)現(xiàn)從上接收語(yǔ)音數(shù)據(jù),在接收到語(yǔ)音數(shù)據(jù)包以后,首先要對(duì)數(shù)據(jù)包進(jìn)行判斷,是否是發(fā)給自己的數(shù)據(jù)包。終端通過(guò)將IP包中結(jié)構(gòu)體struct STRING的成員變量與自己的IP地址進(jìn)行比較,如果有成員變量和自己的IP地址相等,則存儲(chǔ)該數(shù)據(jù)包中的數(shù)據(jù),否則丟棄。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();