日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一种基于局域网的点对点语音通信

發布時間:2024/1/8 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一种基于局域网的点对点语音通信 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
引 言
隨著計算機網絡的日益普及,人們通過網絡進行交流顯得越來越重要,于是出現了一系列語音通信的軟件,比如NetMeeting、IPPhone、MediaRing以及VoxPhone等等,但這些軟件都功能完善、相對獨立,不利于集成到自己開發的軟件中,有時我們也希望將這種語音通信功能集成到自己的軟件中,尤其當一個單位的局域網用戶分散在不同的房間時。本文給出一種靈活、簡單的實現方法,采用基于對話框的方式編程,硬件上只需要一塊雙DMA通道的聲卡(目前的聲卡大多支持雙DMA通道)和一支耳麥,其余全部由軟件編程實現。程序在 Windows98/2000、Visual C++6.0 下編譯通過,在Windows NT 100M 以太網上運行良好。

設計思路

要實現點對點語音通信,原理非常簡單,只要針對一個點實現話音的實時采集、處理、播放,同時能進行可靠的傳送和接收,這樣兩點一連便可通話。對于前者,采用Windows MDK的低層音頻服務比較合適,因為低層音頻服務中的回調機制為我們提供了很大的方便。當應用程序不斷向設備驅動程序提供音頻數據時,設備驅動程序控制音頻設備在后臺完成錄音和放音的具體操作,通過回調機制,我們又可以檢測到什么時候用完一個數據塊,并及時傳送下一個數據塊,從而保證了聲音的連續,有了這種單機上的實時采集、回放功能后,接下來的工作就是在網絡上傳送話音數據。在點對點網絡傳輸方面,選擇面向連接的TCP協議,TCP傳輸協議自動處理分組丟失和交付失序問題,這樣我們不用為這些問題操心,只需很好地利用這個連接,在采集話音回放之前一方面將自己的話音傳給網絡,另一方面接收網絡傳來的話音,這樣便實現了點對點語音通信。其結構框圖如下:



具體實現

一、話音的實時采集、處理、回放
首先要介紹一下Windows低層波形音頻數據塊結構 WAVEHDR,其聲明如下:
type struct{
LPSTR lpData; //指向鎖定的數據緩沖區的指針
DWORD dwBufferLength; //數據緩沖區的大小
DWORD dwByteRecorded; //錄音時指明緩沖區中的數據量
DWORD dwUser; //用戶數據
DWORD dwFlag; //提供緩沖區信息的標志
DWORD dwLoops; //循環播放的次數
struct wavehdr_tag * lpNext; //保留
DWORD reserved; //保留
} WAVEHDR;
聲音的采集和播放都是在操作這個音頻數據塊結構,實際上主要用到的就是第一個成員變量lpData, 所以我們只要在分配緩沖區(內存)的同時相應分配WAVEHDR數據塊結構,然后將緩沖區的指針賦給對應的數據塊結構的成員變量 lpData,這樣當一個緩沖區填滿后,也就是一個音頻數據塊填滿了,通過消息機制就可以在消息函數中進行處理和播放,播放完后又可通過消息函數把緩沖區再送給音頻設備輸入驅動程序,繼續進行采集并播放,當你一次性分配多個緩沖區和數據塊結構并賦給音頻設備輸入驅動程序后,至于把哪個緩沖區填滿,然后再把哪個空緩沖區賦給設備輸入驅動程序,不需人為干預,完全由Windows控制,這就是一種用動態循環緩沖區實現話音的實時采集、播放的簡單而巧妙的辦法。實現步驟:
1.初始化操作

①用waveInGetNumDevs()和waveOutGetNumDevs()查看當前系統波形音頻輸入、輸出設備;
②按11025Hz,16Bit,單聲道,22K/S的格式設置WAVEFORMATEX結構的成員變量,也可以改為其他WAVE格式;
③用waveInOpen(...) 和waveOutOpen(...)分別調用WAVE_FORMAT_QUERY參數查看波形輸入設備是否支持所設定的格式;
④再次用waveInOpen(...) 和waveOutOpen(...)分別調用CALLBACK_WINDOW參數打開波形輸入設備;
⑤分別給音頻數據塊和音頻數據緩沖區分配、鎖定全局內存;
⑥初始化音頻數據塊結構各成員變量,主要是將每個緩沖區指針賦給對應數據塊結構中的緩沖區指針變量lpData;調用waveInPrepareHeader(...)和waveInAddBuffer(...)將音頻數據塊賦給輸入設備驅動程序;
⑦調用waveInStart(...)函數開始錄音。

