王從局(連云港師范高等專科學(xué)校計算機(jī)系,江蘇 連云港222006)
基于傳統(tǒng)的C/S模式或B/S模式的視頻直播或點播系統(tǒng),存在建設(shè)費用高、服務(wù)器負(fù)荷大、網(wǎng)絡(luò)帶寬要求高、訪問量過大時播放質(zhì)量差、可靠性和可擴(kuò)展性受結(jié)構(gòu)限制等缺點。基于P2P的流媒體服務(wù)技術(shù)通過合理地使用客戶端計算機(jī)空閑的資源提供部分服務(wù),讓客戶機(jī)緩存一部分信息,充當(dāng)服務(wù)器的部分功能,使網(wǎng)絡(luò)中的資源和服務(wù)分散化。采用P2P架構(gòu)可以充分利用其中各節(jié)點閑置的計算能力或存儲空間,達(dá)到低成本的提供更高性能計算和海量存儲的目的[1]。下面,筆者設(shè)計了一種基于P2P流媒體的視頻直播系統(tǒng)。
基于P2P的流媒體直播系統(tǒng)分為服務(wù)器(是指保存有原始節(jié)目文件,最初發(fā)布服務(wù)的節(jié)點)和客戶端(是指沒有節(jié)目文件,依靠其他節(jié)點傳輸?shù)拿襟w流進(jìn)行節(jié)目播放的節(jié)點)2個部分。在P2P網(wǎng)絡(luò)上節(jié)點是對等的,即作為客戶端在接收上級節(jié)點傳輸?shù)臄?shù)據(jù)流的同時,也在作為服務(wù)器給下級節(jié)點提供數(shù)據(jù)流[2]。在P2P傳輸結(jié)構(gòu)的組織上,采用完全二叉樹的結(jié)構(gòu),如圖1所示。其中服務(wù)器作為樹的根節(jié)點,客戶端根據(jù)請求加入的順序,在服務(wù)器的控制下,按照構(gòu)造完全二叉樹的策略逐漸組織傳輸結(jié)構(gòu)。

