蘇育挺,金富玉,張承乾
(天津大學 電子信息工程學院,天津 300072)
隨著因特網的飛速發展,基于網絡的即時通信工具已從早期的消息聊天逐漸發展成為具備音視頻聊天功能的綜合應用程序。目前已經實現的音視頻通信方式主要包括點對點視頻通信、視頻會議系統、語音電話等,其傳輸服務質量的優劣已成為衡量即時通信系統整體性能的一個關鍵性指標。
在現有的即時通信系統中,實現音視頻通信的核心組件包括音視頻處理框架和即時通信協議兩個部分。音視處理框架集成了音視頻采集、音視頻編解碼、音視頻分流控制、音視頻數據流網絡擁塞控制等技術模塊,能夠完成音視頻數據流的采集、編碼、分流等基本處理流程;即時通信協議則負責為音視頻數據協商傳輸通道,并且在協商好的傳輸通道上建立對應的連接,從而為音視頻數據的順暢傳輸提供保障。
即時通信協議是進行即時通信必須遵循的信息規范,主要負責完成用戶信息傳輸通道協商,客戶端與服務器通信信令傳輸控制等任務。XMPP是主流即時通信協議之一,是基于可擴展標記語言(XML)的協議,其繼承了在XML的高可擴展性,可以通過發送擴展的信息來處理用戶需求。目前最常用的即時通信協議體系主要是SIP和XMPP協議體系,兩者都可以完成音視頻通信功能。另外,一些商業公司自行開發私有的即時通信協議實現了相對封閉的通信環境,例如QQ和MSN。
XMPP協議是個總稱,包括核心協議,擴展協議等。核心協議只規定了很小、很基本的一些功能,大部分功能都是在擴展協議中規定的。實際上,XMPP協議只是作為協商協議應用,真正的P2P連接和實時通信是通過其擴展協議實現的。Jingle就是典型的擴展協議案例。
Jingle[6]是Google開發的XMPP協議上的擴展,其解決了在XMPP協議體系下點對點的P2P連接問題。Jingle協議提供了多種傳輸方式用于數據傳輸,而針對多媒體數據的最為常見的模式是兩種UDP傳輸方式。一種傳輸模型是RAWUDP[9],RAWUDP是在UDP協議上發送媒體數據包的傳輸通道模型,可以實現在同一局域網下的P2P連接,沒有網絡穿越功能,無法實現遠程通信;另一種模型則是功能更為強大的 ICE-UDP[8],ICE-UDP 也是在 UDP協議上發送媒體數據包,并且可以實現具有防火墻的網絡穿越和ICE連接性檢查,實現遠程通信。ICE是標準的建立P2P連接性檢查的協議,其自身不能獨立工作,必需在信號通道的協調下建立連接,而XMPP協議就可以作為ICE通道協商的協議標準。
基于Jingle/XMPP協議實現的即時通信框圖如圖1所示。Jingle通過XMPP完成P2P通道的協商任務,同時通過Jingle協議建立P2P通道并進行連接性檢查,然后建立并完成RTP會話,從而完成音視頻通信。如果選擇ICE-UDP通道傳輸模型進行RTP視頻數據傳輸,XMPP服務器可以使用STUN[2]服務器收集用戶的地址,包括NAT[3]后面的私有地址以及NAT與互聯網連接的公共地址,并且以此為基礎建立映射機制,完成會話參與者跟具體的網絡地址間的轉換和NAT穿越。

