Live555源代碼解讀(1)

1、總體架構web

     從程序的結構來看,live項目包括了四個基本庫、程序入口類(在mediaServer中)和一些測試代碼(在testProgs中)。四個基本庫是UsageEnvironment、BasicUsageEnvironment、groupsock和liveMedia。session

     UsageEnvironment包括抽象類UsageEnvironment和抽象類TaskScheduler,這兩個類用於事件調度,其中包括實現了對事件的異步讀取、對事件句柄的設置及對錯誤信息的輸出等;該庫中還有一個HashTable,這是一個通用的HashTable,在整個項目中均可以使用它,固然該HashTable也是一個抽象類。架構

     BasicUsageEnvironment中的類主要是對UsageEnvironment中對應類的實現。異步

groupsock,顧名思義,用於數據包的接收和發送,其同時支持多播和單播。groupsock庫中包括了GroupEId、Groupsock、GroupsockHelper、NetAddress、NetInterface等類,其中Groupsock類有兩個構造函數,一個是「for a source-independent multicast group」,另外一個是「for a source-specific multicast group」;而GroupsockHelper類主要用於讀寫Socket。socket

     liveMedia是很重要的一個庫,其不只包含了實現RTSP Server的類,還包含了針對不一樣流媒體類型(如TS流、PS流等)編碼的類。在該庫中,基類是Medium,層次關係很是清晰。在該庫中,有幾個很重要的類,如RTSPServer、ServerMediaSession、RTPSink、RTPInterface、FramedSource等。ide

在http://www.live555.com上的相關文檔中提到穿透防火牆的問題,方法是開啓一個HTTP的tunnel,而後咱們能夠在liveMedia庫中找到一個RTSPOverHTTPServer的類,該類解決了這樣的問題。函數

     mediaServer下的live555MediaServer提供了main函數,DynamicRTSPServer繼承了RTSPServer並重寫了虛函數lookupServerMediaSession。測試

     鑑於UsageEnvironment庫、BasicUsageEnvironment庫和groupsock庫中的類較少,就暫且不做分析了。這裏主要針對liveMedia庫中的主要類結構進行分析。經過查看類關係圖,能夠從總體把握,可是苦於類太多,用類關係圖看起來也不方便,因而就本身從新整理了一下,下面是 liveMedia庫的主要類結構。(注:其餘單類及結構體等不在此列出)ui


l   Medium編碼

n   RTSPServer

n   RTSPOverHTTPServer

n   MediaSession

n   ServerMediaSession

n   ServerMediaSubsession

u   OnDemandServerMediaSubsession

l   FileServerMediaSubsession

n   ADTSAudioFileServerMediaSubsession

n   AMRAudioFileServerMediaSubsession

n   H263plusVideoFileServerMediaSubsession

n   MP3AudioFileServerMediaSubsession

n   MPEG1or2VideoFileServerMediaSubsession

n   MPEG2TransportFileServerMediaSubsession

n   MPEG4VideoFileServerMediaSubsession

n   WAVAudioFileServerMediaSubsession

l   MPEG1or2DemuxedServerMediaSubsession

u   PassiveServerMediaSubsession

n   MediaSource

u   FramedSource

l   FramedFileSource

n   ByteStreamFileSource

n   ADTSAudioFileSource

n   MP3FileSource

u   MP3HTTPSource

l   BasicUDPSource

l   RTPSource

n   MultiFramedRTPSource

u   RawQCELPRTPSource

u   AC3AudioRTPSource

u   MPEG4GenericRTPSource

u   RawAMRRTPSource

u   H261VideoRTPSource

u   H263plusVideoRTPSource

u   H264VideoRTPSource

u   JPEGVideoRTPSource

u   MP3ADURTPSource

u   MPEG1or2AudioRTPSource

u   MPEG1or2VideoRTPSource

u   MPEG4ESVideoRTPSource

u   MPEG4GenericRTPSource

u   MPEG4LATMAudioRTPSource

u   DVVideoRTPSource

u   QuickTimeGenericRTPSource

u   SimpleRTPSource

l   AMRAudioSource

n   AMRDeinterleaver

n   AMRAudioFileSource

l   ByteStreamMultiFileSource

l   DeviceSource

l   JPEGVideoSource

l   MPEG1or2DemuxedElementaryStream

l   MPEG2TransportStreamMultiplexor

n   MPEG2TransportStreamFromESSource

n   MPEG2TransportStreamFromPESSource

l   AudioInputDevice

n   WAVAudioFileSource

l   FramedFilter

n   H264FUAFragmenter

n   QCELPDeinterleaver

n   AC3AudioStreamFramer

n   ADUFromMP3Source

n   uLawFromPCMAudioSource

n   H264VideoStreamFramer

n   MP3FromADUSource

u   MP3Transcoder

n   PCMFromuLawAudioSource

n   MPEG2IFrameIndexFromTransportStream

n   NetworkFromHostOrder16

n   HostFromNetworkOrder16

n   MP3ADUinterleaverBase

u   MP3ADUinterleaver

u   MP3ADUdeinterleaver

n   MPEG2TransportStreamFramer

n   EndianSwap16

n   H263plusVideoStreamFramer

n   MPEGVideoStreamFramer

u   MPEG1or2VideoStreamFramer

l   MPEG1or2VideoStreamDiscreteFramer

u   MPEG4VideoStreamFramer

