傳統(tǒng)的IP電話是將語音信號轉(zhuǎn)變成數(shù)字信號,進行打包和壓縮,在數(shù)據(jù)網(wǎng)上進行傳輸。但近年來,人們已經(jīng)不滿足于只能聽到語音,還希望能見到對方的圖像。本系統(tǒng)就是針對人們的這一需求,在Intel的PXA255平臺上利用QT/Embedded圖形開發(fā)工具設計的一個IP視頻電話系統(tǒng)。
1 硬件系統(tǒng)結構
整個系統(tǒng)主要是在Intel PXA255評估平臺Sitsang板上實現(xiàn)的。PXA255是基于Intel的Xscale架構的嵌入式處理器,該平臺配備了大量的硬件資源。整個系統(tǒng)的硬件結構如圖1所示。
![]() |
2 軟件系統(tǒng)結構
系統(tǒng)中采用的是基于Qt/Embedded 2.3.10版本的嵌入式圖形庫。該圖形庫是基于Linux系統(tǒng)的Frame Buffer機制的,并使用基于該圖形庫的Qtopia 2.2.1 PDA版本的窗口環(huán)境管理系統(tǒng)。Qt/Embedded是一個完整的自包含GUI和基于Linux的嵌入式平臺開發(fā)工具,是QT的嵌入式開發(fā)版本。
音頻和視頻信號的采集、壓縮、播放和傳輸都是建立在該圖形界面和嵌入式Linux內(nèi)核以上的,所以,在交叉編譯移植嵌入式Linux內(nèi)核時,要正確配置對USB、Video4Linux、攝像頭和音頻設備的支持以及對Frame Buffer機制的支持。交叉編譯嵌入式QT時,要配置使其支持多線程、JPEG算法庫、音頻設備以及qvfb(基于X11的虛擬Frame Buffer機制)。本文主要討論IP視頻電話系統(tǒng)的設計實現(xiàn),故嵌入式Linux內(nèi)核和嵌入式QT的配置編譯過程不再詳述。整個系統(tǒng)的軟件結構如圖2所示。
![]() |
3 系統(tǒng)的具體設計
本IP視頻電話系統(tǒng)主要由音頻采集/播放模塊、視頻采集/播放模塊和網(wǎng)絡傳輸模塊組成。音頻和視頻模塊采樣本地數(shù)據(jù),壓縮處理后交給網(wǎng)絡傳輸模塊,由其發(fā)送到另一對話端,并從網(wǎng)絡傳輸模塊接收對方的音頻和視頻數(shù)據(jù)處理后進行播放。
3.1 網(wǎng)絡傳輸模塊設計
系統(tǒng)啟動后,本地服務器端即對5000端口進行監(jiān)聽。若有IP電話連接進來,則接受連接,為其分配套接字資源,并根據(jù)通話類型,生成相應的音頻、視頻類實例來處理相應的音頻、視頻數(shù)據(jù)。系統(tǒng)可以實現(xiàn)視頻通話,也可以只進行語音通話,即實現(xiàn)傳統(tǒng)IP電話的功能,因為音頻、視頻數(shù)據(jù)格式不同,需要分別做不同的處理,故采用兩個不同的套接字來進行處理,網(wǎng)絡傳輸模塊服務器端的基本流程如圖3所示。
![]() |
本地網(wǎng)絡服務器端用從QServerSocket類繼承的子類IPphoneServer實現(xiàn)。QT/Embedded類庫已經(jīng)對網(wǎng)絡操作進行了很好的封裝,所以系統(tǒng)只利用QT的信號和槽機制,給IPphoneServer類增加一個新的信號--VoidnewConnect(int)。信號所帶的參數(shù)為套接字號,并重載了QServerSocket的虛子函數(shù)成員void newConnect(intsocket)。一旦發(fā)現(xiàn)有新的連接,它將把服務器端給新連接指定的接收套接字號(int socket)通過信號newConnect(int)發(fā)送出來,以便主程序設置對應的數(shù)據(jù)處理套接字。
在系統(tǒng)主程序中啟動服務器,并將服務器實例的newConnect(int)信號連接到主程序的newConnect(int)槽函數(shù)上。一旦來了新的連接,server的newConnect(int)被發(fā)出,則由主程序的newConnect(int)槽函數(shù)接收套接字號并判斷是音頻還是視頻連接后,將其指定給相應的音頻或視頻數(shù)據(jù)傳輸套接字,啟動服務器的代碼如下:
server=new IPphoneServer((tPort->text()).toUShort());connect(server,SIGNAL(newConnect(int)),SLOT(new-Connect(int)));
具體與音頻/視頻模塊相關連進行數(shù)據(jù)傳輸?shù)奶捉幼謴腝Socket類繼承來的子類IPPDataSock實現(xiàn),它增加了一個新的QDataStream類指針成員變量ds來進行數(shù)據(jù)的傳輸處理,在IPPDataSock的構造函數(shù)中被實例化。
為音頻和視頻進行數(shù)據(jù)傳輸?shù)奶捉幼謱嵗謩e為aDataSock和vDataSock。若從已方發(fā)起連接,先通過QT的信號和槽機制設定相應的套接字連接、關閉和其他處理槽函數(shù),再使用connectToHost()函數(shù)連接到遠端服務器即可。音頻套接字實例化代碼如下:
aDataSock=new IPPDataSock(this); connect(aDataSock,SIGNAL(connected()),SLOT(tConnected())); connect(aDataSock,SIGNAL(connectionClosed()),SLOT(tClosed())); connect(aDataSock,SIGNAL(readyRead()),IPAudio,SLOT(canPlay())); connect(aDataSock,SIGNAL(error(int)),SLOT(tError(int))); aDataSock->connectToHost(tServer->text(),(tPort->text()).toUShort());
3.2 音頻采集/播放模塊設計
音頻采集/播放模塊主要是實現(xiàn)IP電話的音頻處理,由自定義類IPAudio來實現(xiàn),因為系統(tǒng)要同時發(fā)送本地音頻數(shù)據(jù)給對話端并接收來自對話端的音頻數(shù)據(jù)在本地播放,而只有一個音頻編解碼設備,所以音頻設備必須以全雙工方式工作,音頻采集/播放模塊的主要工作流程如圖4所示。








