前面已经讲到,通过不断地尝试(其实要在 XP SP3 环境下使用 VS2008 编译成功还是挺费神的),总算把源代码编译成功,同时又参考了新下载的一个用 VS2008 编译通过的 live555 源代码。结合这些,开始对主要类结构进行初步分析。
鉴于 UsageEnvironment 库、 BasicUsageEnvironment 库和 groupsock 库中的类较少,就暂且不作分析了。这里主要针对 liveMedia 库中的主要类结构进行分析。通过查看类关系图,可以从整体把握,但是苦于类太多,用类关系图看起来也不方便,于是就自己重新整理了一下,下面是 liveMedia 库的主要类结构。 (注:其他单类及结构体等不在此列出)
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
从上面这个主要的类结构可以看出, liveMedia 库中的基类为 Medium ,其下又有几个非常重要的部分,一个是 ×××Subsession ,除 Medium 父类外,所有的 ×××Subsession 类都继承于 ServerMediaSubsession ;一个是 ×××Source , MediaSource 的 frameSource 下主要包含 FramedFileSource 、 RTPSource 、 FramedFilter 等几个主要的部分;一个是 MediaSink ,以继承于 RTPSink 的类居多。
此外,还包含了用于处理 packet 的 BufferedPacketFactory 和 BufferedPacket 及其相关子类,用于处理流分析的 StreamParser 及其子类。
基本上,整个 liveMedia 库的主要类结构就是这样。不过,类太多了,分析起来还是有较大的困难。于是乎,采取去掉枝叶保留主干的做法,将整个服务器精简成支持一种格式的服务器,如 MP3 流服务器。经过分离,一个 基于 MP3 的测试服务器的主要类结构如下所示。 (注:其他单类及结构体等不在此列出)
l Medium
n RTSPServer
n MediaSession
n ServerMediaSession
n ServerMediaSubsession
u OnDemandServerMediaSubsession
l FileServerMediaSubsession
n MP3AudioFileServerMediaSubsession
n MediaSource
u FramedSource
l FramedFileSource
n MP3FileSource
u MP3HTTPSource
l BasicUDPSource
l RTPSource
n MultiFramedRTPSource
u MP3ADURTPSource
u MPEG1or2AudioRTPSource
u SimpleRTPSource
l FramedFilter
n ADUFromMP3Source
n MP3FromADUSource
u MP3Transcoder
n MP3ADUinterleaverBase
u MP3ADUinterleaver
u MP3ADUdeinterleaver
n MP3ADUTranscoder
n MediaSink
u BasicUDPSink
u RTPSink
l MultiFramedRTPSink
n AudioRTPSink
u MPEG1or2AudioRTPSink
u MP3ADURTPSink
n RTCPInstance
l BufferedPacketFactory
n ADUBufferedPacketFactory
l BufferedPacket
n ADUBufferedPacket
根据上面这种相对简单的类结构,分析起来就方便多了。于是,开始进入具体的分析细节了,这是一个相对漫长的过程,再加上本人的 C++ 水平有限,这又将是一个相对艰苦的过程,一切慢慢来吧……
末了,讲讲启动服务器的过程:
LIVE555 是一个纯粹的 RTSP 服务器,其服务器主类为 liveMedia 库下的 RTSPServer ; mediaServer 下的 live555MediaServer 为主程序的入口类, DynamicRTSPServer 是 RTSPServer 的实现类。
从 live555MediaServer 类的入口函数 main 中可以非常清晰地分析出服务器的启动过程。
首先是 createNew 一个 TaskSchedulers 对象和一个 UsageEnvironment 对象,这是初始工作。
之后是一段访问控制的代码。然后开始进入创建 RTSP 服务器的代码段,服务器指定了一个默认端口 554 和一个可供替代的端口 8554 。
接下来, createNew 一个 DynamicRTSPServer ,这里建立了 Socket(ourSocket) 在 TCP 的 554 端口(默认端口)进行监听,然后把连接处理函数句柄和 socket 句柄传给任务调度器 ( 即 taskScheduler) ,既是 RTSPServer 类中的这句代码: env .taskScheduler ().turnOnBackgroundReadHandling (fServerSocket , (TaskScheduler ::BackgroundHandlerProc *)&incomingConnectionHandler ,this) 。紧接着就是对 socket 句柄和 incomingConnectionHandler 句柄的处理,主要是进行关联等。
最后,进入主循环(即 env ->taskScheduler ().doEventLoop (); ),等待客户端连接。服务器启动完毕。
文章的最后,需要说明的是,在编译运行的过程中,我是使用 VLC 播放器来进行测试的,同时通过使用 Ethereal 的网络分析工具抓包分析其建立到传输的过程,虽然在 live555 源代码中关于 RTSP 建立及收发数据包的过程已经用代码写得非常清楚(这个好好分析一下源码就可以了),但我想,学习使用一下一些网络分析工具对自身也是颇为有益的。