RED5简介
2.1 挑战FMS在介绍RED5之前,有必要先介绍一下Flash Media Server:v Flash Media Server,简称FMS,是Flash大家庭里的一员,被称为是目前开发Web音视频应用程序(比如,视频聊天室、视频会议系统、播客系统、音视频留言等等)的最方便最快捷的解决方案。也在web应用程序开发上有着越来越广泛的应用。§ 典型应用:YouTube、土豆网v FMS如此的优良功能当然并不是免费提供给广大用户的,几千美金每个点的价格让很多开发人员望而却步。于是,开源的Red5成为人们的新宠。2.2 RED5-穷人的流媒体服务器v Red5是一个采用Java开发的开源的Flash流媒体服务器,功能上与FMS类似。它支持:v 把音频(MP3)和视频(FLV)转换成播放流;v 录制客户端播放流(只支持FLV);v 共享对象;v 现场直播流发布;v 远程调用。v Red5使用RSTP作为流媒体传输协议,在其自带的一些示例中实现了v 在线录制v flash流媒体播放v 在线聊天v 视频会议2.3 RED5中的几个个重要概念和模型2.3.1 scopeRed5中,所有资源形成一颗树,每一个节点被称为scope,如果该节点是个叶子节点,那它被称为BasicScope,如果该节点还有子节点,那它被 称为Scope。Red5里有两种预先定义好的BasicScope:SharedObject Scope和BroadcastStream Scope。每一个应用都有自己的Scope等级体系,根就是WebScope(即此应用的实例)。Red5定义了一个全局scope意在提供一个通用的资源供各个应 用共享,称之为GlobalScope。GlobalScope是所有的WebScope的父节点,其余的中间scopes都是Scope的实例。每一个 scope有一个名称。GlobalScope的名称是:default。每一个WebScope的名字就是该应用上下文的名称。中间的Scope的名字 就是它所在路径的名称。SharedObject Scope的名字就是SharedOjbect的名字,BroadcastStream Scope的名字就是Stream的名字。除了GlobalScope和BasicScopes外,其余scope都可以被一个client连接。一个客户端请求连接的结果会被用来创建一个 Scop对象.例如:一个客户端请求一个连接来连oflaDemo/room0,而此时room0的scope并未存在,当创建了这个连接后,room0 的scope被创建了,如果请求的url里包含了中间多个scope,所有的scope都会相应地被创建。比如:url为:oflaDemo/lobby0/room0,此时room0和lobby0都不存在,那他们都会被相应的创建,然后,连接指向了room0这个scope。2.3.2 context一个Context是和一个Scope对象绑定在一起的,它用来给scope object提供额外的功能.Context对象可以通过IContext.getScope()来获得.Context包装了spring的 application context,因此,spring里声明的各种bean在此都可以使用.Context可以被继承.这就是说一个Scope可以继承它的父节点的Context而无需自己在定义一个context,只有GlobalScope和WebScope必须使用它们自己的Context对象.“Scopes ”和“Contexts”是开发red5重要概念。每个application 在Red5中 仅仅只有一个 Context。 Context 类实现了接口 IContext。 context 实例对象由Java Spring framework 初始化,它提供作用路径映射和不同服务接口。每个application只有一个context 和一个WebScope,WebScope 的名称和 context 的路径配置相关,它们名称虽相同但意义不同。2.3.3 application利用red5创建的任何应用常常都和“application”有关,applications 是建立在flash 客户端和red5 服务之间以任何形式交互的基础和基本概念。术语 “application” 来源于 Flash Media Server (FMS), Adobe 研发用于和 flash 客户端通信的软件。 red5 使用更复杂模式来处理flash 客户端的请求,red5 使用类似于搭积木组合方式来模拟 FMS的application“ 概念;简而言之,如你在red 创建以一个 “application” ,那么同时创建了 一个WebScope( scope 的一种)、一个 Context 和一个 handler。树的根-RootScope-存在于所有的 applications 当中(所有的applications 都可以访问),RootScope 代码命名为 “default”,它是 类 GlobalScope 的一个实例主要为applications提供通用的共享资源。RootScope 隐含为其他 Scope 之上的 Scope,也就说不能被任何连接的客户端直接命名。RootScope 直接下级 scope 是一系列特别的 scopes ,每一个 scope 代表了 red5 服务器运行的一个 application, 这些scope 命名和 application 上下文命名一致,这些scope 是类 WebScope 的一个实例,因为这些 scope 命名和 application 上下文命名一致导致很难区分它们,事实上他们是完全不同的两个东西。WebScope 下面的节点,稍微有些不同,每一个 WebScope 被运行它的 red5服务器显示的定义; 每一个WebScope 拥有自己的配置文件,并且可以看做是独立的application。如果想创建 WebScope 作用域你需要在red5 下创建application 目录和配置文件。在 WebScope 下创建指定的作用域,指定的作用域就会被动态的创建(如果指定作用域没有被创建)。例如,假如没有一个应用没有创建“myApp” 的作用域。某个 flash 客户端 连接到 “rtmp://red5serverHostname/myApp/aaa/bbb/ccc”red5 会检查 “aaa” 是否已经存在,如果不存在就创建”aaa” 作用域,同理 “bbb” 和 “ccc”。每一个WebScope之下的动态作用域命名和给定的连接路径名称一致,例如上面的例子,作用域的名称分别是‘aaa’, ‘bbb’, 和’ccc’ 。这些作用域 分别由 Scope 类 或者 BasicScope 类来实例化。没有子节点的叶子节点通常由 BasicScope 类实例化,非子节点由 Scope 类实例化。这些作用域都为flash 客户端提供功能调用,但是当flash 客户端连接到叶子域时,叶子域提供更有用的功能调用。例如,”ccc” 域可以提供在线流连接或者 “shared object” 连接,并允许多个flash客户端数据共享。2.3.4 Handler现在,我们有了如何让flash 客户端怎样去连接的scope 系统,有了来映射作用域请求的context,和服务应用代码。这些代码位于 Handler。handler是red5 application 主要功能的实现,它实现了客户端连接和断开连接的方法,实现了客户端远程调用(RPC)的方法。application 的初始化入口是从实例化WebScope类开始的。当客户端连接这个application,red5 需要调用WebScope 类多个方法来初始化。因此 application’s handler 需要实现 IScopeHandler 接口 ,这个接口定义red5 必须要调用的方法。handler 由这些开发red5应用的创建,通常也需要扩展 red5 已经实现的 ApplicationAdapter 类 或者 MultiThreadedApplicationAdapter 类,这些类已经实现了基本的 handler 功能,并且实现了必须实现的IScopeHandler 接口。
页:
[1]