2.消息操作
錄音開始后,每當有采樣數據填滿數據塊后,設備驅動程序就會發消息MM_WIM_DATA給用戶窗口,相應的消息回調函數OnMmWimData(...)對數據塊中的采樣數據進行處理,然后就可以發送給輸出設備進行回放,每當一個音頻數據塊播放完畢,設備驅動程序又會發出消息MM_WOM_DONE,相應的消息回調函數 OnMmWomDone(...)記錄音頻數據并經必要準備后重新發送給輸入設備,以準備接收后續的采樣數據。這樣,最初為輸入設備準備的音頻數據塊就在消息的控制下,在輸入、輸出設備間循環使用,無需人為控制實現了實時采集、處理和播放。
當結束通話時要關閉音頻輸入設備,這時音頻設備驅動程序會發送MM_WIM_CLOSE消息,可在相應的消息函數OnMmWimClose(..)中清除賦給輸入、輸出設備的音頻數據塊。

二、基于TCP協議的點對點話音傳輸

對于聲音的傳送和接收主要是采用面向連接的TCP協議,并用Windows Socket進行網絡編程實現,但首先要將發送和接收的函數接口放在 OnMmWimData(...)函數中,這樣才能做到采集數據塊填滿后被發送,接收的數據收到后被播放。 Windows Socket對于從事過網絡編程的人來說應該不陌生,因為我們要實現點對點通信,所以得把客戶和服務器模式融合為一種模式,讓服務器可以做客戶,客戶也可以做服務器,從而使雙方都有呼叫對方和接受對方呼叫的能力,這只需增加一個監聽Socket就行了。一旦呼叫連接建立成功,便在兩個點之間建立了一個數據流,即使雙方不講話,每個點也在不停地收、發數據,一方有話音自然就隨著這個數據流傳給了對方,所以關鍵的問題就是怎樣讀取話音數據流,因為TCP提供的流式服務是不保證邊界的,當發送方想一次發送 4000個字節時,調用語句Send(sBuffer,4000),并不能保證一定能發送出4000個字節;同樣,接收方準備一次接收發過來的數據,調用語句Receive(rBuffer,4000),也不能保證一定能接收4000個字節,因此實際一次發送和接收的字節數會是1到4000中的任何一個值,最壞的情況是只有1個字節。相反,如果用Send函數連續發送少量數據,比如一次發送400個字節,連續發送10次,接收方用Receive函數可能一次就把這4000個字節都接收下來了,而為了實現播放,我們希望調用一次發送函數就能把緩沖區大小的話音數據發送出去,調用一次接收函數就能把對方一次發送的話音數據準確接收下來,以便進行播放,所以一種比較簡單實用的辦法,就是利用TCP協議發送數據時為每個數據包加個標志頭:


這個標志頭包含長型(4字節)的話音數據量值和一個標志字符串,程序中可為這兩項標志相應設置偏移量,同時也為話音數據設置偏移量,通過重載OnReceive(...)進行接收。開始接收前,偏移量都置0,接收開始后先檢測是否收到了4 個字節的話音數據量大小值和字符串標志,如果沒有收到,則通過偏移量來控制將它們準確收到,之后校驗字符串標志的正確性,如果兩項標志都正確收到了,則按收到的數據量大小值進行真正的話音數據接收,如果在OnReceive函數中一次調用Receive(...)接收沒有達到這個值,則采用非阻塞模式,調用AsyncSelect(...)函數繼續接收,直至全部收到,這樣重載 OnReceive(...)接收函數后就可以一次接收對方發過來的數據;同理,我們重載CAsyncSocket 的OnSend函數,也可以實現一次發完一個緩沖區中的數據。這樣只要將收發函數的接口放在OnMmWimData(...)函數中,使收和發都產生恒定速率的數據流,從而實現了網絡話音的傳輸和回放。

