博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Live555源代码解读(1)
阅读量:6766 次
发布时间:2019-06-26

本文共 6102 字,大约阅读时间需要 20 分钟。

  hot3.png

一、整体架构

     从程序的结构来看,live项目包括了四个基本库、程序入口类(在mediaServer中)和一些测试代码(在testProgs中)。四个基本库是UsageEnvironment、BasicUsageEnvironment、groupsock和liveMedia。

     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。

     liveMedia是很重要的一个库,其不仅包含了实现RTSP Server的类,还包含了针对不同流媒体类型(如TS流、PS流等)编码的类。在该库中,基类是Medium,层次关系非常清晰。在该库中,有几个很重要的类,如RTSPServer、ServerMediaSession、RTPSink、RTPInterface、FramedSource等。

在http://www.live555.com上的相关文档中提到穿透防火墙的问题,方法是开启一个HTTP的tunnel,然后我们可以在liveMedia库中找到一个RTSPOverHTTPServer的类,该类解决了这样的问题。

     mediaServer下的live555MediaServer提供了main函数,DynamicRTSPServer继承了RTSPServer并重写了虚函数lookupServerMediaSession。

     鉴于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及其子类。

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

转载于:https://my.oschina.net/seanx/blog/620624

你可能感兴趣的文章