Chinaunix首页 | 论坛 | 博客
  • 博客访问: 151632
  • 博文数量: 53
  • 博客积分: 2059
  • 博客等级: 大尉
  • 技术积分: 490
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-14 20:25
文章分类
文章存档

2012年(1)

2011年(25)

2010年(16)

2009年(11)

我的朋友

分类: LINUX

2011-04-16 17:01:19

v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 st1\:*{behavior:url(#ieooui) } /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;}

Darwin Streaming Server调研总结

Darwin streaming server(简称DSS) 的简介

DSS主要几个特性:

支持MP43GPP等文件格式;

支持MPEG-4H.264等视频编解码格式;

支持RTSP流控协议,支持HTTP协议;

支持RTP流媒体传输协议;

支持单播和组播;

支持基于Web的管理;

具有完备的日志功能。

此外,该服务器版本提供了一个基于模块的扩展方法。利用DSS提供的API就可以很方便地编写静态或动态的模块,对DSS进行扩展,使其支持其它文件格式、协议或者功能。

DSS服务器的编译安装调试

 Darwin Streaming Server(简称DSS)是苹果公司的开源视频服务器版本,最新版本6.0.3

获取包:6.0.3版本wget 

linux的补丁

wget 

wget 

1.   安装步骤:

解压:

tar –xvf  DarwinStreamingSrvr6.0.3-Source.tar

2.   打补丁

patch -p1 < dss-6.0.3.patch

3.    patch -p1 < dss-hh-20081021-1.patch

4.   修改一下Install

cd DarwinStreamingSrvr6.0.3-Source

vi Install

255改成 /usr/sbin/useradd -g qtss qtss

5.   编译:

./Buildit install

生成安装目录:

./DSS_MakeRoot -f /tmp/dss

6.   去安装目录&安装:

cd /tmp/dss

./Install安装完以后,一些默认的基本目录

/var/streaming/logs 日志文件目录

/usr/local/movies 影片存放目录和sdp文件存放目录

/usr/local/sbin/DarwinStreamingServer 启动DSS的入口

/etc/streaming/streamingserver.xml 相关的DSS的配置文件,可以配置端口,目录,等信息

调试:

可以在先对DSS的配置文件/etc/streaming/streamingserver.xml中设置日志日志的级别,然后再在DSS安装目录下面使用./DarwinStreamingServer –d –D 等参数的形式进行前端显示调试,详见./DarwinStreamingServer –h

DSS的框架

v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;}

服务器的作用是充当网络客户和服务器模块的接口,其中网络客户使用RTPRTSP协议来发送请求和接收响应,而服务器模块则负责处理请求和向客户端发送数据包。核心服务器通过创建四种类型的线程来完成自己的工作,具体如下:

  • 服务器自己拥有的主线程(Main Thread)。这个线程负责检查服务器是否需要关闭,记录状态信息,或者打印统计信息。
  • 空闲任务线程(Idle Task Thread)。空闲任务线程管理一个周期性的任务队列。该任务队列有两种类型:超时任务和套接口任务。
  • 事件线程(Event Thread)。事件线程负责侦听套接口事件,比如收到RTSP请求和RTP数据包,然后把事件传递给任务线程。
  • 一个或者多个任务(Task)线程。任务线程从事件线程中接收RTSPRTP请求,然后把请求传递到恰当的服务器模块进行处理,把数据包发送给客户端。缺省情况下,核心服务器为每一个处理器创建一个任务线程。
模块

媒体服务器使用模块来响应各种请求及完成任务。有三种类型的模块

1.       内容管理模块

内容管理模块负责管理与媒体源相关的RTSP请求和响应,比如一个文件或者一个广播。每个模块负责解释客户的请求,读取和解析它们的支持文件或者网络源,并且以RTSPRTP的方式进行响应。在某些情况下,比如流化mp3的模块,使用的则是HTTP

QTSSFileModuleQTSSReflectorModuleQTSSRelayModule,和QTSSMP3StreamingModule都是内容管理模块。

2.       服务器支持模块

服务器支持模块执行服务器数据的收集和记录功能。服务器模块包括QTSSErrorLogModule QTSSAccessLogModuleQTSSWebStatsModuleQTSSWebDebugModule QTSSAdminModule,和QTSSPOSIXFileSystemModule

3.       访问控制模块

访问控制模块提供鉴权和授权功能,以及操作URL路径提供支持。

访问控制模块包括QTSSAccessModuleQTSSHomeDirectoryModuleQTSSHttpFileModule,和QTSSSpamDefenseModule

数据

当一个模块需要访问客户请求的RTSP报头时,可以通过QTSS.h这个API头文件中定义的请求对象来访问相应的请求信息。举例来说,RTSPRequestInterface类实现了API字典元素,这些元素可以通过API来进行访问。名称是以“Interface”结尾的对象,比如RTSPRequestInterfaceRTSPSessionInterface,和QTSServerInterface,则用于实现模块的API

下面是重要的接口类:

  • QTSServerInterface — 这是内部数据的存储对象,在API中标识为QTSS_ServerObject。在API中的每一个QTSS_ServerAttributes都在基类中声明和实现。
  • RTSPSessionInterace — 这是内部数据的存储对象,在API中标识为qtssRTSPSessionObjectType。在API中的每一个QTSS_RTSPSessionAttributes都在基类中声明和实现。
  • RTPSessionInterface — 这是内部数据的存储对象,在API中标识为QTSS_ClientSessionObject。在API中的每一个QTSS_ClientSessionAttributes都在基类中声明和实现。
  • RTSPRequestInterface — 这是内部数据的存储对象,在API中标识为QTSS_RTSPRequestObject。在API中的每一个QTSS_RTSPRequestAttributes都在基类中声明和实现。
源代码的组织 Server.tproj

这个目录包含核心服务器(core server)的代码,可以分成三个子系统:

  • 服务器内核。这个子系统中的类都有一个QTSS前缀。QTSServer负责处理服务器的启动和关闭。QTSServerInterface负责保存服务器全局变量,以及收集服务器的各种统计信息。QTSSPrefs是存储服务器偏好设定的地方。QTSSModuleQTSSModuleInterface,和QTSSCallbacks类的唯一目的就是支持QTSS的模块API
  • RTSP子系统。这些类负责解析和处理RTSP请求,以及实现QTSS模块APIRTSP部分。其中的几个类直接对应QTSS API的一些元素(比如,RTSPRequestInterface类就是对应于QTSS_RTSPRequestObject对象)。每个RTSP TCP连接都有一个RTSP会话对象与之相对应。RTSPSession对象是一个Task对象,负责处理与RTSP相关的事件。
  • RTP子系统。这些类处理媒体数据的发送。RTPSession对象包含与所有RTSP会话ID相关联的数据。每个RTPSession都是一个Task对象,可以接受核心服务器的调度来进行RTP数据包的发送。RTPStream对象代表一个单独的RTP流,一个RTPSession对象可以和任何数目的RTPStream对象相关联。这两个对象实现了QTSS模块API中的针对RTP的部分。
CommonUtilitiesLib

这个目录含有一个工具箱,包括线程管理,数据结构,网络,和文本解析工具。Darwin流媒体服务器及其相关工具通过这些类对类似或者相同的任务进行抽象,以减少重复代码;这些类的封装简化了较高层次的代码;借助这些类还分离了专用于不同平台的代码。下面是对目录下的各个类的简短描述:

  • OS类。这些类在时间,条件变量,互斥锁,和线程方面提供了专用于不同平台的代码抽象。这些类包括OSOSCondOSMutexOSThread,和OSFileSource;数据结构则包括OSQueueOSHashTableOSHeap,和OSRef
  • 套接口类(Sockets)。这些类为TCPUDP网络通讯方面提供了专用于不同平台的代码抽象。通常情况下,套接口类是异步的(或者说是非阻塞的),可以发送事件给Task对象。这些类有:EventContextSocketUDPSocketUDPDemuxerUDPSocketPoolTCPSocket,和TCPListenerSocket
  • 解析工具。这些类负责解析和格式化文本。包括StringParserStringFormatterStrPtrLen,和StringTranslator
  • Task(任务):这些类实现了服务器的异步事件机制。

 

QTFileLib

流媒体服务器的一个主要特性就是它能够将索引完成(hinted)的QuickTime电影文件通过RTSPRTP协议提供给客户。这个目录包含QTFile库的源代码,包括负责解析索引完成的QuickTime文件的代码。服务器的RTPFileModule通过调用QTFile库来从索引过的QuickTime文件中取得数据包和元数据。QTFile库可以解析下面几种文件类型:.mov.mp4.mov的一种修改版本),和.3gpp.mov的一种修改版本)。