圖1 系統(tǒng)整體架構(gòu)圖
系統(tǒng)功能的設(shè)計包括服務(wù)器端功能設(shè)計和客戶端功能設(shè)計2部分。
服務(wù)器端的主要功能由發(fā)布服務(wù)通告、獲取本地媒體流并播放、獲取節(jié)點加入P2P網(wǎng)絡(luò)、將實時媒體流傳給孩子節(jié)點、監(jiān)聽直接孩子節(jié)點的存活情況、處理孩子節(jié)點的斷線情況等功能構(gòu)成。
1)發(fā)布服務(wù)通告 服務(wù)器在啟動時,會發(fā)布自己的服務(wù)通告,目的是讓客戶端通過服務(wù)通告找到服務(wù)器節(jié)點,并且加入整個P2P網(wǎng)絡(luò)。主要通過JXTA平臺,服務(wù)器建立自己的服務(wù)通告名稱和ID,然后發(fā)布出去,等待客戶端的連接。
2)獲取本地媒體流并播放 服務(wù)器首先找到本地存放的媒體文件,并將其進(jìn)行轉(zhuǎn)換成實時的流媒體。主要通過JMF的媒體處理器對本地的媒體文件進(jìn)行處理,得到可供傳輸?shù)拿襟w流。
3)獲取節(jié)點加入P2P網(wǎng)絡(luò) 服務(wù)器接收到客戶端的入網(wǎng)請求之后,將客戶端加入P2P傳輸網(wǎng)絡(luò)中,并設(shè)置相應(yīng)的屬性如加入的順序編號作為標(biāo)記。主要通過JXTA的消息機(jī)制,客戶端將自己的信息傳給服務(wù)器,并讓服務(wù)器將其加入P2P網(wǎng)絡(luò)中。
4)將實時媒體流傳給孩子節(jié)點 服務(wù)器通過JMF獲取正播放的媒體,再通過它發(fā)送給自己的直接孩子節(jié)點。
5)監(jiān)聽直接孩子節(jié)點的存活情況 用JXTA的消息機(jī)制定時給直接孩子節(jié)點(包括左孩子和右孩子)發(fā)送消息來判斷直接孩子節(jié)點是否存活。如果孩子節(jié)點收到消息,則孩子節(jié)點給服務(wù)器返回消息證明自己存在。
6)處理孩子節(jié)點的斷線情況 服務(wù)器接收到孩子節(jié)點(可以是所有的孩子節(jié)點)不存在的消息之后,重新調(diào)整整個P2P網(wǎng)絡(luò)的傳輸結(jié)構(gòu),將P2P網(wǎng)絡(luò)中最后一個節(jié)點調(diào)到剛斷線節(jié)點處,代替剛掉線的節(jié)點以保持整個網(wǎng)絡(luò)傳輸?shù)捻槙场?/p>
客戶端主要功能由搜索服務(wù)器服務(wù)通告、加入P2P網(wǎng)絡(luò)、獲得父節(jié)點媒體流并播放、將實時媒體流傳給孩子節(jié)點、處理直接孩子節(jié)點的斷線情況等功能構(gòu)成。
1)搜索服務(wù)器服務(wù)通告 通過JXTA平臺,客戶端根據(jù)默認(rèn)的服務(wù)名稱搜索服務(wù)器建立的服務(wù)通告名稱。
2)加入P2P網(wǎng)絡(luò) 客戶端搜索到服務(wù)器的服務(wù)通告后,通過JXTA的消息機(jī)制將自己的信息情況發(fā)送給服務(wù)器,請求加入P2P網(wǎng)絡(luò)。
3)獲得父節(jié)點媒體流并播放 客戶端通過JMF技術(shù),獲得從父節(jié)點發(fā)送給自己的實時媒體流進(jìn)行相應(yīng)的處理之后,實時播放出來。
4)將實時媒體流傳給孩子節(jié)點 用JMF的媒體流克隆技術(shù),將自己正播放的從父節(jié)點收到的實時媒體流克隆一份,發(fā)送給自己的直接孩子節(jié)點。
5)處理直接孩子節(jié)點的斷線情況 客戶端首先通過定時函數(shù)探測到自己的直接孩子節(jié)點已經(jīng)斷線,然后將自己孩子節(jié)點的信息用JXTA的消息機(jī)制發(fā)送給服務(wù)器,讓服務(wù)器處理。
在P2P應(yīng)用中,傳輸結(jié)構(gòu)是在逐漸增加的節(jié)點上創(chuàng)建的。筆者設(shè)計的傳輸結(jié)構(gòu)采用完全二叉樹的結(jié)構(gòu)形式,也就是說服務(wù)器的服務(wù)發(fā)布后,節(jié)點可以發(fā)起一個請求到服務(wù)器,服務(wù)器將把前2個發(fā)起請求的節(jié)點作為孩子節(jié)點,然后服務(wù)器把以后發(fā)來請求的節(jié)點的請求轉(zhuǎn)發(fā)給某個子孫節(jié)點,服務(wù)將由子孫節(jié)點來提供。節(jié)點的加入過程如圖2所示。

圖2 節(jié)點的加入過程圖
設(shè)計中,使用Sequence來存儲節(jié)點信息。如假設(shè)服務(wù)器的編號為1,第一個發(fā)起請求的節(jié)點為2,依次類推,則i節(jié)點的左孩子就是i×2,右孩子是i×2+1,父節(jié)點是i/2向下取整。i節(jié)點發(fā)出的請求得到服務(wù)器的響應(yīng)后,將其信息放入Sequence的末尾(即位置i),若自己已經(jīng)存在2個孩子節(jié)點,則請求將被轉(zhuǎn)發(fā)給編號為i/2的節(jié)點。在圖2中,節(jié)點4的請求被服務(wù)器轉(zhuǎn)發(fā)給了節(jié)點2,即4/2,使新加進(jìn)的節(jié)點成了節(jié)點2的左孩子。這種做法將確保傳輸結(jié)構(gòu)為完全二叉樹。
在P2P應(yīng)用中,節(jié)點的不穩(wěn)定性造成其有可能隨時退出系統(tǒng)的情況。在設(shè)計中,節(jié)點不但從上一級節(jié)點接收流媒體用來自己播放,同時還要向下一級節(jié)點提供數(shù)據(jù)流,如果有節(jié)點退出,它的下一級節(jié)點將會失去數(shù)據(jù)源,播放將被中斷[3]。因此,在發(fā)現(xiàn)節(jié)點故障后,需要進(jìn)行傳輸結(jié)構(gòu)的調(diào)整,以確保所有節(jié)點的播放正常進(jìn)行。為了保證被調(diào)整以后的傳輸結(jié)構(gòu)仍然是完全二叉樹,筆者以最后一個節(jié)點補(bǔ)充失效節(jié)點的方式來調(diào)整傳輸結(jié)構(gòu),如圖3所示。

