Live555類結構關係圖
先對live555有一個巨集觀的認識,為今後的實戰打個基礎。
liveMedia專案的原始碼包含四個主要的庫,各種測試程式碼以及IVE555 Media Server。四個主要的庫各自是UsageEnvironment&TaskScheduler,groupsock,liveMedia,BasicUsageEnvironment。
這幾個類都是整個系統的基礎功能類,這些都是抽象類,在應用程式中基於這些類實現自己的子類。
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靈活運用到實際專案中起了至關關鍵的資料。