Live555 實戰之框架簡單介紹

作者:咕唧咕唧liukun321

來自:http://blog.csdn.net/liukun321

 

 

上一篇文章簡要介紹了怎樣以共享庫的方式交叉編譯Live555,今天再來介紹live源代碼框架。

先對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靈活運用到實際項目中起了至關關鍵的數據。

 

後面會用幾篇博文,通過解說實例代碼的方式。直觀闡述live555在嵌入式系統中視頻轉播、直播中的應用。