1. 程式人生 > >Live555類結構關係圖

Live555類結構關係圖

先對live555有一個巨集觀的認識,為今後的實戰打個基礎。

liveMedia專案的原始碼包含四個主要的庫,各種測試程式碼以及IVE555 Media Server四個主要的庫各自是UsageEnvironment&TaskSchedulergroupsockliveMediaBasicUsageEnvironment

這幾個類都是整個系統的基礎功能類,這些都是抽象類,在應用程式中基於這些類實現自己的子類。

UsageEnvironment:代表了整個系統執行的環境,它提供了錯誤記錄、報告和log輸出的功能,不管哪一個類要輸出錯誤,就須要儲存UsageEnvironment的指標(比如:能夠通過  

UsageEnvironment* env;
UsageEnvironment* env =BasicUsageEnvironment::createNew(*scheduler);
*env << "Play this stream usingthe URL \"


這樣的操作能夠實現log的輸出。

TaskScheduler:則提供了任務排程功能.整個程式的執行發動機就是它,它排程任務。執行任務(任務就是一個函式).TaskScheduler因為在全域性中僅僅有一個,所以儲存在了UsageEnvironment中.而全部的類又都儲存了UsageEnvironment的指標。所以誰想把自己的任務增加排程中,那是非常easy的.

在此還看到一個結論:整個live555(服務端)僅僅有一個執行緒.當然如今有網友已經實現了服務端的多執行緒.

Groupsock類是對網路介面的封裝。用於收發資料包。

這個是放在單獨的庫Groupsock中。它封裝了socket操作,增加了多播放支援和一對多單播的功能.同一時候支援UDP和TCP協議傳輸,兩種方式可供選擇。它管理著一個本地socket和多個目的地址,僅僅需知道對方地址和port就可以傳送資料。Groupsock的建構函式有一個引數是struct in_addr const& groupAddr,在建構函式中首先會呼叫父類建構函式建立socket物件,然後推斷這個地址。若是多播地址,則增加多播組。

Groupsock的兩個成員變數destRecord* fDests和DirectedNetInterfaceSet fMembers都表示目的地址集和。但我始終看不出DirectedNetInterfaceSet fMembers有什麼用,且DirectedNetInterfaceSet是一個沒有被繼承的虛類,看起來fMembers沒有什麼用。僅fDesk也夠用了,在addDestination()和removeDestination()函式中就是操作fDesk。增加或刪除目的地址。

BasicUsageEnvironment:主要是針對簡單的控制檯應用程式,利用select實現事件獲取和處理。

HashTable:實現了哈稀表. 

DelayQueue:譯為"延遲佇列",它是一個佇列,每一項代表了一個要排程的任務(在它的fToken變數中儲存).同一時候儲存了這個任務離執行時間點的剩餘時間.能夠預見,它就是在TaskScheduler中用於管理排程任務的東西.注意,此佇列中的任務僅僅被執行一次!執行完後這一項即被拋棄! 

HandlerSet:Handler集合.Handler是什麼呢?它是一種專門用於執行socket操作的任務(函式),HandlerSet被TaskScheduler用來管理全部的socket任務(增刪改查).所以TaskScheduler中如今已排程兩種任務了:socket任務(handlerSet延遲任務(DelayQueue).事實上TaskScheduler還排程第三種任務:Event,後面再說.

以上各關係見例如以下UML圖:


liveMedia庫中有一系列類,基類是Medium,這些類針對不同的流媒體型別和編碼。

這裡還要再說明一下Sink  source,這兩者的概念及關係:

liveMedia庫中Sink就是消費資料的物件,比方把接收到的資料儲存到檔案,這個檔案就是一個Sink。
Source就是生產資料的物件。比方通過 RTP讀取資料。資料流經過多個source和sinks。

繼承Medium基類的類,及他們間的關係見例如以下UML圖:




到此,我們已經對Live555基類和框架有了一個初步的認識。這對我們今後將live555靈活運用到實際專案中起了至關關鍵的資料。