基於SIP的嵌入式無線可視電話終端設計與實現

目前,許多國家都採用H.323作爲IP電話網關之間的協議,把IP電話網關作爲電路交換網和IP網絡的接口。但是,在下一代網絡中,由於大量IP 產品的應用,使得端到端必須基於純IP網絡。3GPP已經確定將SIP協議作爲第三代移動通信全IP網絡的控制協議。SIP(Session Initiation Protocol)協議是IETF於1999年提出的一種新的網絡多媒體通信交互信令,它相對於市場主體的H.323協議具有簡單、擴展性好、便於實現等 優點。憑藉這些優點,其得到業界的青睞,逐步成爲NGN和3G多媒體子系統域中的重要協議。市場上出現越來越多支持SIP的智能多媒體終端及相關軟件和軟 交換設備,SIP將成爲IP視頻電話業務的主流協議之一。

  本文以S3C2410爲核心,通過幾個功能模塊的擴展,開發出一個基於 SIP的嵌入式無線視頻電話終端。該終端除了具備數字化和網絡化特點外,還採用了開放的SIP同其他電話設備進行通信,從而將網絡中任何一臺主機變成終 端。同時,基於WIFI的無線網絡技術使得多媒體終端具備隨時部署的特點,並且逐步得到企業的認可。

1 總體方案設計

1.1 硬件系統結構

   本電話終端系統的硬件方案爲:使用三星公司的通用ARM芯片S3C2410配合嵌入式操作系統WINCE5.0.NET實現各種外圍接口,視音頻編解碼 處理和傳輸控制協議等。這樣既不存在芯片成本高的問題,又能保持很高的性能,可通過簡單的程序下載實現軟件升級或增加新的編解碼標準。系統的硬件結構框圖 如圖1所示。實現該系統的要點是:在WINCE下添加USB攝像頭和USB無線網卡驅動模塊。

1.2 系統軟件結構

  系統硬件配置完成後,就需要定製平臺和編寫代碼實現各個功能模塊,最終實現整個系統。系統的軟件結構如圖2所示。

(1)用戶層:用戶的使用層,實現用戶用鍵盤撥號、接聽和掛斷電話等操作。

  (2)接口層:完成兩個功能,一是作爲應用層和傳輸層的接口—建立套接字(SOCKET);二是擁有調用模塊層各個模塊的接口函數。

   (3)模塊層:系統核心層包括:SIP模塊、數據傳輸模塊、語音和視頻模塊。SIP模塊實現OSIP協議棧的3個模塊:解析器、有限狀態機和工具模塊。 數據傳輸模塊中傳輸層使用UDP協議,用RTP/RTCP進行實時傳輸和控制。語音模塊和視頻模塊分別完成語音和視頻的採集與編解碼。

2 無線視頻電話終端的設計與實現

2.1 系統平臺設計

    在WinCE產品開發中,內核定製和應用程序開發是非常重要的工作。

2.2 音頻編碼模塊的實現

    系統初始化以後,音頻採集編碼模塊對應的子線程就被創建並掛起,當用戶需要採集音頻數據時再分別被喚醒。音頻採集編碼模塊主要完成語音的錄製和編碼。首先 打開波形音頻輸入設備,準備好緩衝區,然後利用聲卡把語音錄入到準備好的緩衝區。一個緩衝區錄滿後,就可以對緩衝區中的數據進行編碼。其中音頻採集通過調 用Windows低級音頻API函數族WaveIn和WaveOut來實現。編碼通過調用G.7XX音頻接口提供的編解碼器接口實現。

2.3 視頻採集編碼模塊的實現

    筆者採用了OmniVision公司的OV7650 CMOS VGA 芯片。該芯片是一款高性能圖像壓縮芯片,輸出MJPEG視頻流數據。它的誤差穩定性非常好,可以獲取清晰度很高的視頻圖像,還可以靈活設置各路視頻清晰 度,壓縮幀數。本系統直接從攝像頭驅動中獲取MJPEG視頻流數據,圖像採集流程如圖3所示。圖像採集模塊用到的主要函數有:

 capInitCamera():用來初始化視頻設備,並獲取當前可用的視頻設備數目。

    capSetVideoFormat():設置視頻格式和分辨率。本系統使用的視頻格式爲RGB24,分辨率爲320×240像素。

    capGrabFrame():從驅動中抓取1幀圖像,並存儲在緩存FrameBuffer中。

    capGetLastJpeg():將抓取的MJPEG格式的圖像轉換成JPEG格式,送到無線發送模塊。

    視頻採集部分還有查詢視頻採集格式、設置明暗度、設置對比度等相關函數,這裏不再詳述。在完成視頻採集後,再對視頻流進行MPEG-4的視頻壓縮。視頻編 碼通過調用xvid視頻解碼器接口提供的編解碼器接口實現。音頻解碼回放模塊和視頻解碼回放模塊將接收到的音頻和視頻數據解碼後播放。視頻播放則將視頻數 據格式轉化爲RGB,再用函數DrawDibDraw將其顯示。

2.4 xvid解碼算法在實時傳輸部分的優化

2.4.1 xvid解碼對零係數塊的處理分析

    在解碼過程中,如果知道圖像宏塊/塊爲零係數塊,則可以直接跳過該塊的解碼過程(包括IQ和IDCT過程),從而大大節省解碼的計算量。在MPEG-4編 碼器模型Xvid的程序中看到,在IDCT部分,參數CBP(編碼塊模式)是專門用來指示正在進行編碼和不再進行編碼的宏塊的信息。它是一個6bit的稽 核,每個都代表了一個宏塊的一小塊。bit的狀態表示了該塊是否被編碼。如果塊的所有係數都爲零,則塊就沒有被編碼。這個參數在進行IQ、IDCT、反向 掃描和重建之前被檢驗,這些過程並不對CBP爲零的塊進行。通過CBP解碼過程,在塊的基礎上的所有冗餘計算都被減少了。

    在Xvid解碼程序decoder.c的decoder_mbinter()函數中,最後有如下判斷:

    If(cbp)

    Decoder_mb_decode(dec,cbp,bs,py_cur,pu_cur,pv_cur,reduced_resolution,pMB);