三、界面及其他功能
界面及其他功能也要做一番設計:
1.設置“查找鄰居"項,可查看誰在網上,用ListBox進行顯示,在ListBox選中一位鄰居,對應的鄰居編輯框中就顯示出該鄰居,便于呼叫,“查找鄰居"主要用到的函數是WnetOpenEnum(...)、WnetEnumResource(...)、 WnetCloseEnum(...)。
2.程序是基于對話框的,運行后不做任何顯示,直接放入系統托盤,直至雙擊托盤圖標或選擇菜單再運行,但可隨時監聽是否有呼叫接入,一旦連接建立立刻開啟話音處理功能。

3.每次運行都在注冊表的RunServicesOnce鍵中寫入或修改NetPhone項,使程序能保持開機就自動運行。
4.加入了調節麥克和耳機音量的功能。
5.為通話對方提供音樂播放,但只支持與采樣格式相同的.wav文件,其他格式的.wav文件可用Windows的錄音機轉換即可。
?

總結

以上是生活随笔為你收集整理的一种基于局域网的点对点语音通信的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 播播开心激情网 | 在线免费不卡视频 | 一本色道久久综合无码人妻 | 国产大片一区二区 | 亚洲粉嫩 | 亚洲毛片在线免费观看 | 一级特黄色大片 | 91插视频| 狗爬女子的视频 | 欧美三级一区二区三区 | 中文字幕人妻丝袜乱一区三区 | 国产中文字幕第一页 | 中国av一区二区 | 男女黄色网 | 欧美污视频在线观看 | 97人妻一区二区精品免费视频 | 日韩欧美激情视频 | 国内视频一区二区三区 | 网站黄在线| 欧美aaa大片 | 国产精品成人一区二区 | 亚洲一区二区精品视频 | 国产一区高清 | 亚洲天堂一区在线观看 | 青草久久网 | 成人免费久久 | 美女被叉叉的影院 | 在线观看亚洲欧美 | 小视频黄色 | 竹菊影视一区二区三区 | 色二区 | 中文字幕第页 | 嫩草国产 | 免费一级片视频 | 亚洲一区二区三区影视 | 亚洲最大在线观看 | 久久久久亚洲av无码专区体验 | 亚洲高清色| 香蕉视频成人在线 | 午夜91视频 | 自由成熟xxxx色视频 | 欧美日韩黄色大片 | 欧美激情在线观看 | 苏晴忘穿内裤坐公交车被揉到视频 | 好吊妞视频在线观看 | 久久精品国产亚洲AV高清综合 | 国产区高清 | 黄视频网站在线看 | 五级毛片 | 福利在线网站 | 伊人成综合 | 视频一区国产精品 | 婷婷视频一区二区三区 | 寂寞少妇让水电工爽hd | 亚洲欧美视频二区 | 日韩欧美精品免费 | 国产在线播| 很很干很很日 | 免费色视频 | 香蕉传媒 | 日韩性视频 | 精品美女 | 国产精品高潮呻吟久久aⅴ码 | 自拍偷拍日韩精品 | 日本黄色美女网站 | 丁香av | 爱情岛论坛永久入址测速 | 在线观看亚洲精品视频 | 特级黄色片 | 日日碰狠狠添天天爽 | 亚洲成人黄 | 野外吮她的花蒂高h在线观看 | 窝窝午夜看片 | 欧美精品一区二区成人 | 激情四射综合网 | 日韩精品免费一区二区三区 | 国产精品久久久久久久免费 | 99国产精品自拍 | 人人妻一区二区三区 | 欧美第一页在线观看 | a少妇| 美脚の诱脚舐め脚视频播放 | 蜜桃臀aⅴ精品一区二区三区 | 日韩经典中文字幕 | 欧美丰满熟妇bbbbbb百度 | 日韩国产欧美一区 | 欧洲精品码一区二区三区免费看 | 影音先锋日韩资源 | 国产一区二区自拍视频 | 日本一区二区三区免费观看 | 亚洲精选av | 亚洲久爱| 中文字幕成人在线观看 | 伊人久艹| 99资源| 2019中文字幕在线视频 | 日日弄天天弄美女bbbb | 小珊的性放荡羞辱日记 | 欧美日韩色 |