代码改变世界

Live555研究之一mediaServer主循环

2013-06-15 01:49  鉴于  阅读(1732)  评论(0编辑  收藏  举报

mediaServer工程中的live555MediaServer.cpp提供一个main函数,里面创建了一个DynamicRTSPServer对象,DynamicRTSPServer从RTSPServerSupportingHTTPStreaming派生下来,RTSPServerSupportingHTTPStreaming从RTSPServer派生下来,RTSPServerSupportingHTTPStreaming在liveMedia工程里面。Live555里将构造函数声明为protected,从而避免外部直接调用构造函数,提供了静态的createNew()来创建对象,类似于工厂方法。

RTSPServer类内部定义了子类RTSPClientConnection,用于保存TCP客户端连接的状态。RTSPServerSupportingHTTPStreaming提供了基于HTTP协议进行流传输的相关网络操作函数。在Live555里面很少看到加锁的地方,这样是为了避免等待锁,而导致效率低下。handleHTTPCmd_StreamingGET会去RTSPServer的Hashtable里查找会话名,如果找不到会调用RTSPServer::RTSPClientConnection::handleHTTPCmd_notFound()函数,该函数会打印出响应的信息。

在handleHTTPCmd_StreamingGET()函数中处理客户端请求:
获取流参数,定位流,构造响应信息。send响应信息给Client。
ServerMediaSubsession含有一个getStreamSource()函数用于提供流媒体数据源,每次调用
返回一个FramedSource对象指针mediaSource,用于获取帧数据。
若mediaSource不会空,并且fTCPSink为空,将会创建一个TCPStreamSink对象。

一个TCPStreamSink用来表示一个TCP输出流,调用fTCPSink->startPlaying()函数开始播放。
在上述循环结束之后,需要构造播放列表。发送响应信息给Client。
如果已有fPlaylistSource,则需要停止它。再创建一个ByteStreamMemoryBufferSource对象。再调用
fTCPSink->startPlaying,播放Stream。handleHTTPCmd_StreamingGET()是一个virtual函数,基类调用的时候,将会调用到派生类的函数。
RTSPClientConnectionSupportingHTTPStreaming::afterStreaming 用于销毁Client连接。