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

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

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

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