由此說明在參數CBP爲零的情況下是不做宏塊解碼工作的。

    但是這裏可以看出,CBP參數爲零代表的是整個宏塊量化後的DCT係數都爲零,這裏執行的是對整個宏塊後續解碼的跳出工作。而對於整個宏塊量化後的DCT 係數不全爲零,只有幾個8×8的塊量化後的DCT係數爲零的情況下,在decode.c的decoder_mb_decode()函數中有如下過程:

    For(i=0;i<6;i++){

    If(cbp&(1<<(5-i)))){

    Memset(block,0,64*sizeof(int16_t));

    Start_timer();

    Get_inter_block(bs,block,direction);

    Stop_coding_timer();

    …

    Stop_iquant_timer();

    Stop_idct_timer();

    }

    }

    從以上程序看出:由於CBP有6bit,每個bit都代表了一個宏塊中的一個8×8小塊,因此當相應的8×8塊爲零時,就直接跳過對該8×8塊的反向量化和IDCT過程。

2.4.2 xvid解碼中IDCT和IQ的優化

    在IDCT程序中加入判斷語句,把全係數IDCT根據判斷前6個(精確度低一些)或者10個DCT係數的值分別進行0係數IDCT變化(直接賦零)、3係數IDCT變換、64係數IDCT變換,這樣得到的程序計算量比原程序減少很多。

    在這裏用If判斷,如果這10個DCT係數都爲零,則認爲此塊是全0DCT係數,直接令此塊的所有IDCT後的係數爲零。如果前3個係數 block[0]、block[1]、block[8]不全爲零,後7個係數block[2]、block[3]、block[9]、 block[10]、block[16]、block[17]、block[24]全爲零,則認爲此子塊係數是3DCT係數的,直接對其進行3係數的 IDCT(程序已編好)。如果上述兩種都不滿足,就對其進行全係數的IDCT。

    判斷工作在XVID程序的idct.c中進行,在原始的函數idct_int32(short*const block)中加入判斷程序。

    IQ部分的優化思路和IDCT優化類似,不再詳述。

2.5 用戶代理的實現

    SIP UA模塊用於會話的建立、修改、終止,起着信令控制作用。此模塊使用的SIP協議棧是OSIP2和EXOSIP。

    OSIP2協議棧的開發步驟爲:

    (1)初始化:主要調用函數osip_global_init()和osip_init(),操作代碼如下:

    Osip_t*osip;

    if(!osip_global_init())

    Return -1;

    If(!osip_init())

    Return -1;

    Osip棧需要在運行前初始化。在使用Osip棧之前,osip_global_init()函數是第一個被調用的,並且只能調用一次。調用這個函數將初始化語法分析。

    (2)註冊回調函數:包括髮送消息、結束事務、發送失敗和4個狀態機相關的函數。

    (3)建立事務:在註冊完回調函數後,應用可以建立用來調用OSIP的解析器。

    EXOSIP有二種工作模式:事件模式和回調模式。本軟件採用的是事件模式。使用一個定時器,定時到時就通過函數eXosip_wait_event() 去獲取SIP事件,SIP事件主要有EXOSIP_CALL_NEW、EXOSIP_CALL_ANSWERED等。事件獲取後,調用相應的事件處理函 數,如SipCallNew、SipCallRinging、SipCallAnswered等。要建立、修改、終止呼叫還需要調用EXOSIP的 osip_build_initial_invite、eXosip_initiate_call等函數。

2.6 音視頻數據傳輸的實現

    利用RTP/RTCP實現語音視頻流的實時傳輸。RTP負責數據發送和接收,RTCP負責網絡丟包、誤碼情況的反饋等。通過調用JRTPLIB提供的庫函數就可以開發出高質量的音/視頻傳輸程序。

    發送端調用JRTPLIB提供的庫函數實現語音視頻等的實時發送過程爲:(1)通過調用RTPSession類的構造函數創建一個RTP會話實例,然後調 用RTPSession類的方法對其初始化,設置負載類型、標識和時戳增量,以及指定流媒體的目標地址;(2)設置RTP會話參數,通過調用 RTPSessionParams類的SetOwnTimeStampUnit()方法設置時間戳和RTP傳輸參數;(3)通過調用 SendPacket()方法向目標地址發送採集編碼後的音視頻數據。接收端的創建RTP會話實例和RTP會話參數設置與發送端的設置相同。

    本文設計和實現了一個基於SIP的嵌入式網絡無線可視電話終端模型。該終端支持音頻和視頻的實時通信。終端之間採用開放的SIP進行通信,SIP的應用避 免了採用私有協議所帶來的封閉性,提高了同其他設備的互通性;同時利用WiFi技術提高了視頻電話終端的便攜性。SIP協議具有簡單、可擴展的特性,將會 在下一代網絡中佔有重要地位。目前對SIP在視頻電話系統中的應用還處於試驗階段,能與之通信的SIP設備還不多,但隨着NGN平臺的建立和SIP設備的 不斷增多,其靈活性和互通性的優點會逐漸體現出來。支持多人的可視電話終端將是進一步要研究的課題,前景一片光明

發佈了11 篇原創文章 · 獲贊 4 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章