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,添加或刪除目的地址。