版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 計算機科學與工程學院</p><p><b> 綜合設計報告</b></p><p> 設計名稱: 智能系統(tǒng)應用綜合設計 </p><p> 設計題目: 音頻網(wǎng)絡傳輸?shù)膶崿F(xiàn) </p><p> 學生學號:
2、 </p><p> 專業(yè)班級: </p><p> 學生姓名: </p><p> 學生成績: </p><p&
3、gt; 指導教師(職稱): </p><p> 課題工作時間: 2013. 1. 7 至 2013. 1. 18 </p><p><b> 目錄</b></p><p> 摘 要……………………………………………………………………………………II</p>
4、<p> Abstract……………………………………………………………………………………II</p><p> 第一章 課題背景…………………………………………………………………….......1</p><p> 1.1 音頻傳輸背景…………………………………………………………………………1</p><p> 1.2 音頻處理簡介………
5、…………………………………………………………………1</p><p> 1.3 socket簡介……………………………………………………………………………..3</p><p> 第二章 設計簡介及設計方案論述……………………………………………………...4</p><p> 2.1 設計簡介………………………………………………………………………………4&l
6、t;/p><p> 2.2 設計方案………………………………………………………………………………4</p><p> 2.3 界面設計………………………………………………………………………………7</p><p> 第三章 詳細設計………………………………………………………………………..11</p><p> 3.1 音頻處理…………
7、…………………………………………………………………...11</p><p> 3.2 音頻在局域網(wǎng)中的傳輸……………………………………………………………...14</p><p> 第四章 設計結果及分析………………………………………………………………..23</p><p> 4.1 設計結果……………………………………………………………………………..
8、.23</p><p> 4.2 錯誤分析……………………………………………………………………………...25</p><p> 總 結……………………………………………………………………………………27</p><p> 致 謝……………………………………………………………………………………28</p><p> 參考文獻…
9、………………………………………………………………………………..29</p><p><b> 摘 要</b></p><p> 計算機網(wǎng)絡的飛速發(fā)展,給傳統(tǒng)音頻傳輸領域帶米了極大的沖擊并且為基于網(wǎng)絡的視、音頻通信提供了可能,在很多的網(wǎng)絡通信中,都需要將某一發(fā)送端的話音實時的傳榆給接收端。VC下的Client/server體系為這些應用需求提供了一個不錯的解決方
10、案。實時語音組播系統(tǒng)可以分成發(fā)送端、接收端和網(wǎng)絡傳輸3個子系統(tǒng).在此從TCP/IP通信的原理,包括路由選擇、傳輸協(xié)議、編程實現(xiàn)等角度。給出了比較完善的解決方案,從而實現(xiàn)了在局域網(wǎng)內語音信號的實時傳輸,有很好的參考意義和實用價值。</p><p> 關鍵詞 局域網(wǎng);實時語音;TCP/IP;組播;音頻捕捉</p><p><b> Abstract</b></
11、p><p> The development of computer networks had brought great impact on the traditional audio and provided a possibility for video and audio communication based on network.In the network communication,some voi
12、ce from sending termination should be transmitted to the receiving termination real—timely.Client and Server system under VC platform provided a good solution for the applications,which included three systems such as sen
13、ding termination,receiving termination and network transmission.According to t</p><p> Keywords:LAN;real-time voice; TCP/IP ;multieast; voice catch</p><p><b> 第一章 課題背景</b></p&g
14、t;<p> 1.1 音頻傳輸背景</p><p> 計算機網(wǎng)絡的飛速發(fā)展,給傳統(tǒng)音頻傳輸領域帶米了極大的沖擊。鑒于傳統(tǒng)音頻傳輸中難以克服的諸如不便于管理、布線復雜、難于實現(xiàn)自動切換等等的缺點,數(shù)字網(wǎng)絡易管理、敗控、強大的數(shù)據(jù)傳輸能力無疑為未來傳統(tǒng)音頻傳輸指明了方向。</p><p> 目前以太網(wǎng)是計算機局域網(wǎng)絡的主流技術,其應用已遍及各個方面,每幢智能大廈都具備連通互
15、連網(wǎng)物理層布線。與專業(yè)音頻數(shù)字網(wǎng)絡技術比較,以太網(wǎng)具有成熟的技術標準,以及極高的性能價格比。應用以太網(wǎng)構成音頻數(shù)字網(wǎng)絡,將具有快速、廉價和方便等諸多優(yōu)點,是近幾年來各大專業(yè)音頻設備研發(fā)公司研究的熱點。</p><p> 音頻傳輸?shù)膶崟r性要求是基于以太網(wǎng)來構筑傳輸系統(tǒng)首先必須考慮和解決的問題。同時,這樣一個分布式系統(tǒng)內部的時鐘同步十分關鍵,否則時序邏輯將可能發(fā)生意想不到的混亂。</p><p&
16、gt; 本綜合設計根據(jù)音頻傳輸網(wǎng)絡的要求,結合傳統(tǒng)以太網(wǎng)技術,研究了以太網(wǎng)的控制實時調度、系統(tǒng)時鐘同步和系統(tǒng)設計等技術問題,分析了音頻傳輸網(wǎng)絡的協(xié)議設計,提出了理想的基于以太網(wǎng)的音頻實時傳輸系統(tǒng)的解決方案。</p><p> 1.2 音頻處理簡介</p><p> 一、音頻媒體的數(shù)字化處理</p><p> 隨著計算機技術的發(fā)展,特別是海量存儲設備和大容量內
17、存在PC機上的實現(xiàn),對音頻媒體進行數(shù)字化處理便成為可能。數(shù)字化處理的核心是對音頻信息的采樣,通過對采集到的樣本進行加工,達成各種效果,這是音頻媒體數(shù)字化處理的基本含義。</p><p> 二、音頻媒體的基本處理</p><p> 基本的音頻數(shù)字化處理包括以下幾種: </p><p> 不同采樣率、頻率、通道數(shù)之間的變換和轉換。其中變換只是簡單地將其視為另一種格
18、式,而轉換通過重采樣來進行,其中還可以根據(jù)需要采用插值算法以補償失真。 </p><p> 針對音頻數(shù)據(jù)本身進行的各種變換,如淡入、淡出、音量調節(jié)等。 </p><p> 通過數(shù)字濾波算法進行的變換,如高通、低通濾波器。</p><p> 三、音頻媒體的三維化處理</p><p> 長期以來,計算機的研究者們一直低估了聲音對人類在信息
19、處理中的作用。當虛擬技術不斷發(fā)展之時,人們就不再滿足單調平面的聲音,而更催向于具有空間感的三維聲音效果。聽覺通道可以與視覺通道同時工作,所以聲音的三維化處理不僅可以表達出聲音的空間信息,而且與視覺信息的多通道的結合可以創(chuàng)造出極為逼真的虛擬空間,這在未來的多媒體系統(tǒng)中是極為重要的。這也是在媒體處理方面的重要措施。 </p><p> 人類感知聲源的位置的最基本的理論是雙工理論,這種理論基于兩種因素:兩耳間聲音的到
20、達時間差和兩耳間聲音的強度差。時間差是由于距離的原因造成,當聲音從正面?zhèn)鱽?,距離相等,所以沒有時間差,但若偏右三度則到達右耳的時間就要比左耳約少三十微秒,而正是這三十微秒,使得我們辨別出了聲源的位置。強度差是由于信號的衰減造成,信號的衰減是因為距離而自然產生的,或是因為人的頭部遮擋,使聲音衰減,產生了強度的差別,使得靠近聲源一側的耳朵聽到的聲音強度要大于另一耳。 </p><p> 基于雙工理論,同樣地,只要把
21、一個普通的雙聲道音頻在兩個聲道之間進行相互混合,便可以使普通雙聲道聲音聽起來具有三維音場的效果。這涉及到以下有關音場的兩個概念:音場的寬度和深度。 </p><p> 音場的寬度利用時間差的原理完成,由于現(xiàn)在是對普通立體聲音頻進行擴展,所以音源的位置始終在音場的中間不變,這樣就簡化了我們的工作。要處理的就只有把兩個聲道的聲音進行適當?shù)难訒r和強度減弱后相互混合。由于這樣的擴展是有局限性的,即延時不能太長,否則就會
22、變?yōu)榛匾簟?</p><p> 音場的深度利用強度差的原理完成,具體的表現(xiàn)形式是回聲.音場越深,則回音的延時就越長.所以在回音的設置中應至少提供三個參數(shù):回音的衰減率、回音的深度和回音之間的延時。同時,還應該提供用于設置另一通道混進來的聲音深度的多少的選項。</p><p> 1.3 socket簡介</p><p> 本次綜合設計運用的網(wǎng)絡傳輸?shù)暮诵姆绞骄褪?/p>
23、socket。所謂socket通常也稱作"套接字",應用程序通常通過"套接字"向網(wǎng)絡發(fā)出請求或者應答網(wǎng)絡請求。以J2SDK-1.3為例,Socket和ServerSocket類庫位于java .net包中。ServerSocket用于服務器端,Socket是建立網(wǎng)絡連接時使用的。在連接成功時,應用程序兩端都會產生一個Socket實例,操作這個實例,完成所需的會話。對于一個網(wǎng)絡連接來說,套接字是平等
24、的,并沒有差別,不因為在服務器端或在客戶端而產生不同級別。不管是Socket還是ServerSocket它們的工作都是通過SocketImpl類及其子類完成的。</p><p> 常用的Socket類型有兩種:流式Socket(SOCK_STREAM)和數(shù)據(jù)報式Socket(SOCK_DGRAM)。流式是一種面向連接的Socket,針對于面向連接的TCP服務應用;數(shù)據(jù)報式Socket是一種無連接的Socket,
25、對應于無連接的UDP服務應用。Socket為了建立Socket,程序可以調用Socket函數(shù),該函數(shù)返回一個類似于文件描述符的句柄。socket函數(shù)原型為:int socket(int domain,int type,int protocol);domain指明所使用的協(xié)議族,通常為PF_INET,(其與addrinfo 里的 AF_INET在現(xiàn)在看來是相同的。只是歷史上人們曾構想將AF(地址家族address family)與PF(p
26、rotocol family 協(xié)議家族)分開,但實際上這種區(qū)分并未真正推廣,所以現(xiàn)在AF_INET和PF_INET具有相同的意義。其中AF_INET是基于IPv4而PF_INET基于IPv6)表示互聯(lián)網(wǎng)協(xié)議族(TCP/IP協(xié)議族);type參數(shù)指定socket的類型:SOCK_STREAM 或SOCK_DGRAM,Socke</p><p> 第二章 設計簡介及設計方案論述</p><p&
27、gt;<b> 2.1 設計簡介</b></p><p> 要實現(xiàn)局域網(wǎng)音頻數(shù)據(jù)傳輸,必須要解決兩個間題:第一個問題是語音的錄制和播放,即將一個用戶所講的語音信號錄制下來,等待傳輸; 同時將從網(wǎng)絡上接收到其它用戶所發(fā)來的語音信息進行還原,使本地用戶聽到聲音; 對于聲音信息的錄制和播放,在這里采用的是低層音頻函數(shù)主要是考慮到語音信息傳輸?shù)膶崟r性要求。如果采用的是媒休控制接口函數(shù)(MCI )
28、 ,在進行錄制時首先將錄制的信息保存在計算機的硬盤文件上,而數(shù)據(jù)發(fā)送時則需要將文件從硬盤讀到緩沖區(qū)中,由此而導致數(shù)據(jù)在接收方有較大的延遲而低層音頻函數(shù),由于它提供了對計算機緩沖區(qū)的直接操作,使得錄制的音頻信息在緩沖區(qū)中就可以發(fā)送,不必先保存在文件中,這樣就可以保證接收方無延遲地接收到發(fā)送方所發(fā)送的數(shù)據(jù)(所謂的無延遲指接收方感覺不出聲音滯后)。因此只能選擇較為低層的音頻函數(shù),雖然這種方法編程較為復雜,但卻較好地保證了一說“與“聽”是同時進
29、行的第幾個問題是數(shù)據(jù)在局域網(wǎng)內的傳輸,這是個網(wǎng)絡數(shù)據(jù)傳輸?shù)膯栴}。實現(xiàn)網(wǎng)絡信息的互通,MFC 中提供了封裝的CAsyncSocket 類,可以方便地派生出符合要求的接收發(fā)送類。</p><p><b> 2.2 設計方案</b></p><p> 系統(tǒng)的應用平臺是Windows操作系統(tǒng),使用的是Winsock2規(guī)范,系統(tǒng)的開發(fā)工具是Microsoft VisualC
30、++6.0。此次設計的軟件,對組播組的成員,分為Server和Client 2種。進行通信之前,Server和Client都必須先加入一個組播組。除了服務器端和用戶端以外,對于音頻的處理也很重要。下面將設計方案分為三部分來進行介紹。</p><p> 2.2.1 音頻處理方案</p><p> 在Windows系列操作系統(tǒng)中,Microsoft提供了強大的DirectX工具。其中的Di
31、rectSound技術可以實現(xiàn)對聲音的實時捕捉和播放。</p><p><b> 1播放功能概述</b></p><p> DirectSound緩沖區(qū)對象表示一個包含聲音數(shù)據(jù)的緩沖區(qū),這些數(shù)據(jù)以PCM格式被存儲。該對象不僅可以用于開始、停止或暫停聲音的播放,還能夠設置聲音數(shù)據(jù)中諸如頻率和格式等屬性。</p><p><b>
32、2音頻捕獲</b></p><p> Directsoundcapture對象可以查詢音頻捕獲設備的性能,并為從輸入源捕獲音頻而創(chuàng)建緩沖區(qū),它還能夠捕獲壓縮格式的音頻。DirectsoundcaptureBuffer對象表示一個用于捕獲音頻的緩沖區(qū).它可以循環(huán)利用。</p><p><b> 3播放聲音的過程</b></p><p&
33、gt; (1)鎖定(IdirectsoundBuffer::Lock)從緩沖區(qū)的一部分;</p><p> (2)寫數(shù)據(jù):將捕捉到的聲音數(shù)據(jù)寫入將要發(fā)送的數(shù)據(jù)包中;</p><p> (3)解鎖(1directSoundBuffer::Unlock):對(1)的鎖定部分進行解鎖;</p><p> (4)將聲音傳送給主緩沖區(qū),并從哪里輸出(IdirectSo
34、undBuffer::Play)。</p><p> 2.2.2 Server設計方案</p><p> Server就是可以隨時發(fā)言,實時接聽,不受他人限制。對來自Client的發(fā)言申請作出響應,然后將該信息拷貝到發(fā)送緩沖區(qū)發(fā)送出去。圖2.1為Server端數(shù)據(jù)流程圖。</p><p> 圖2.1 Server端數(shù)據(jù)流程圖</p><p&
35、gt; 2.2.3 Client設計方案</p><p> Client就是可以實時接聽,每次發(fā)言前必須發(fā)出申請信息。當申請信息發(fā)送出去后,組播組內的所有成員都可以收到。當Server發(fā)送出對申請信息的響應信息后,各個Client將根據(jù)自己的本地地址與信息中包含的地址信息做比較,如果發(fā)現(xiàn)申請信息中的地址信息與本機地址一致,則說明是自己的發(fā)言申請的響應,于是處理;如果信息中的地址信息與本機地址不一致,那么不處理
36、。圖2.2是Client端數(shù)據(jù)流程圖。</p><p> 圖2.2 Client端數(shù)據(jù)流程圖</p><p><b> 2.3 界面設計</b></p><p> 一個功能完備的語音聊天系統(tǒng)必須擁有友好的界面。由于本次設計的是一種隨機建立服務器的系統(tǒng),所以每一個用戶都有可能成為服務器端。所以在任何人使用這一款軟件的時候應該能夠第一眼看見自
37、己的IP地址,并且可以設置端口號其作用相當于一個密鑰。當局域網(wǎng)中的另一個用戶同時知道你的IP地址和端口號,并且你已經(jīng)建立好一個服務器的情況下才能夠連接。界面上應該同時擁有建立服務器和連接服務器的選項,還要有開始語音通信的按鈕,以便不方便進行語音聊天的時候可以關閉該功能。市面上所有的語音聊天工具都附帶有一個即時打字聊天的功能,我所設計的這款軟件也擁有這樣的功能,因為不是隨時都有客觀條件進行語音通信的。那么界面還應該有一個編輯框和一個對話框
38、。所以界面初步在MFC中設計如圖2.3所示。</p><p> 圖 2.3 語音平臺界面初步成型</p><p> 可以從圖2.3看出,右上方的本機IP信息,端口號信息清晰明了,一目了然。連接服務器,建立服務器按鈕平行分布。左邊的編輯框和對話框也很清晰,符合人們運用聊天工具的習慣。</p><p> 界面很單調不夠友好怎么辦?想把界面的做的好看有修改主題和設置
39、壁紙兩種方法,這里我用的是嵌入壁紙這個方法。全部設置好之后運行的最后如圖2.4所示。</p><p> 圖 2.4 比較友好的界面成型</p><p> 設置嵌入背景的具體步驟如下:</p><p> 1.載入一張圖片ID設置為IDB_BIT_CHUYIN.</p><p> 2.在CExample2_ChatRoomDlg.h中定義
40、一個public下的CBrush m_brBk。CBrush:類CBrush封裝了Windows圖形設備接口(GDI)中的畫刷,畫刷也就是采取什么方案填充圖形的背景的工具。</p><p> 3. 在初始化函數(shù)OnInitDialog()中加入:</p><p> BOOL CExample2_ChatRoomDlg::OnInitDialog()</p><p&g
41、t;<b> {</b></p><p> CDialog::OnInitDialog();</p><p> CBitmap bmp;</p><p> bmp.LoadBitmap(IDB_BIT_CHUYIN);</p><p> m_brBk.CreatePatternBrush(&bmp);&
42、lt;/p><p> bmp.DeleteObject();</p><p> return TRUE; </p><p><b> }</b></p><p> 之所以在OnInitDialog()中進行操作是因為:OnInitDialog ( ):用于對對話框類的變量的初始化(注意:是在產生對話框之前就初始化),
43、是WM_INITDIALOG消息產生的消息處理函數(shù),覆蓋該函數(shù)可改變對話框初始設置。</p><p> 4. 打開類向導,找到WM_CTLCOLOR消息,重載得對應函數(shù)OnCtlColor(),添加如下:</p><p> HBRUSH CExample2_ChatRoomDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) <
44、;/p><p><b> {</b></p><p> HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);</p><p> // TODO: Change any attributes of the DC here</p><p> if (pWnd ==
45、 this)</p><p> { return m_brBk; } </p><p> // TODO: Return a different brush if the default is not desired</p><p> return hbr;</p><p><b> }</b></p>
46、;<p> 其中WM_CTLCOLOR消息的功能:WM_CTLCOLOR是一個由控制(Control)發(fā)送給它父窗口的通知消息(Notification message)。利用向導映射該消息產生函數(shù):HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);參數(shù)pDC是TestDlg的設備上下文,pWnd是TestDlg中發(fā)送該消息的contro
47、l指針,nCtlColor是Control的類型編碼。WM_CTLCOLOR是系統(tǒng)在繪制控件的時候自動發(fā)送的,如果需要自定義,就截取這個消息并重載它的響應函數(shù),用classWizard添加WM_CTLCOLOR消息然后編輯其OnCtlColor函數(shù)。這樣Windows向應用程序發(fā)送消息WM_CTLCOLOR,應用程序處理WM_CTLCOLOR消息并返回一個用來繪畫窗體背景的刷子句柄。</p><p> 經(jīng)過了以
48、上4個步驟之后一個友好的語音聊天平臺界面的設計已經(jīng)很完備,用戶使用這款軟件會覺得很舒服。</p><p><b> 第三章 詳細設計</b></p><p><b> 3.1 音頻處理</b></p><p> 3.1.1 WAVEHDR簡介</p><p> 本次課程設計中對音頻信號的采
49、集,處理,回放都是基于Windows下低層波形音頻數(shù)據(jù)塊結構WAVEHDR來實現(xiàn)的,因此有必要對這一數(shù)據(jù)結構進行說明,該數(shù)據(jù)結構聲明如下:</p><p> 01.type struct{</p><p> 02.LPSTR lpData; //指向鎖定的數(shù)據(jù)緩沖區(qū)的指針</p><p> 03.DWORD dwBuf
50、ferLength; //數(shù)據(jù)緩沖區(qū)的大小</p><p> 04.DWORD dwByteRecorded; //錄音時指明緩沖區(qū)中的數(shù)據(jù)量</p><p> 05.DWORD dwUser; //用戶數(shù)據(jù)</p><p> 06.DWORD dwFlag; //提供緩沖區(qū)信息的標
51、志</p><p> 07.DWORD dwLoops; //循環(huán)播放的次數(shù)</p><p> 08.struct wavehdr_tag * lpNext; //保留</p><p> 09.DWORD reserved; //保留</p><p> 10.} WAV
52、EHDR;</p><p> 聲音的采集和播放其實都是在操作這個音頻數(shù)據(jù)塊結構,實際上主要用到的就是第一個成員變量lpData, 所以我們只要在分配緩沖區(qū)(內存)的同時相應分配WAVEHDR數(shù)據(jù)塊結構,然后將緩沖區(qū)的指針賦給對應的數(shù)據(jù)塊結構的成員變量 lpData,這樣當一個緩沖區(qū)填滿后,也就是一個音頻數(shù)據(jù)塊填滿了,通過消息機制就可以在消息函數(shù)中進行處理和播放,播放完后又可通過消息函數(shù)把緩沖區(qū)再送給音頻設備輸入
53、驅動程序,繼續(xù)進行采集并播放,當你一次性分配多個緩沖區(qū)和數(shù)據(jù)塊結構并賦給音頻設備輸入驅動程序后,至于把哪個緩沖區(qū)填滿,然后再把哪個空緩沖區(qū)賦給設備輸入驅動程序,不需人為干預,完全由Windows控制,這就是一種用動態(tài)循環(huán)緩沖區(qū)實現(xiàn)話音的實時采集、播放的簡單而巧妙的辦法。</p><p> 3.1.2 初始化操作</p><p> 首先考慮到的是把從話筒中傳入的聲音轉化為數(shù)據(jù),然后再對其
54、進行處理,即聲音的采集與處理。</p><p> Windows多媒體擴展提供2個層次的音頻服務:</p><p> (1)低層音頻服務允許應用程序直接與音頻驅動程序通信,以管理聲音的播放和錄制。低層音頻服務要求較多的編程,但可以對播放提供更強的控制。</p><p> (2)高層音頻服務只需少量編程就能播放和錄制音頻文件。與低層音頻服務相比,高層音頻服務容易
55、使用,需要編程較少。高層服務可以滿足</p><p> 應用程序對音頻的簡單要求。</p><p> 本次課程設計中使用的是低層音頻服務。低層音頻服務可以更加靈活的控制不同類型的音頻設備。對波形設備而言,不論是播放還是錄制波形,系統(tǒng)要處理的數(shù)據(jù)都很多,為了少占用內存,低層音頻服務以數(shù)據(jù)塊為單位進行管理。他要求應用程序自己分配內存,并將內存塊的地址、大小等信息告訴低層音頻驅動程序,使其
56、為錄放音頻操作做好準備。</p><p> 音頻播放時,應用程序將要播放的數(shù)據(jù)填充到這個內存塊中,然后通知驅動程序播放該塊。驅動程序播放數(shù)據(jù)在后臺進行,應用程序可以在前臺繼續(xù)自己的工作。當一塊音頻播放完時,應用程序再向驅動程序提供新的數(shù)據(jù),如此反復,直到音頻數(shù)據(jù)播放完畢。</p><p> 音頻錄制時,應用程序向驅動程序提供驅動程序錄制的緩沖區(qū)內存塊,當驅動程序錄制充滿了給定的緩沖區(qū)后
57、,會以某種方式通知應用程序作一定的處理。驅動程序錄制數(shù)據(jù)在后臺進行,應用程序可以在前臺繼續(xù)自己的工作。</p><p> 要實現(xiàn)對音頻的采集與播放,必須經(jīng)過如下的初始化操作:</p><p> ?、儆脀aveInGetNumDevs()和waveOutGetNumDevs()查看當前系統(tǒng)波形音頻輸入、輸出設備;</p><p> ?、诎?000Hz,16Bit,單
58、聲道,16K/S的格式設置WAVEFORMATEX結構的成員變量,當然也可以改為其他WAVE格式;</p><p> ?、塾脀aveInOpen(...) 和waveOutOpen(...)分別調用WAVE_FORMAT_QUERY參數(shù)查看波形輸入設備是否支持所設定的格式;</p><p> ?、茉俅握{用用waveInOpen(...) 和waveOutOpen(...)分別調用CALLB
59、ACK_WINDOW參數(shù)打開波形輸入設備;</p><p> ?、莘謩e給音頻數(shù)據(jù)塊和音頻數(shù)據(jù)緩沖區(qū)分配、鎖定全局內存;</p><p> ⑥初始化音頻數(shù)據(jù)塊結構各成員變量,主要是將每個緩沖區(qū)指針賦給對應數(shù)據(jù)塊結構中的緩沖區(qū)指針變量lpData;調用waveInPrepareHeader(...)和waveInAddBuffer(...)將音頻數(shù)據(jù)塊賦給輸入設備驅動程序;</p>
60、;<p> ?、哒{用waveInStart(...)函數(shù)開始錄音。</p><p> 經(jīng)過以上一系列初始化操作,就可以完成音頻的輸入與采集了。</p><p> 3.1.3 消息操作</p><p> 錄音開始后,每當有采樣數(shù)據(jù)填滿數(shù)據(jù)塊后,設備驅動程序就會發(fā)消息MM_WIM_DATA給用戶窗口,本設計中相應的消息回調函數(shù)是WriteBuffer
61、Full(),代碼如下所示:</p><p> void CExample2_ChatRoomDlg::WriteBufferFull(LPARAM lp,WPARAM wp)</p><p><b> {</b></p><p> m_sound.Play();</p><p> CSingleLock loc
62、k(&m_mutex,TRUE);</p><p> CMessg msg;</p><p> msg.m_strText="";</p><p> msg.m_tag=1;</p><p> memcpy(msg.m_buffer,m_sound.m_cBufferIn,MAX_BUFFER_SIZE);
63、</p><p> if(!m_bClient)</p><p><b> {</b></p><p> POSITION pos;</p><p> for(pos=m_connectionList.GetHeadPosition();pos!=NULL;)</p><p><b&
64、gt; {</b></p><p> CClientSocket * t= (CClientSocket*)m_connectionList.GetNext(pos);</p><p> t->SendMessage(&msg);</p><p><b> }</b></p><p>&
65、lt;b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> m_clientsocket.SendMessage(&msg);</p><p><b> }</b></p&
66、gt;<p> m_sound.FreeRecordBuffer();</p><p> m_sound.FreePlayBuffer();</p><p> lock.Unlock();//</p><p><b> }</b></p><p> 該函數(shù)的功能是首先調用自己編寫的sound類的P
67、lay()函數(shù)對采集的音頻進行播放。Play()函數(shù)中只有一條如下語句:</p><p> memcpy(m_cBufferOut,m_cBufferIn,MAX_BUFFER_SIZE);</p><p> 可以看出,該函數(shù)實際上就是輸入的音頻數(shù)據(jù)拷貝到輸出的數(shù)據(jù)數(shù)組中,因為已經(jīng)經(jīng)過了前面所述的初始化過程,這行代碼就可以實現(xiàn)對音頻輸入數(shù)據(jù)的回放。</p><p&g
68、t; 之后WriteBufferFull()函數(shù)又將采集到的數(shù)據(jù)通過服務器發(fā)送給客戶端,或是通過客戶端發(fā)送給服務器。這要根據(jù)運行的進程是服務器端進程還是客戶端進程而定。這樣,每當有音頻輸入后,一旦數(shù)據(jù)塊被填滿,就能通過消息響應函數(shù)實現(xiàn)音頻的播放并通過網(wǎng)絡進行傳送。這就能實現(xiàn)音頻的連續(xù)采集與傳送,達到了本次課程設計的目的。</p><p> 3.2 音頻在局域網(wǎng)中的傳輸</p><p>
69、 3.2.1 創(chuàng)建Socket派生類</p><p> 上面完成了對聲音的采集和處理,現(xiàn)在考慮怎樣與局域網(wǎng)內的主機建立連接并把音頻數(shù)據(jù)發(fā)送出去。采用套接字(Socket)網(wǎng)絡編程接口來完成數(shù)據(jù)的收發(fā)工作。Socket是對通信端點的一種抽象,他提供了一種發(fā)送和接收數(shù)據(jù)的機制,在Visual C++6.0中Microsoft的基本類庫(Microsoft Foundation Class或MFC)提供了2個用于W
70、inSock編程的類,這2個類在不同程度上對WinSockAPI函數(shù)進行了封裝,這樣在很大程度上簡化了工作。CAsyncSocket類是在低程度上對WinSock API的封裝,他提供低級接口。Csocket類是從CAsyncSocket類派生而來的,他提供高一級的抽象處理。本次課程設計中就創(chuàng)建了兩個基于Csocket的派生類CServerSocket和CClientSocket分別來對服務器和客戶端的Socket進行處理。它們都直接繼
71、承Csocket類,因此能使用Csocket類的所有函數(shù)。此外針對服務器和客戶端的不同,還分別添加了各自的功能函數(shù)。</p><p> 在CServerSocket類中就加入了Init函數(shù),該函數(shù)主要實現(xiàn)服務器進程相關的建立端口,監(jiān)聽客戶端連接等功能。還加入了OnAccept()函數(shù)來對新的游客請求連接服務器進行處理。</p><p> 在CClientSocket類中則加入了Init
72、(),SendMessage(),CloseSocket()等函數(shù)分別來實現(xiàn)客戶端的初始化,發(fā)送信息,關閉端口等操作。</p><p> 3.2.2 自動獲得本機IP地址</p><p> 因為在局域網(wǎng)內與其他主機進行連接時必須要使用到對方的IP地址,只有將正確的主機IP地址作為一個參數(shù)傳入到本程序使用的connect函數(shù)中,才能與相應的主機成功進行連接,進而進行語音的傳輸。本次設計中
73、就實現(xiàn)了程序運行時自動獲得本機的ip地址并通過IP地址控件顯示出來,這樣就免去了用戶專門去查詢自己電腦的IP地址的步驟,也體現(xiàn)了本設計人性化的一面。</p><p> 本次設計中將獲得自身電腦的IP地址的函數(shù)加入到了CClientSocket類中,要獲得自己主機的IP地址,首先需要得到主機名,獲得主機名的函數(shù)GetLocalHostName代碼如下:</p><p> int CCli
74、entSocket::GetLocalHostName(CString &sHostName)//獲得本地計算機名稱</p><p><b> {</b></p><p> char szHostName[256];</p><p> int nRetCode;</p><p> nRetCode=ge
75、thostname(szHostName,sizeof(szHostName));</p><p> if(nRetCode!=0)</p><p><b> {</b></p><p><b> //產生錯誤</b></p><p> sHostName=_T("沒有取得主機名!
76、");</p><p> return GetLastError();</p><p><b> }</b></p><p> sHostName=szHostName;</p><p><b> return 0;</b></p><p><b>
77、; }</b></p><p> 該函數(shù)主要是調用gethostname()函數(shù)將本地計算機的名稱獲得,然后傳入到CString類型的參數(shù)sHostName中。</p><p> 得到主機名后,就可以使用GetIpAddress()函數(shù)得到主機的IP地址了,該函數(shù)的代碼如下:</p><p> int CClientSocket::GetIpAd
78、dress(const CString &sHostName, CString &sIpAddress)</p><p><b> {</b></p><p> struct hostent FAR * lpHostEnt=gethostbyname(sHostName);</p><p> if(lpHostEnt==N
79、ULL)</p><p><b> {</b></p><p><b> //產生錯誤</b></p><p> sIpAddress=_T("");</p><p> return GetLastError();</p><p><b>
80、; }</b></p><p><b> //獲取IP</b></p><p> LPSTR lpAddr=lpHostEnt->h_addr_list[0];</p><p> if(lpAddr)</p><p><b> {</b></p><p
81、> struct in_addr inAddr;</p><p> memmove(&inAddr,lpAddr,4);//轉換為標準格式</p><p> sIpAddress=inet_ntoa(inAddr);//將一個IP轉換成一個互聯(lián)網(wǎng)標準點分格式的字符串</p><p> if(sIpAddress.IsEmpty())</p
82、><p> sIpAddress=_T("沒有取得IP地址!");</p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> 從這段代碼可
83、以看出,這個函數(shù)利用到了前面得到的主機名作為參數(shù)調用gethostbyname函數(shù)得到一個記錄主機信息的結構體hostent,然后從該結構體中提取出主機的IP地址。由于得到的IP地址是網(wǎng)絡字節(jié)順序,后面又調用了memmove()和inet_ntoa()函數(shù)對該IP地址進行了轉換。最后得到就是CString類型的互聯(lián)網(wǎng)標準點分格式的字符串。</p><p> 下圖3.1是程序運行后的初始界面,從界面的右上方的IP
84、地址控件中可以看出本機的IP地址是192.168.1.104:</p><p> 圖 3.1 程序初始界面</p><p> 3.2.3 基于TCP協(xié)議的Socket編程</p><p> 進行Socket編程需要首先選擇一定的協(xié)議,常用的協(xié)議有TCP、UDP、ARP等,本次設計中就選擇了面向連接的TCP協(xié)議,這是一種提供給用戶進程的可靠的全雙工字節(jié)流面向連接
85、的協(xié)議。它要為用戶進程提供虛電路服務,并為數(shù)據(jù)可靠傳輸建立檢查。使用該協(xié)議能夠提供可靠的數(shù)據(jù)傳輸,能夠保證本設計語音的傳輸?shù)乜煽亢蜏蚀_。</p><p> 在TCP/IP網(wǎng)絡中兩個進程間的相互作用的主機模式是客戶機/服務器模式(Client/Server model)。該模式的建立基于以下兩點:1、非對等作用;2、通信完全是異步的??蛻魴C/服務器模式在操作過程中采取的是主動請示方式:</p>&l
86、t;p> 首先服務器方要先啟動,并根據(jù)請示提供相應服務:(過程如下) 1、打開一通信通道并告知本地主機,它愿意在某一個公認地址上接收客戶請求?! ?、等待客戶請求到達該端口。 3、接收到重復服務請求,處理該請求并發(fā)送應答信號。 4、返回第二步,等待另一客戶請求 5、關閉服務器?! 】蛻舴剑骸 ?、打開一通信通道,并連接到服務器所在主機的特定端口?! ?、向服務器發(fā)送服務請求報文,等待并接收應答;繼續(xù)提出請
87、求…… 3、請求結束后關閉通信通道并終止。</p><p> 面向連接的套接字的系統(tǒng)調用時序圖如下圖3.2所示:</p><p> 圖3.2 系統(tǒng)調用時序圖</p><p> 本次課程設計中對語音進行傳輸也是按照以上思路來編寫程序的,服務器端操作 socket(套接字)的主要步驟及使用到的主要函數(shù)如下:</p><p> 1、
88、建立Socket 初始化WinSock的動態(tài)連接庫后,需要在服務器端建立一個監(jiān)聽的Socket,為此可以調用Socket()函數(shù)用來建立這個監(jiān)聽的Socket,并定義此Socket所使用的通信協(xié)議。此函數(shù)調用成功返回Socket對象,失敗則返回INVALID_SOCKET(調用WSAGetLastError()可得知原因,所有WinSocket 的API函數(shù)都可以使用這個函數(shù)來獲取失敗的原因)。 SOCKET PASCAL FA
89、R socket( int af, int type, int protocol ) 參數(shù): af:目前只提供 PF_INET(AF_INET); type:Socket 的類型 (SOCK_STREAM、SOCK_DGRAM); protocol:通訊協(xié)定(如果使用者不指定則設為0); 如果要建立的是遵從TCP/IP協(xié)議的socket,第二個參數(shù)type應為SOCK_STREAM,如為UDP(數(shù)據(jù)報)的so
90、cket,應為SOCK_DGRAM?! ?、綁定端口 接下來要為服務器端定義的這個監(jiān)聽的Socket指定一個</p><p> name:Socket的地址值,這個地址必須是執(zhí)行這個程式所在機器的IP地址; namelen:name的長度; </p><p> 如果使用者不在意地址或端口的值,那么可以設定地址為INADDR_ANY,及Port為0,Wind
91、ows Sockets 會自動將其設定適當之地址及Port (1024 到 5000之間的值)。此后可以調用getsockname()函數(shù)來獲知其被設定的值?! ?、監(jiān)聽 當服務器端的Socket對象綁定完成之后,服務器端必須建立一個監(jiān)聽的隊列來接收客戶端的連接請求。listen()函數(shù)使服務器端的Socket 進入監(jiān)聽狀態(tài),并設定可以建立的最大連接數(shù)(目前最大值限制為 5, 最小值為1)。該函數(shù)調用成功返回0,否則返回SOCK
92、ET_ERROR?! nt PASCAL FAR listen( SOCKET s, int backlog ); 參 數(shù): s:需要建立監(jiān)聽的Socket; backlog:最大連接個數(shù); 服務器端的Socket調用完listen()后,如果此時客戶端調用connect()函數(shù)提出連接申請的話,Server 端必須再調用accept() 函數(shù),這樣服務器端和客戶端才算正式完成通信程序的連接動作。為了知道什么時
93、候客戶端提出連接要求,從</p><p> 客戶端操作 socket(套接字)的主要步驟如下:</p><p><b> 建立Socket</b></p><p> 這一步驟和服務器端一樣,依然使用了Socket()函數(shù)來建立Socket。</p><p> 使用connect()進行連接</p>
94、<p> 建立好套接字后,就可以使用connect()函數(shù)來對服務器進行連接了,只有成功連接</p><p> 之后才能進行通訊,繼而才能進行語音的傳輸。該函數(shù)的聲明如下:</p><p> int PASCAL FAR connect(SOCKET s,const structaddr FAR*name,int namelen)參數(shù):s:標識一未連接套接口的描述字。n
95、ame:將要進行連接的端口名。namelen:名字長度。功能:建立與一個端口的連接。用于創(chuàng)建與指定外部端口的連接。s指定一個未連</p><p> 接的數(shù)據(jù)報或流類套接口。如套接口未被捆綁,則系統(tǒng)賦予本地關聯(lián)一個唯一的值,并設置套接口為已捆綁。若名字結構中的地址為全零,則connect()將返回WSEADDRNOTAVAIL錯誤。將服務器的IP地址和端口號作為參數(shù)傳入到該函數(shù)中,就能實現(xiàn)與特定主機的服務器端
96、和特定的端口號進行連接。</p><p> 結束socket連接</p><p> 和服務器端一樣,依然調用closesocket()來結束socket連接。</p><p> 以上這些操作步驟主要是來完成對套接字的編程的,當服務器和客戶端成功進行連接后就可以進行語音數(shù)據(jù)的傳輸了,進行語音數(shù)據(jù)的傳輸主要用的是Csocket類提供的SendMessage()函數(shù)
97、,該函數(shù)能在服務器客戶端之間進行一定量數(shù)據(jù)的傳輸。本次設計中除了用該函數(shù)實現(xiàn)語音數(shù)據(jù)的傳輸外,實現(xiàn)字符聊天功能時也用到了該函數(shù)來實現(xiàn)字符的發(fā)送功能。從前面分析的消息MM_WIM_DATA的響應函數(shù)WriteBufferFull()中可以看出,也正是使用了此函數(shù)來將獲得的輸入音頻數(shù)據(jù)通過局域網(wǎng)發(fā)送到客戶端或服務器的。</p><p> 第四章 設計結果及分析</p><p><b&
98、gt; 4.1 設計結果</b></p><p> 在完成上一章的所有編碼之后,一個功能完備,界面友好的語音聊天平臺已經(jīng)出爐。</p><p> 首先運行程序,本機IP自動獲取并且端口號自動生成為4000,也可以改為其他。主機點擊建立服務器,對話框對顯示出“Server Has Been Set OK!”如圖4.1所示。</p><p> 圖 4
99、.1 建立主機效果圖</p><p> 再主機建立好之后客戶端想要連接服務器,只需要知道服務器的IP地址還有服務器所設置的端口號。將這2項填入之后點解連接服務器按鈕,就會顯示“Client Connection Succeed”,其效果如圖4.2所示。</p><p> 圖 4.2 客戶連接成功效果圖</p><p> 由于這個系統(tǒng)是組播方式的,所以支持多個游
100、客進入。當已經(jīng)擁有一個點對點的聊天框架的時候,又有一個游客想要進入,直接填寫服務器的IP和服務器的端口號便可以進入聊天室。這個時候為了告知聊天室中的成員有新的成員加入,會群體播放一個消息為:一個游客進入聊天室了。其效果如圖4.3所示。</p><p> 圖 4.3 多個游客進入聊天室效果圖</p><p> 這個時候一個組播系統(tǒng)的多人聊天室已經(jīng)布局成功。想要進行語音聊天只需要點擊語音聊
101、天按鈕就可以各自發(fā)言了。之后再次點擊這個按鈕可以停止發(fā)言但是可以聽見別人的發(fā)言,相當于禁言的效果。如果不方便語音聊天,可以在編輯欄中輸入想要組播的消息,系統(tǒng)能夠自動識別是誰在說話,相當于QQ群聊一樣,在制作這個功能的時候還遇見很多問題具體分析見下一節(jié)。</p><p><b> 4.2 錯誤分析</b></p><p> 本次課程設計在設計文字聊天功能的時候,準備
102、設計一個能夠像QQ那樣的顯示是哪一個IP地址的用戶在說話的功能,結果發(fā)現(xiàn)在對CString類型的字符串進行操作的時候總是出現(xiàn)類型不匹配的錯誤,導致添加發(fā)話人的這個功能實現(xiàn)不了。后來查閱資料對CString類型的字符串的一些自帶的函數(shù)進行重新仔細地研究,發(fā)現(xiàn)有一個CString類型封裝好的函數(shù)能夠完美地實現(xiàn)這個功能所以添加了如下代碼:</p><p> str.Format( "%s說:%s"
103、, ipStr, in);</p><p> 這句話的意思就是將ipStr字符串和in字符串按照ipStr說:in的格式組合成str字符串,其中ipStr是獲取的IP地址in是從編輯欄中獲取的輸入文字。這樣在對話框中顯示出str就是加工之后的語句了。效果如圖4.4所示:</p><p> 圖 4.4 顯示發(fā)話人效果圖</p><p> 除了這個問題比較難解決以
104、外,在進行語音聊天的時候,在多個機器之間進行調試也費了不少功夫,若硬件未裝驅動,則打開硬件函數(shù)識別不了硬件的存在與否。有時候會打不開語音聊天。</p><p><b> 總 結</b></p><p> 通過本次綜合設計,我進一步理解和消化了音頻處理的相關理論知識和技術熟練度,如音頻提取、TCP/IP協(xié)議等,并且我的自主學習能力、動手能力和團隊協(xié)作精神都得到了
105、顯著的提高,通過設計車牌識別系統(tǒng)的算法和程序,在不斷設計和嘗試中發(fā)現(xiàn)問題、解決問題,通過對算法的探索、研究與實踐并求得對問題的解決,從而達到了提高算法設計能力、程序編寫和項目開發(fā)的能力的目的。</p><p> 當然在本次課程設計中,我也遇到了許多困難,比如說算法設計的合理性、傳播信息封裝的準確率問題等等,但是我們通過互相學習、上網(wǎng)查找資料以及向老師、學長請教后,終于達到了目標。但是我仍存在幾個問題沒有解決,例
106、如當聊天環(huán)境嘈雜時,對語音的識別不是很準確。 </p><p> 對現(xiàn)實事物的設計不僅是對前面所學知識的一種檢驗,而且也是對自己能力的一種提高。通過這次設計使我明白了自己原來知識還比較欠缺。這個設計讓我學到了很多東西,涉及到方方面面的知識,在這整個過程中我們查閱了大量的資料,得到了老師和同學的幫助,我在此對他們表示謝意。在這期間遇到了很多困難,我知道做什么都不容易,只能塌下心來,一步一個腳印的去完成才行。我們學
107、習過計算機網(wǎng)絡這門課,并且在這個課程設計中應用到了很多其中的知識。理論只有應用到實際中才能學著更有意義。學習是一個長期積累的過程,在后的工作、生活中都應該不斷的學習,努力提高自己知識和綜合素質。此外,還得出一個結論:知識必須通過應用才能實現(xiàn)其價值!有些東西以為學會了,但真正到用的時候才發(fā)現(xiàn)是兩回事,所以我認為只有到真正會用的時候才是真的學會了。在整個設計中我懂得了許多東西,也培養(yǎng)了我獨立工作的能力,以及團隊協(xié)作的能力,樹立了信心,相信會
108、對今后的學習工作生活有非常重要的影響。同樣此次設計也大大提高了動手的能力,使我充分體會到了在創(chuàng)造過程中探索的艱難和成功時的喜悅。雖然這個設計做的并非對所以車牌都合適,但是在設計過 程中所學到的學習方法是我最大收獲</p><p><b> 致 謝</b></p><p> 感謝**學院給予了我們這次課程設計的機會,也感謝學校給我們提供實驗室和實驗電腦還有空調使
109、我們能在舒適優(yōu)秀的環(huán)境中進行學習。在這次綜合設計的過程中,雖說不算太曲折,但是還是遇見了一些問題,在這里感謝曾經(jīng)幫助過我的**同學。還要感謝我的指導老師***老師,感謝他們對我的悉心的教導。</p><p><b> 參考文獻</b></p><p> [1]陳堅,陳偉.Visual C++網(wǎng)絡高級編程[M].北京:人民郵電出版社,2001.</p>
110、<p> [2]曹衍龍,劉海英.Visual C++網(wǎng)絡通信編程實用案例精選[M].北京:人民郵電出版社,2006.</p><p> [3]曹章元,劉加明.Visual C++6.0類庫大全[M].北京:電子工業(yè)出版社,1999.</p><p> [4]求是科技.Visual C++音視頻編解碼技術及實踐[M].北京:人民郵電出版社,2006.</p>
111、<p> [5][美]JAMSA Kris.C/C++/c*程序員實用大全[M].北京:中國水利水電出版社,2002.</p><p> [6][美]KRUGLINSKI David J.Visual C++技術內幕[M].4版.北京:清華大學出版社,2001.</p><p> [7]王華,葉愛亮.Visual C++6.0編程實例與技巧FM].北京:機械工業(yè)出版社,19
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 音頻網(wǎng)絡傳輸?shù)膶崿F(xiàn)課程設計
- 網(wǎng)絡音頻傳輸系統(tǒng)設計與實現(xiàn).pdf
- 專業(yè)實時音頻網(wǎng)絡傳輸設備的設計與實現(xiàn).pdf
- 高保真網(wǎng)絡音頻傳輸系統(tǒng)的設計與實現(xiàn).pdf
- 綜合程序課程設計--音頻播放程序的設計與實現(xiàn)
- 文件傳輸協(xié)議的設計與實現(xiàn)課程設計
- 嵌入式音頻網(wǎng)絡同步傳輸系統(tǒng)設計與實現(xiàn).pdf
- 網(wǎng)絡程序課程設計---實現(xiàn)網(wǎng)絡對時程序
- 課程設計--基于觸摸的音頻播放系統(tǒng)
- 校園網(wǎng)絡課程設計--小型網(wǎng)絡的設計及實現(xiàn)
- 音頻放大器課程設計
- 視音頻信號處理課程設計
- tcp傳輸程序課程設計
- 計算機網(wǎng)絡課程設計--文件傳輸協(xié)議的簡單設計與實現(xiàn)
- 基于IP的實時音頻網(wǎng)絡傳輸技術研究與實現(xiàn).pdf
- 音頻放大器課程設計
- 網(wǎng)絡嗅探器的設計與實現(xiàn)課程設計
- 網(wǎng)絡課程設計---簡單聊天系統(tǒng)的設計與實現(xiàn)
- 光纖課程設計--通信傳輸系統(tǒng)的設計
- 嵌入式多媒體網(wǎng)絡傳輸系統(tǒng)音頻子系統(tǒng)的設計及實現(xiàn).pdf
評論
0/150
提交評論