APICommonCode

这个目录包含与API相关的类的源代码,比如moduletils,或者诸如记录文件的管理这样的公共模块函数。

APIModules

这个目录包含流媒体服务器模块目录,每个模块都有一个目录。

RTSPClientLib

这个目录包含实现RTSP客户端的源代码,这些代码可以用于连接服务器,只要该连接协议被支持。

RTCPUtilitiesLib

这个目录包含解析RTCP请求的源代码。

APIStubLib

这个目录包含API的定义和支持文件。

HTTPUtilitiesLib

这个目录包含解析HTTP请求的源代码。

二次开发模块添加的要求

  每个DSS模块必须实现两个函数:一个是Main函数,服务器在启动时将调用这个函数进行必要的初始化。另一个是Dispatch函数,通过实现此函数,服务器可调用DSS模块并完成特定处理。对于编译到服务器里面的模块,其主函数的地址必须传递到服务器的模块Main函数中。

  具体实现时,Main函数必须命名为MyModule_Main,其中MyModule是模块的文件名。此函数的实现通常如下所示:

QTSS_Error MyModule_Main(void* inPrivateArgs){  return _stublibrary_main(inPrivateArgs, MyModuleDispatch);

}

  每个DSS模块都必须提供一个Dispatch函数。服务器为了特定的目的需要使用某个模块时,是通过调用该模块的Dispatch函数来实现的,调用时必须将任务的名称及相应的参数传递给该函数。在DSS中,使用角色(Role)这个术语来描述特定的任务。Dispatch函数的格式如下所示:

  void MyModuleDispatch(QTSS_Role inRoleQTSS_RoleParamPtr inParams)

  其中MyModuleDispatchDispatch函数的名称;MyModule是模块的文件名;inRole是角色的名称,只有注册了该角色的模块才会被调用;inParams则是一个结构体,可用于传递相应的参数。