圖1 Jingle/XMPP通信NAT穿越
即時通信系統中的音視頻處理框架主要為用戶提供一組多媒體數據處理的接口,用戶可以用這些接口實現從多媒體采集卡上獲得數據,進行壓縮編碼、格式轉換、數據封包等一系列操作,從而完成多媒體的實時處理傳輸功能,大大簡化多媒體處理的復雜性。目前具有二次開發功能的音視頻處理框架包括Gstreamer,Directshow,Opencore等。其中DirectShow是微軟公司在ActiveMovie和Video for Windows基礎上推出的基于COM的流媒體處理開發包。運用DirectShow可以很方便地從支持Windows驅動模型的采集卡上捕獲數據,并進行相應的后期處理乃至存儲到文件中。OpenCore則是手機操作系統Android的多媒體核心,OpenCore的代碼非常龐大,是一個基于C++的實現,定義了全功能的操作系統移植層,各種基本的功能均被封裝成類的形式,各層次之間的接口多使用繼承等方式。而基于Linux平臺的GStreamer則是完全開源的多媒體框架庫,利用其可以構建一系列媒體處理模塊,包括從簡單的Ogg播放功能到復雜的音頻混音和視頻非線性編輯處理。Gstreamer應用非常廣泛,大多數手機平臺及個人電腦Linux平臺均采用Gstreamer進行音視頻處理開發。
Gstreamer通過其模塊化設計理念,更加便于構建流媒體應用程序。它將各個模塊封裝起來,以元件的形式提供給用戶使用。用戶可以利用庫中原有的元件進行應用程序的編程,同樣也可以編寫元件,然后插入到庫中,以便日后調用時使用。如果只利用庫中的元件來實現特定功能,只需要采用模塊化的方式編寫應用程序[4]。Gstreamer實現局域網內簡單多媒體音視頻傳輸發送端的框圖如圖2所示。對于視頻數據流,Gstreamer在發送端將攝像頭(v4l2src1)采集的數據依次經過色度空間轉換(ffmpegcsp1)、H263 視頻編碼(ffenc_h263p1)、RTP[1]載荷頭添加(rtph263ppay1),在gstrtpbin中實現實時傳輸協議(RTP)和實時傳輸控制協議(RTCP)數據包整合,并添加發送報告的背景時鐘時間戳,便于在接受端進行音視頻同步播放,然后發到UDP端口(udpsink)。在接收端,從UDP端口截獲的數據依次經過 RTP和RTCP數據包解析、RTP載荷頭解碼、H263解碼器解碼視頻數據、色度空間轉換,最后經過視頻顯示插件顯示到窗口中。其中gstrtpbin是進行RTP會話管理的核心組件,可以完成RTP數據包傳輸控制、RTCP數據包生成、沖突檢測、音視頻分流等任務。

圖2 Gstreamer音視頻通信發送端
通過Gstreamer開發庫中的基礎元件可以完成音視頻處理的功能,并且可以進行簡單的局域網內視頻通信。但是,在視頻會議等復雜應用中經常包含多個多媒體會話,而且多媒體會話之間的協調非常復雜,需要通過更為高層的處理框架來實現會話管理的功能。Farsight是以Gstreamer為基礎開發的視頻會議框架,它能夠提供一套完整的為多媒體流協議編寫插件的應用程序接口,同時還為用戶提供API調用這些插件。即時通信應用程序可以使用Farsight進行音視頻會議,而無須擔心底層的數據流和NAT穿越的問題。因為Farsight[5]是以Gstreamer為基礎進行開發,所以開發新的元件能夠和已有的Gstreamer元件整合,實現完成視頻會議功能的多媒體框架。Farsight可以包含多路音視頻會話流,包含多個會話參與者,具有強大的音視頻會話管理功能。它通過模塊化設計為許多即時通信軟件提供音視頻會議的服務,大大擴展了多媒體處理的功能,并且可以實現更為強大的視頻會議功能。目前很多即時通信客戶端軟件都采用Farsight完成音視頻通信。本文以Gstreamer/Farsight音視頻處理框架為重點,詳述其內部結構及功能實現。
Farsight中包括4個核心概念:會議(Conference)、會話(Session)、參與者(Participant)、流(Stream)。會話參與者是指多媒體數據源,可以是音頻或視頻等;會話則代表一路音頻或視頻會話,通常有一個媒體類型和一個輸出端;會議則代表一個多媒體會議,可以包含多路會話,并且完成多路會話的協調管理;當參與者加入到會話中,就將多媒體數據引入會話中,使得數據能夠流動,從而構成數據流。另外,Farsight實現了網絡層的抽象,即將網絡抽象為一個發射器對象,當數據流被創建時就會建立發射器對象,然后通過設置發射器參數確定發送的目的地址。實際上,Farsight并沒有參與多媒體數據的采集和打包工作,它只是為多媒體數據流傳輸到網絡端進行發送提供了一個通道,并且對通道進行協調管理,保證不同的會話參與者與其特定的數據流綁定以防止收發混淆。
Farsight實現RTP視頻會議的結構如圖3所示,其中FsRTPConference是Farsight框架下的一種插件,主要的RTP會話管理功能都在這個組件中實現。FsRTPConference中可以同時存在多路FsSession,每一路FsSession因參與者或音媒體源的不同代表不同的多媒體會話。編解碼器在雙方建立連接前無法確定,只有當通信雙方的客戶端協商之后,才會根據具體的編解碼器名字調用并進行插件的連接。Farsight通過將gstrtpbin封裝到FsRTPConference中,添加一些其他的必要組件,實現RTP會話。RTP管理器主要由gstrtpbin負責完成RTP會話管理的操作。在發送端,視頻源和音頻源通過Sink接入到會話中,編解碼器協商成功后,將編碼器與數據源和過濾元件連接,然后通過RTP混合器將音視頻數據發送到RTP管理器中,完成RTCP數據包的生成以及RTP會話的管理。最后,經過數據發射器將數據發送到相應的數據通道中。在接收端,數據流同樣要經過類似的信息解碼過程得到音視頻數據。