圖3 節(jié)點的退出過程圖
如果節(jié)點2退出,服務(wù)器(節(jié)點1)將在一定時間后通過監(jiān)視程序發(fā)現(xiàn)節(jié)點2失效。隨后服務(wù)器將查找Sequence中最后一個節(jié)點,即節(jié)點7。服務(wù)器通過節(jié)點7的編號找到它的父節(jié)點3,通知節(jié)點3取消對節(jié)點7的數(shù)據(jù)流傳輸和監(jiān)視。并將節(jié)點7的信息調(diào)整到Sequence中的位置2,然后服務(wù)器重新開始對新的2號節(jié)點進(jìn)行數(shù)據(jù)流傳輸和監(jiān)視。最后,服務(wù)器通過Sequence的長度是否大于2×2和2×2+1來判斷節(jié)點2是否有孩子。若有孩子,則服務(wù)器象節(jié)點4、5請求加入時一樣,向新2號節(jié)點發(fā)送節(jié)點4、5請求加入的消息,之后新2號節(jié)點將分別向他們傳輸數(shù)據(jù)流,并且監(jiān)視他們的有效性[4]。
當(dāng)某節(jié)點通過監(jiān)視程序發(fā)現(xiàn)自己的孩子節(jié)點失效時,將向服務(wù)器發(fā)送 “編號為i的節(jié)點失效”的消息,編號i通過自己的編號計算而來,然后由服務(wù)器通過向節(jié)點發(fā)送消息來完成傳輸結(jié)構(gòu)的調(diào)整。
向客戶端提供的節(jié)目一般以媒體文件的形式存儲于服務(wù)器中,這些媒體文件直接傳輸?shù)娇蛻舳耸菬o法被客戶端實時接收并播放的。為了使客戶端可以實時接收并播放節(jié)目,需要服務(wù)器在傳輸時將媒體文件轉(zhuǎn)化為流媒體格式,以流的形式傳輸媒體數(shù)據(jù)。RTP是為支持實時多媒體通信而設(shè)計的傳輸層協(xié)議,本設(shè)計所采用的流媒體格式是基于RTP的。在網(wǎng)絡(luò)上傳輸RTP流,必須使用處理器和RTP編碼的數(shù)據(jù)源,并構(gòu)建一個會話管理器或數(shù)據(jù)匯集點來控制傳輸。處理器的輸入可以是當(dāng)前捕獲的數(shù)據(jù),也可以是已存儲的文件。一般的節(jié)目都是既有圖像又有聲音的,在處理器中音視頻被描述成2個軌道,即視頻軌道和音頻軌道。由于視頻和音頻的編碼方式不同,所以必須從媒體文件中分別提取出視頻軌道和音頻軌道,按照各自的編碼方式轉(zhuǎn)換為RTP流,之后創(chuàng)建2個會話管理器,在2個會話中分別進(jìn)行傳輸[5]。
在綜合考慮各種因素的情況下,利用P2P技術(shù)設(shè)計大規(guī)模流媒體直播解決方案,可以在將來提供更好的網(wǎng)絡(luò)流媒體播放服務(wù)。采用P2P技術(shù)設(shè)計的流媒體直播系統(tǒng),還具有在線訪問用戶越多視頻質(zhì)量就越清晰流暢、容易部署和擴(kuò)展能力高的特點,可以在將來提供更好的網(wǎng)絡(luò)流媒體播放服務(wù)。
[1]彭凱,武娟,楊宗凱,等 .基于P2P的流媒體直播技術(shù)研究與展望 [J].計算機(jī)科學(xué),2009,36(1):10-15.
[2]韓俊偉,王少鋒 .基于P2P的流媒體直播系統(tǒng)研究與設(shè)計 [J].計算機(jī)應(yīng)用研究,2006(6):227-229.
[3]李長利,應(yīng)小昆,張萬光,等 .基于P2P網(wǎng)絡(luò)技術(shù)的視頻直播系統(tǒng)的實現(xiàn)與測試 [J].微電子學(xué)與計算機(jī),2008,25(10):83-86.
[4]張路 .基于流媒體技術(shù)的電視直播系統(tǒng)研究與設(shè)計 [J].中國科技博覽,2009(14):82-83.
[5]王從局 .基于JXTA的視頻直播系統(tǒng)的設(shè)計與實現(xiàn) [D].上海:華東師范大學(xué),2009.