在博客《 live555搭建流媒体服务器2--live555源码分析》 中已经介绍了Live555源码的UsageEnvironment库和BasicUsageEnvironment库,下面介绍剩下的两个库。groupSock库是对网络接口的封装,实现数据包的发送和接收。groupSock主要被设计用以支持多播,但它也完全支持单播通信。liveMedia库是Live555最重要的模块。该模块声明了一个抽象类Medium,其他所有类都派生自该类,针对不同的流媒体和编码。
首先熟悉liveMedia库中的几个概念:Source、Sink、Filter;Source抽象了数据源,比如通过RTP读取数据。Sink是数据消费者的抽象,比如把接收到数据存储到文件,该文件就是一个Sink。数据的流动可能经过多个Source和Sink。从其它Source接受数据的Source叫做Filters;下面试一个示例:
Source1 -> Source2(a Filter) ->Source3(a Filter)->Sink
MediaSink是各种类型的Sink的基类,MediaSource是各种类型Source的基类,各种类型的流媒体格式和编码的支持即是通过对这两个类的派生实现的。
Medium:抽象了基本的接口,包括环境、task、媒体名(fMediumName)和媒体查找函数(lookupByName)以及一些辅助函数,也包括返回当前的环境类UsageEnvironment,以及环境指向下一个TaskToken的指针nextTask等。其中媒体名(fMediumName)是一个字节数组 char fMediumName[mediumNameMaxLen];mediumNameMaxLen等于30。直接继承于Medium下的第二级类有23个,如下图所示:
这里介绍几个常用的:
DarwinInjector:作为与DSS服务器交互的接口;
MediaSession:管理一个包含音视频的媒体文件,每个MediaSession使用文件名唯一标识;使用SubSession管理MediaSession中的一个音频流或视频流。因此一个MediaSession可以有多个MediaSubsession,一个管理音频流一个管理视频流。
MediaSink:数据消费者的抽象,把接收到的数据存储到文件;
MediaSource:抽象数据源,如通过RTP读取数据;
RTCPInstance:实现RTCP的通信,RTCP实例;
RTSPClient:实现RTSP请求的发送和响应的解析,根据解析结果创建对应RTP会话;
RTSPServer:RTSP服务器,创建服务器,添加ServerMediaSession;
ServerMediaSession:表示一个会话的数据结构;
ServerMediaSubsession:定义了指向ServerMediaSession的父指针(friend class ServerMediaSession),指向下个一个对象的指针,(ServerMediaSubsession* fNext);
Source :
H264VideoStreamFramer::H264Or5VideoStreamFramer::MPEGVideoStreamFramer::FramedFilter::FramedSource::MediaSource::Medium
H264VideoStreamFramer是真正的Souce,它用于从h264文件中读取数据,并组装成帧。在Sink调用GetNextFrame时将帧数据返回给Sink。
Sink:
H264VideoRTPSink::H264Or5VideoRTPSink::VideoRTPSink::MultiFramedRTPSink::RTPSink::MediaSink::Medium
Session:
H264VideoFileServerMediaSubsession::FileServerMediaSubsession::OnDemandServerMediaSubsession::ServerMediaSubsession ::Medium
SubSession用于完成Souce和Sink的连接,同时用于管理每个媒体流。