圖3 Farsight視頻會議框架
在發送端,數據發射器在Farsight中通常有多種插件選擇,例如多播UDP插件、Libnice插件等,目的是為了實現底層數據傳輸的連接性檢查。Libnice是實現了ICE和STUN協議規范的軟件庫,開發者以此為基礎完成nice插件,可以實現基于ICE的數據發送。但是Libnice中只定義了如何在P2P連接確立后進行連接性檢查,以及如何在確定的P2P連接上進行數據傳輸的網絡穿越,并沒有定義如何進行P2P連接,即P2P通道的協商任務。Jingle協議規范則定義了P2P通道建立連接及通道協商的任務。目前,Jingle協議已經在Libpurple(多協議會話開發庫)中實現。
為了開發的便捷,Pidgin軟件的開發者將負責通信部分與圖形用戶界面部分分開,分離出來的核心代碼構成即時通信客戶端開發的核心部分,被稱為Libpurple。這個程序庫已被Adium與Proteus這些客戶端使用。完成分離后,開發者將有可能以各自的圖形程序庫編寫自己的客戶端接口。
在Libpurple中,為實現多媒體通信,開發者將基于Farsight的多媒體處理框架進行繼承和封裝,實現即時通信協議,并提供接口供用戶使用,用戶可利用應用程序接口編寫程序實現網絡層的連接。使用者可以使用Libpurple直接編寫即時通信程序的核心代碼,并構建應用程序。同時,Libpurple實現了許多即時通信協議的通信,例如MSN,XMPP,AIM等協議,同時完成了媒體后端流處理與相應即時通信協議的協同工作。
Libpurple在Farsight的基礎上進行開發,實現了一套具備自身特點的流媒體模式。通過對Lipurple庫的理解分析[10],得到了Libpurple實現音視頻數據流控制及會話管理的方法,如圖4所示。