DSSTS流的支持

DSS进行扩展,以实现对TS流的支持,主要涉及三个方面的问题:

首先,RTSP协议需要支持TS over DVB-C

其次,能够通过UDP协议直接发送TS流;

最后,PTCP的实现,发送的速率需要依据PCR[1](Program ClockReference,即节目时钟参考)实现适当的调节。下面针对这三个方面问题的解决进行简要的说明:

为了让RTSP协议能支持TS传输,需要对标准的RTSP协议做扩展,即在SETUP阶段,终端告诉服务器需要TS传输,服务器会为该终端分配传输资源,并告诉终端相应的参数(包括频点和节目号等)。 当使用扩展后的RTSP协议实现一次TS流点播时,与通常的RTSP交互过程相比,在SETUP阶段有所不同。

为了实现TS流通过Cable下发,关键点是视频服务器能够采用UDP协议将TS流依特定速率发送到播放设备。

采用UDP协议把TS包发送,实现相对比较简单,假定TS包的大小是188字节的,只要遵照一个UDP包不应大于以太网最大传输单元的原则,7TS包打包成一个UDP,发送给播放器设备即可实现。

而依特定的速率发送则要求服务器在发送TS流时,必须保证发送数据的速率与媒体正常播放的速率一致性。考虑到终端会有一个缓冲区来平滑发送数据时可能产生的波动,因此对于发送速率与正常播放速率的一致性的要求并不是绝对的。但发送数据带来的波动要在播放设备许可的范围内,否则无法正常播放。

 

阅读(1715) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~