开源项目live555学习心得(二)

前面已经讲到,通过不断地尝试(其实要在 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 建立及收发数据包的过程已经用代码写得非常清楚(这个好好分析一下源码就可以了),但我想,学习使用一下一些网络分析工具对自身也是颇为有益的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值