圖4 Libpurple音視頻通信模式
圖4中Src是音視頻數據源,傳輸到FsSession進行音視頻流整合、RTCP包生成、數據流管理等操作。Volume和level則分別表示音頻的音量與消息控制插件。Libpurple采用FsSession做會話管理,并在FsSession的基礎上添加Gstreamer基礎元件進行控制,完成自己需要的功能。FsSession通過選擇不同的連接通道,將音視頻數據流通過發送器進行發送。Libpurple中實現了Jingle協議進行RTP通信的規范,并提供兩種數據通道,RAWUDP和ICEUDP供用戶使用。在進行具體RTP視頻通信時,程序根據不同情況選擇不同的通道使用。圖4選擇RAWUDP作為數據發送通道,用戶也可以選擇其他通道進行數據發送。為了與Jingle協議合作完成音視頻通信,Libpurple建立了一個組件對象purplemedia,這個對象在Farsight組件中提取相關的參數信息,例如編解碼器信息、發送目的地址等,并傳遞給Jingle協議,便于Jingle協議進行通道協商。當有新的即時通信協議需要利用Farsight完成視頻通信時,開發者往往需要以Libpurple為基礎進行開發,完成即時通信協議在Libpurple上的移植,以實現視頻通信。
在眾多采用Libpurple庫開發的即時通信軟件客戶端中,Pidgin是最成功的,也是少數幾個可以實現音視頻通信的案例。Pidgin是一款支持多協議客戶端的圖形化即時通信應用程序,它可以使用AIM,Jabber,MSN,Yahoo等即時通信軟件的帳號進行登錄。并采用Libpurple作為開發庫,利用圖形開發工具包編寫用戶界面及各種事件提醒和任務管理,從而實現在多種即時通信協議基礎上的音視頻通信。
目前,即時通信系統層出不窮,相比于諸如Skype、騰訊等商業公司開發的即時通信系統框架,具有開源特性的即時通信開發模式發展更加快速,技術更新更加頻繁,能夠為用戶提供更為豐富和個性化的應用模式,因此更受到研發人員的關注。而以Farsight/Gstreamer音視頻處理框架為代表的通用音視頻處理框架,為音視頻處理在即時通信環境下的實現提供了有力的技術基礎,使音視頻通信變得非常簡單,并且大大擴展了多媒體通信的功能。在Linux環境下實現音視頻通信的客戶端軟件有限,其中通信效果最好的Pidgin和Empathy均采用Gstreamer/Farsight作為其開發音視頻功能的基本庫,通過Jingle/XMPP等協議實現連接,完成音視頻通信。因此,充分了解即時通信系統后端音視頻處理的技術,將為研究人員開發音視頻通信系統提供非常大的幫助。
[1] SCHULZRINNE H,CASNER S,FREDERICK R.RFC3550-RTP:A transport protocol for real-time applications[S].2003.
[2] ROSENBERG J,MAHY R,MATTHEWS P.RFC5389:Session traversal utilities for NAT(STUN)[S].2008.
[3]ROSENBERG J.RFC5245:a protocol for network address translator(NAT)traversal for offer/answer protocols[S].2010.
[4] TAYMANS W,BAKER S,WINGO A,et al.Gstreamer application development[M/OL].[2011-06-18].http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/index.html.
[5] CRETE O.Audio/video communications framework[EB/OL].[2011-06-18].http://www.freedesktop.org/wiki/Software/Farstream.
[6] LUDWIG S,BEDA J,SAINT-ANDRE P,et al.Jingle[EB/OL].(2009-12-23)[2011-06-18].http://www.xmpp.org/extensions/xep-0166.html.
[7] LUDWIG S,SAINT-ANDRE P,EGAN S,et al.Jingle RTP sessions[EB/OL].(2009-12-23)[2011-06-18].http://www.xmpp.org/extensions/xep-0167.html.
[8] BEDA J,LUDWIG S,SAINT-ANDRE P,et al.Jingle ICE-UDP transport method[EB/OL].(2009-06-10)[2011-06-18].http://www.xmpp.org/extensions/xep-0176.html.
[9] BEDA J,SAINT-ANDRE P,LUDWIG S,et al.Jingle raw UDP transport method[EB/OL].(2009-12-23)[2011-06-18].http://www.xmpp.org/extensions/xep-0177.html.
[10] ATALLAH D,AURICH P,BAILEY J,et al.Farsight2 backend for media API[CP/OL].[2011-06-18].http://pidgin.sourcearchive.com/documentation/1:2.7.3-1ubuntu1/backend-fs2_8h.html.