蘇育挺,金富玉,張承乾
(天津大學 電子信息工程學院,天津 300072)
隨著因特網(wǎng)的飛速發(fā)展,基于網(wǎng)絡的即時通信工具已從早期的消息聊天逐漸發(fā)展成為具備音視頻聊天功能的綜合應用程序。目前已經(jīng)實現(xiàn)的音視頻通信方式主要包括點對點視頻通信、視頻會議系統(tǒng)、語音電話等,其傳輸服務質量的優(yōu)劣已成為衡量即時通信系統(tǒng)整體性能的一個關鍵性指標。
在現(xiàn)有的即時通信系統(tǒng)中,實現(xiàn)音視頻通信的核心組件包括音視頻處理框架和即時通信協(xié)議兩個部分。音視處理框架集成了音視頻采集、音視頻編解碼、音視頻分流控制、音視頻數(shù)據(jù)流網(wǎng)絡擁塞控制等技術模塊,能夠完成音視頻數(shù)據(jù)流的采集、編碼、分流等基本處理流程;即時通信協(xié)議則負責為音視頻數(shù)據(jù)協(xié)商傳輸通道,并且在協(xié)商好的傳輸通道上建立對應的連接,從而為音視頻數(shù)據(jù)的順暢傳輸提供保障。
即時通信協(xié)議是進行即時通信必須遵循的信息規(guī)范,主要負責完成用戶信息傳輸通道協(xié)商,客戶端與服務器通信信令傳輸控制等任務。XMPP是主流即時通信協(xié)議之一,是基于可擴展標記語言(XML)的協(xié)議,其繼承了在XML的高可擴展性,可以通過發(fā)送擴展的信息來處理用戶需求。目前最常用的即時通信協(xié)議體系主要是SIP和XMPP協(xié)議體系,兩者都可以完成音視頻通信功能。另外,一些商業(yè)公司自行開發(fā)私有的即時通信協(xié)議實現(xiàn)了相對封閉的通信環(huán)境,例如QQ和MSN。
XMPP協(xié)議是個總稱,包括核心協(xié)議,擴展協(xié)議等。核心協(xié)議只規(guī)定了很小、很基本的一些功能,大部分功能都是在擴展協(xié)議中規(guī)定的。實際上,XMPP協(xié)議只是作為協(xié)商協(xié)議應用,真正的P2P連接和實時通信是通過其擴展協(xié)議實現(xiàn)的。Jingle就是典型的擴展協(xié)議案例。
Jingle[6]是Google開發(fā)的XMPP協(xié)議上的擴展,其解決了在XMPP協(xié)議體系下點對點的P2P連接問題。Jingle協(xié)議提供了多種傳輸方式用于數(shù)據(jù)傳輸,而針對多媒體數(shù)據(jù)的最為常見的模式是兩種UDP傳輸方式。一種傳輸模型是RAWUDP[9],RAWUDP是在UDP協(xié)議上發(fā)送媒體數(shù)據(jù)包的傳輸通道模型,可以實現(xiàn)在同一局域網(wǎng)下的P2P連接,沒有網(wǎng)絡穿越功能,無法實現(xiàn)遠程通信;另一種模型則是功能更為強大的 ICE-UDP[8],ICE-UDP 也是在 UDP協(xié)議上發(fā)送媒體數(shù)據(jù)包,并且可以實現(xiàn)具有防火墻的網(wǎng)絡穿越和ICE連接性檢查,實現(xiàn)遠程通信。ICE是標準的建立P2P連接性檢查的協(xié)議,其自身不能獨立工作,必需在信號通道的協(xié)調下建立連接,而XMPP協(xié)議就可以作為ICE通道協(xié)商的協(xié)議標準。
基于Jingle/XMPP協(xié)議實現(xiàn)的即時通信框圖如圖1所示。Jingle通過XMPP完成P2P通道的協(xié)商任務,同時通過Jingle協(xié)議建立P2P通道并進行連接性檢查,然后建立并完成RTP會話,從而完成音視頻通信。如果選擇ICE-UDP通道傳輸模型進行RTP視頻數(shù)據(jù)傳輸,XMPP服務器可以使用STUN[2]服務器收集用戶的地址,包括NAT[3]后面的私有地址以及NAT與互聯(lián)網(wǎng)連接的公共地址,并且以此為基礎建立映射機制,完成會話參與者跟具體的網(wǎng)絡地址間的轉換和NAT穿越。
圖1 Jingle/XMPP通信NAT穿越
即時通信系統(tǒng)中的音視頻處理框架主要為用戶提供一組多媒體數(shù)據(jù)處理的接口,用戶可以用這些接口實現(xiàn)從多媒體采集卡上獲得數(shù)據(jù),進行壓縮編碼、格式轉換、數(shù)據(jù)封包等一系列操作,從而完成多媒體的實時處理傳輸功能,大大簡化多媒體處理的復雜性。目前具有二次開發(fā)功能的音視頻處理框架包括Gstreamer,Directshow,Opencore等。其中DirectShow是微軟公司在ActiveMovie和Video for Windows基礎上推出的基于COM的流媒體處理開發(fā)包。運用DirectShow可以很方便地從支持Windows驅動模型的采集卡上捕獲數(shù)據(jù),并進行相應的后期處理乃至存儲到文件中。OpenCore則是手機操作系統(tǒng)Android的多媒體核心,OpenCore的代碼非常龐大,是一個基于C++的實現(xiàn),定義了全功能的操作系統(tǒng)移植層,各種基本的功能均被封裝成類的形式,各層次之間的接口多使用繼承等方式。而基于Linux平臺的GStreamer則是完全開源的多媒體框架庫,利用其可以構建一系列媒體處理模塊,包括從簡單的Ogg播放功能到復雜的音頻混音和視頻非線性編輯處理。Gstreamer應用非常廣泛,大多數(shù)手機平臺及個人電腦Linux平臺均采用Gstreamer進行音視頻處理開發(fā)。
Gstreamer通過其模塊化設計理念,更加便于構建流媒體應用程序。它將各個模塊封裝起來,以元件的形式提供給用戶使用。用戶可以利用庫中原有的元件進行應用程序的編程,同樣也可以編寫元件,然后插入到庫中,以便日后調用時使用。如果只利用庫中的元件來實現(xiàn)特定功能,只需要采用模塊化的方式編寫應用程序[4]。Gstreamer實現(xiàn)局域網(wǎng)內簡單多媒體音視頻傳輸發(fā)送端的框圖如圖2所示。對于視頻數(shù)據(jù)流,Gstreamer在發(fā)送端將攝像頭(v4l2src1)采集的數(shù)據(jù)依次經(jīng)過色度空間轉換(ffmpegcsp1)、H263 視頻編碼(ffenc_h263p1)、RTP[1]載荷頭添加(rtph263ppay1),在gstrtpbin中實現(xiàn)實時傳輸協(xié)議(RTP)和實時傳輸控制協(xié)議(RTCP)數(shù)據(jù)包整合,并添加發(fā)送報告的背景時鐘時間戳,便于在接受端進行音視頻同步播放,然后發(fā)到UDP端口(udpsink)。在接收端,從UDP端口截獲的數(shù)據(jù)依次經(jīng)過 RTP和RTCP數(shù)據(jù)包解析、RTP載荷頭解碼、H263解碼器解碼視頻數(shù)據(jù)、色度空間轉換,最后經(jīng)過視頻顯示插件顯示到窗口中。其中gstrtpbin是進行RTP會話管理的核心組件,可以完成RTP數(shù)據(jù)包傳輸控制、RTCP數(shù)據(jù)包生成、沖突檢測、音視頻分流等任務。
圖2 Gstreamer音視頻通信發(fā)送端
通過Gstreamer開發(fā)庫中的基礎元件可以完成音視頻處理的功能,并且可以進行簡單的局域網(wǎng)內視頻通信。但是,在視頻會議等復雜應用中經(jīng)常包含多個多媒體會話,而且多媒體會話之間的協(xié)調非常復雜,需要通過更為高層的處理框架來實現(xiàn)會話管理的功能。Farsight是以Gstreamer為基礎開發(fā)的視頻會議框架,它能夠提供一套完整的為多媒體流協(xié)議編寫插件的應用程序接口,同時還為用戶提供API調用這些插件。即時通信應用程序可以使用Farsight進行音視頻會議,而無須擔心底層的數(shù)據(jù)流和NAT穿越的問題。因為Farsight[5]是以Gstreamer為基礎進行開發(fā),所以開發(fā)新的元件能夠和已有的Gstreamer元件整合,實現(xiàn)完成視頻會議功能的多媒體框架。Farsight可以包含多路音視頻會話流,包含多個會話參與者,具有強大的音視頻會話管理功能。它通過模塊化設計為許多即時通信軟件提供音視頻會議的服務,大大擴展了多媒體處理的功能,并且可以實現(xiàn)更為強大的視頻會議功能。目前很多即時通信客戶端軟件都采用Farsight完成音視頻通信。本文以Gstreamer/Farsight音視頻處理框架為重點,詳述其內部結構及功能實現(xiàn)。
Farsight中包括4個核心概念:會議(Conference)、會話(Session)、參與者(Participant)、流(Stream)。會話參與者是指多媒體數(shù)據(jù)源,可以是音頻或視頻等;會話則代表一路音頻或視頻會話,通常有一個媒體類型和一個輸出端;會議則代表一個多媒體會議,可以包含多路會話,并且完成多路會話的協(xié)調管理;當參與者加入到會話中,就將多媒體數(shù)據(jù)引入會話中,使得數(shù)據(jù)能夠流動,從而構成數(shù)據(jù)流。另外,F(xiàn)arsight實現(xiàn)了網(wǎng)絡層的抽象,即將網(wǎng)絡抽象為一個發(fā)射器對象,當數(shù)據(jù)流被創(chuàng)建時就會建立發(fā)射器對象,然后通過設置發(fā)射器參數(shù)確定發(fā)送的目的地址。實際上,F(xiàn)arsight并沒有參與多媒體數(shù)據(jù)的采集和打包工作,它只是為多媒體數(shù)據(jù)流傳輸?shù)骄W(wǎng)絡端進行發(fā)送提供了一個通道,并且對通道進行協(xié)調管理,保證不同的會話參與者與其特定的數(shù)據(jù)流綁定以防止收發(fā)混淆。
Farsight實現(xiàn)RTP視頻會議的結構如圖3所示,其中FsRTPConference是Farsight框架下的一種插件,主要的RTP會話管理功能都在這個組件中實現(xiàn)。FsRTPConference中可以同時存在多路FsSession,每一路FsSession因參與者或音媒體源的不同代表不同的多媒體會話。編解碼器在雙方建立連接前無法確定,只有當通信雙方的客戶端協(xié)商之后,才會根據(jù)具體的編解碼器名字調用并進行插件的連接。Farsight通過將gstrtpbin封裝到FsRTPConference中,添加一些其他的必要組件,實現(xiàn)RTP會話。RTP管理器主要由gstrtpbin負責完成RTP會話管理的操作。在發(fā)送端,視頻源和音頻源通過Sink接入到會話中,編解碼器協(xié)商成功后,將編碼器與數(shù)據(jù)源和過濾元件連接,然后通過RTP混合器將音視頻數(shù)據(jù)發(fā)送到RTP管理器中,完成RTCP數(shù)據(jù)包的生成以及RTP會話的管理。最后,經(jīng)過數(shù)據(jù)發(fā)射器將數(shù)據(jù)發(fā)送到相應的數(shù)據(jù)通道中。在接收端,數(shù)據(jù)流同樣要經(jīng)過類似的信息解碼過程得到音視頻數(shù)據(jù)。
圖3 Farsight視頻會議框架
在發(fā)送端,數(shù)據(jù)發(fā)射器在Farsight中通常有多種插件選擇,例如多播UDP插件、Libnice插件等,目的是為了實現(xiàn)底層數(shù)據(jù)傳輸?shù)倪B接性檢查。Libnice是實現(xiàn)了ICE和STUN協(xié)議規(guī)范的軟件庫,開發(fā)者以此為基礎完成nice插件,可以實現(xiàn)基于ICE的數(shù)據(jù)發(fā)送。但是Libnice中只定義了如何在P2P連接確立后進行連接性檢查,以及如何在確定的P2P連接上進行數(shù)據(jù)傳輸?shù)木W(wǎng)絡穿越,并沒有定義如何進行P2P連接,即P2P通道的協(xié)商任務。Jingle協(xié)議規(guī)范則定義了P2P通道建立連接及通道協(xié)商的任務。目前,Jingle協(xié)議已經(jīng)在Libpurple(多協(xié)議會話開發(fā)庫)中實現(xiàn)。
為了開發(fā)的便捷,Pidgin軟件的開發(fā)者將負責通信部分與圖形用戶界面部分分開,分離出來的核心代碼構成即時通信客戶端開發(fā)的核心部分,被稱為Libpurple。這個程序庫已被Adium與Proteus這些客戶端使用。完成分離后,開發(fā)者將有可能以各自的圖形程序庫編寫自己的客戶端接口。
在Libpurple中,為實現(xiàn)多媒體通信,開發(fā)者將基于Farsight的多媒體處理框架進行繼承和封裝,實現(xiàn)即時通信協(xié)議,并提供接口供用戶使用,用戶可利用應用程序接口編寫程序實現(xiàn)網(wǎng)絡層的連接。使用者可以使用Libpurple直接編寫即時通信程序的核心代碼,并構建應用程序。同時,Libpurple實現(xiàn)了許多即時通信協(xié)議的通信,例如MSN,XMPP,AIM等協(xié)議,同時完成了媒體后端流處理與相應即時通信協(xié)議的協(xié)同工作。
Libpurple在Farsight的基礎上進行開發(fā),實現(xiàn)了一套具備自身特點的流媒體模式。通過對Lipurple庫的理解分析[10],得到了Libpurple實現(xiàn)音視頻數(shù)據(jù)流控制及會話管理的方法,如圖4所示。
圖4 Libpurple音視頻通信模式
圖4中Src是音視頻數(shù)據(jù)源,傳輸?shù)紽sSession進行音視頻流整合、RTCP包生成、數(shù)據(jù)流管理等操作。Volume和level則分別表示音頻的音量與消息控制插件。Libpurple采用FsSession做會話管理,并在FsSession的基礎上添加Gstreamer基礎元件進行控制,完成自己需要的功能。FsSession通過選擇不同的連接通道,將音視頻數(shù)據(jù)流通過發(fā)送器進行發(fā)送。Libpurple中實現(xiàn)了Jingle協(xié)議進行RTP通信的規(guī)范,并提供兩種數(shù)據(jù)通道,RAWUDP和ICEUDP供用戶使用。在進行具體RTP視頻通信時,程序根據(jù)不同情況選擇不同的通道使用。圖4選擇RAWUDP作為數(shù)據(jù)發(fā)送通道,用戶也可以選擇其他通道進行數(shù)據(jù)發(fā)送。為了與Jingle協(xié)議合作完成音視頻通信,Libpurple建立了一個組件對象purplemedia,這個對象在Farsight組件中提取相關的參數(shù)信息,例如編解碼器信息、發(fā)送目的地址等,并傳遞給Jingle協(xié)議,便于Jingle協(xié)議進行通道協(xié)商。當有新的即時通信協(xié)議需要利用Farsight完成視頻通信時,開發(fā)者往往需要以Libpurple為基礎進行開發(fā),完成即時通信協(xié)議在Libpurple上的移植,以實現(xiàn)視頻通信。
在眾多采用Libpurple庫開發(fā)的即時通信軟件客戶端中,Pidgin是最成功的,也是少數(shù)幾個可以實現(xiàn)音視頻通信的案例。Pidgin是一款支持多協(xié)議客戶端的圖形化即時通信應用程序,它可以使用AIM,Jabber,MSN,Yahoo等即時通信軟件的帳號進行登錄。并采用Libpurple作為開發(fā)庫,利用圖形開發(fā)工具包編寫用戶界面及各種事件提醒和任務管理,從而實現(xiàn)在多種即時通信協(xié)議基礎上的音視頻通信。
目前,即時通信系統(tǒng)層出不窮,相比于諸如Skype、騰訊等商業(yè)公司開發(fā)的即時通信系統(tǒng)框架,具有開源特性的即時通信開發(fā)模式發(fā)展更加快速,技術更新更加頻繁,能夠為用戶提供更為豐富和個性化的應用模式,因此更受到研發(fā)人員的關注。而以Farsight/Gstreamer音視頻處理框架為代表的通用音視頻處理框架,為音視頻處理在即時通信環(huán)境下的實現(xiàn)提供了有力的技術基礎,使音視頻通信變得非常簡單,并且大大擴展了多媒體通信的功能。在Linux環(huán)境下實現(xiàn)音視頻通信的客戶端軟件有限,其中通信效果最好的Pidgin和Empathy均采用Gstreamer/Farsight作為其開發(fā)音視頻功能的基本庫,通過Jingle/XMPP等協(xié)議實現(xiàn)連接,完成音視頻通信。因此,充分了解即時通信系統(tǒng)后端音視頻處理的技術,將為研究人員開發(fā)音視頻通信系統(tǒng)提供非常大的幫助。
[1] SCHULZRINNE H,CASNER S,F(xiàn)REDERICK 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.