精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
流媒体服务器是由一个父进程构成的,这个父进程分叉出一个子进程,该子进程就是核心服务器。父进程会等待子进程的退出。如果子进程错误退出,则父进程就会分叉出一个新的子进程。
核心服务器的作用是充当网络客户和服务器模块的接口,其中网络客户使用RTP和RTSP协议来发送请求和接收响应,而服务器模块则负责处理请求和向客户端发送数据包。核心服务器通过创建四种类型的线程来完成自己的工作,具体如下:
图 1-1 总结了客户端,核心服务器的线程,和服务器模块之间的关系。
由于服务器很大程度上是异步的,所以需要为不同的事件提供一个通讯机制。举例来说,当某个用于RTSP连接的套接口得到数据时,需要通知某些组件,数据才能被处理。Task(任务)对象就是执行这种通讯的一般性的机制。
每一个Task对象都有两个主要的方法:即Signal和Run。服务器调用Signal方法来把一个事件发送给Task对象,而Run方法则用来为Task对象指定处理事件的时机。
每个Task对象的目标都是用小的非阻塞的时间片来实现服务器的功能。Run是一个纯虚函数,当Task对象有事件需要处理时被调用。在Run函数的内部,Task对象可以调用GetEvents函数来接收当前的和先前已经用信号通知过的事件,并自动使该事件退出队列。Run函数是永远不可重入的:如果一个Task对象在其Run函数中调用GetEvents函数,然后在Run函数完成之前又发出信号,则该Run函数只有在当前的函数实例退出之后,才能(因为那个新的事件)再次被调用。事实上,Task对象的Run函数会被反复调用,直到该对象的所有事件全部被GetEvents函数清除掉为止。
这个事件触发任务的核心概念被集成到几乎每一个流媒体服务器的子系统中。举例来说,一个Task对象可能和一个套接口(Socket)对象相关联。如果Socket对象得到一个事件(通过select()通知,或者通过Mac OS X的时间队列),则相应的Task对象就会得到信号通知。在这种情况下,Run函数的函数体中就会包含相应的代码,来处理在该Socket对象上接收到的任何事件。
Task对象使得流媒体服务器用单独一个线程来运行所有连接的做法成为可能,这正是流媒体服务器在单处理器系统上的缺省设置。
这个部分包含以下内容:
模块
协议
数据
类
应用程序和工具
源代码的组织
流媒体服务器使用模块来响应各种请求及完成任务。有三种类型的模块:
内容管理模块负责管理与媒体源相关的RTSP请求和响应,比如一个文件或者一个广播。每个模块负责解释客户的请求,读取和解析它们的支持文件或者网络源,并且以RTSP和RTP的方式进行响应。在某些情况下,比如流化mp3的模块,使用的则是HTTP。
QTSSFileModule,QTSSReflectorModule,QTSSRelayModule,和QTSSMP3StreamingModule都是内容管理模块。
服务器支持模块执行服务器数据的收集和记录功能。服务器模块包括QTSSErrorLogModule, QTSSAccessLogModule,QTSSWebStatsModule,QTSSWebDebugModule, QTSSAdminModule,和QTSSPOSIXFileSystemModule。
访问控制模块提供鉴权和授权功能,以及操作URL路径提供支持。
访问控制模块包括QTSSAccessModule,QTSSHomeDirectoryModule,QTSSHttpFileModule,和QTSSSpamDefenseModule。
流媒体服务器支持下面的协议:
此外,下面的模块实现了HTTP的支持:
当一个模块需要访问客户请求的RTSP报头时,可以通过QTSS.h这个API头文件中定义的请求对象来访问相应的请求信息。举例来说,RTSPRequestInterface类实现了API字典元素,这些元素可以通过API来进行访问。名称是以“Interface”结尾的对象,比如RTSPRequestInterface,RTSPSessionInterface,和QTSServerInterface,则用于实现模块的API。
下面是重要的接口类:
图 1-2 显示在服务器中的对象是如何互相引用的。
服务器对象中有一个预置信息字典。服务器内部有一个模块列表,列表中的每一个模块都有一个字典,用于存放自己的预置信息。服务器中还有一个RTP客户会话的列表,每一个会话都可能有一个RTSP会话以及一个或多个RTP媒体流。通过API来遍历服务器中所有活跃的会话和流是有可能的。
苹果电脑在提供流媒体服务器的同时还提供下面的应用程序和工具:
PlayListBroadcaster用来播放QuickTime Broadcaster录制完成的电影。
MP3Broadcaster用来广播MP3文件,和现场直播一样。
仅在POSIX和Mac OS X平台上提供。
QTFileTools是一些基于QTFile库开发的电影查看工具。这些工具包括:
作为例子,下面的命令显示ID为3的轨道中的样本表的大块数据的偏移量:
./QTTrackInfo -T stco /movies/mystery/.mov 3
WebAdmin是一个基于Perl的web服务器。将浏览器连接到这个服务器上,就可以对流媒体服务器进行管理。
qtpasswd程序用于产生访问控制用的密码文件。
流媒体服务器的源代码全部用C++编写的,并且普遍使用到诸如继承和多态这样的面向对象的概念。每一对.h / .cpp文件对应一个C++类,并且文件名和类名是相互匹配的,这个规则几乎没有例外。流媒体服务器的源代码按下面的方式进行组织:
这个目录包含核心服务器(core server)的代码,可以分成三个子系统:
这个目录含有一个工具箱,包括线程管理,数据结构,网络,和文本解析工具。Darwin流媒体服务器及其相关工具通过这些类对类似或者相同的任务进行抽象,以减少重复代码;这些类的封装简化了较高层次的代码;借助这些类还分离了专用于不同平台的代码。下面是对目录下的各个类的简短描述:
流媒体服务器的一个主要特性就是它能够将索引完成(hinted)的QuickTime电影文件通过RTSP和RTP协议提供给客户。这个目录包含QTFile库的源代码,包括负责解析索引完成的QuickTime文件的代码。服务器的RTPFileModule通过调用QTFile库来从索引过的QuickTime文件中取得数据包和元数据。QTFile库可以解析下面几种文件类型:.mov,.mp4(.mov的一种修改版本),和.3gpp(.mov的一种修改版本)。
这个目录包含与API相关的类的源代码,比如moduletils,或者诸如记录文件的管理这样的公共模块函数。
这个目录包含流媒体服务器模块目录,每个模块都有一个目录。
这个目录包含实现RTSP客户端的源代码,这些代码可以用于连接服务器,只要该连接协议被支持。
这个目录包含解析RTCP请求的源代码。
这个目录包含API的定义和支持文件。
这个目录包含解析HTTP请求的源代码。