l   MPEG4VideoStreamDiscreteFramer

n   MPEG1or2AudioStreamFramer

n   DVVideoStreamFramer

n   MP3ADUTranscoder

n   MPEG2TransportStreamTrickModeFilter

n   MediaSink

u   DummySink

u   BasicUDPSink

u   RTPSink

l   MultiFramedRTPSink

n   MPEG4GenericRTPSink

n   VideoRTPSink

u   H264VideoRTPSink

u   MPEG1or2VideoRTPSink

u   H263plusVideoRTPSink

u   JPEGVideoRTPSink

u   DVVideoRTPSink

u   MPEG4ESVideoRTPSink

n   AudioRTPSink

u   AC3AudioRTPSink

u   MPEG4LATMAudioRTPSink

u   GSMAudioRTPSink

u   MPEG1or2AudioRTPSink

u   AMRAudioRTPSink

u   MP3ADURTPSink

n   SimpleRTPSink

u   HTTPSink

l   MPEG1or2VideoHTTPSink

u   FileSink

l   AMRAudioFileSink

l   H264VideoFileSink

n   RTCPInstance

n   RTSPClient

n   SIPClient

n   DarwinInjector

n   QuickTimeFileSink

n   MPEG1or2Demux

n   MPEG2TransportStreamIndexFile

n   MPEG1or2FileServerDemux

n   AVIFileSink

l   BufferedPacketFactory

n   QCELPBufferedPacketFactory

n   AMRBufferedPacketFactory

n   MPEG4GenericBufferedPacketFactory

n   ADUBufferedPacketFactory

n   QTGenericBufferedPacketFactory

n   LATMBufferedPacketFactory

n   H264BufferedPacketFactory

n   JPEGBufferedPacketFactory

l   BufferedPacket

n   QCELPBufferedPacket

n   AMRBufferedPacket

n   MPEG4GenericBufferedPacket

n   ADUBufferedPacket

n   QTGenericBufferedPacket

n   LATMBufferedPacket

n   H264BufferedPacket

n   JPEGBufferedPacket

l   StreamParser

n   AC3AudioStreamParser

n   MPEGVideoStreamParser

u   MPEG1or2VideoStreamParser

u   MPEG4VideoStreamParser

n   MPEG1or2AudioStreamParser

n   H263plusVideoStreamParser

n   MPEGProgramStreamParser

 

2、基礎類

     從上面這個主要的類結構能夠看出,liveMedia庫中的基類爲Medium,其下又有幾個很是重要的部分,一個是×××Subsession,除Medium父類外,全部的×××Subsession類都繼承於ServerMediaSubsession;一個是×××Source,MediaSource的frameSource下主要包含FramedFileSource、RTPSource、FramedFilter等幾個主要的部分;一個是MediaSink,以繼承於RTPSink的類居多。

     此外,還包含了用於處理packet的BufferedPacketFactory和BufferedPacket及其相關子類,用於處理流分析的StreamParser及其子類。

     BasicUsageEnvironment和UsageEnvironment中的類都是用於整個系統的基礎功能類.好比UsageEnvironment表明了整個系統運行的環境,它提供了錯誤記錄和錯誤報告的功能,不管哪個類要輸出錯誤,就須要保存UsageEnvironment的指針.而TaskScheduler則提供了任務調度功能.整個程序的運行發動機就是它,它調度任務,執行任務(任務就是一個函數).TaskScheduler因爲在全局中只有一個,因此保存在了UsageEnvironment中.而全部的類又都保存了UsageEnvironment的指針,因此誰想把本身的任務加入調度中,那是很容易的.在此還看到一個結論:整個live555(服務端)只有一個線程.

     類HashTable:實現了哈稀表.

     類DelayQueue:譯爲"延遲隊列",它是一個隊列,每一項表明了一個要調度的任務(在它的fToken變量中保存).同時保存了這個任務離執行時間點的剩餘時間.能夠預見,它就是在TaskScheduler中用於管理調度任務的東西.注意,此隊列中的任務只被執行一次!執行完後這一項即被無情拋棄!

     類HandlerSet:Handler集合.Handler是什麼呢?它是一種專門用於執行socket操做的任務(函數),HandlerSet被TaskScheduler用來管理全部的socket任務(增刪改查).因此TaskScheduler中如今已調度兩種任務了:socket任務(handlerSet)和延遲任務(DelayQueue).其實TaskScheduler還調度第三種任務:類Event,介個後面再說.

     類Groupsock:這個是放在單獨的庫Groupsock中。它封裝了socket操做,增長了多播放支持和一對多單播的功能.它管理着一個本地socket和多個目的地址,由於是UDP,因此只需知道對方地址和端口便可發送數據。Groupsock的構造函數有一個參數是struct in_addr const& groupAddr,在構造函數中首先會調用父類構造函數建立socket對象,而後判斷這個地址,如果多播地址,則加入多播組。Groupsock的兩個成員變量destRecord* fDests和DirectedNetInterfaceSet fMembers都表示目的地址集和,但我始終看不出DirectedNetInterfaceSet fMembers有什麼用,且DirectedNetInterfaceSet是一個沒有被繼承的虛類,看起來fMembers沒有什麼用。僅fDesk也夠用了,在addDestination()和removeDestination()函數中就是操做fDesk,添加或刪除目的地址。

相關文章
相關標籤/搜索