`
jayjayjays
  • 浏览: 209541 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

从FCS/FMS迁移到red5的指南(1)

    博客分类:
  • flex
阅读更多

migration guide form FCS/FMS  to red 5 :: FCS/FMS迁移到red5的指南

 

Author: Joachim Bauch  tranlater:yapollo.li  email:yapollo.li@gmail.com

作者:Joachim Bauch   翻译:yapollo.li 

 

Contents内容介绍:

 

 

 

 

 

 

 

 

序文:

这篇文档描述了 fcs/fmsred5之间的API(应用程序接口)的不同,目的在于帮助那些已经存在于FCS/FMS的应用程序迁移到RED5上,如果你还没有点red5经验,请阅读这方面的指南howto create new applications

应用程序回调

在实现服务器端应用程序的时候一个重要的功能就是通告客户端是否链接,以及当应用程序有新的实例创建的时候能够通知该消息。

Interface IScopeHandler

Red5在接口 IScopeHandler 指定了这些动作  大家可以看它的api文档去进一步了解细节

 

Class ApplicationAdapter

ApplicationAdapter 类介绍:

因于一次请求中一些方法可能被重复的调用(比如:一旦有新客户端链接产生的时,connect方法就会被调用),所以这个类ApplicationAdapter 中定义了许多附加的方法事件

这个类通常被新的应用程序用作基础类

下面是一个一览表,它显示了FCS/FMS应用程序类和red5ApplicationAdapter方法的对比

FCS / FMS                  Red5

 

onAppStart                  appStart roomStart

onAppStop                             appStop roomStop

appConnect                            roomConnect appJoin roomJoin

onDisconnect                                appDisconnect roomDisconnect appLeave roomLeave

 

你也可以使用ApplicationAdapter去核对流媒体对象,共享对象,或者预定义他们。关于进一步的细节可以参考它的api文档

app做前缀的方法,是在主应用程序中被调用滴,以room做前缀的方法是在应用程序的房间(也就是实例中)被调用

 

 

链接方法的执行命令

假设你要链接rtmp://server/app/room1/room2

首先 ,建立连接,那么所有链接到room2的用户都能被全部显示,

  1. app (-> appConnect)
  2. room1 (-> roomConnect)
  3. room2 (-> roomConnect)

 

在连接被建立后,客户端对象能被取回,并且如果它(指取回的客户端对象)是第一个被客户端连接到这个作用域的,他就加入该作用域

  1. app (-> appJoin)
  2. room1 (-> roomJoin)      
  3. room2 (-> roomJoin)

 

如果在同一作用域内一个用户建立了第二个(或者多余)链接,那么只有这些连接方法被调用,如果你连接到部分相同作用域内,那么只有部分加入方法被调用

比如:连接 rtmp://server/app/room1/room3 将会触发下面的语句

  1. appConnect("app")
  2. joinConnect("room1")
  3. joinConnect("room3")
  4. roomJoin("room3")

appStart 方法在开启red5服务的时候,当前只能被调用一次,

roomStart 方法在第一个客户端连接到房间的时候被调用

 

接受,拒绝客户端

FCS/FMS 提供了如acceptConnection rejectConnection的方法去接受和拒绝新的客户端。对Red5应用程序,允许客户端连接,没有专门的动作是必须得在这种情况下后缀为Connect的方法只是需要返回true

如果客户端不允许去连接,在ApplicationAdapter 类中的rejectClient方法将会被调用,任何被传递给rejectClient的参数都是有效滴,会被看做状态对象的应用程序的属性从而被回调函数返回

 

当前的连接和客户端访问

Red5支持两种不同的方法,从被调用函数中访问当前的连接对象,这个连接对象能被用于获取活跃的客户端和他被连接的作用域。第一个使用 Red5 对象

代码如下:

import org.red5.server.api.IClient;
import org.red5.server.api.IConnection;
import org.red5.server.api.IScope;
import org.red5.server.api.Red5;
 
public void whoami() {
    IConnection conn = Red5.getConnectionLocal();
    IClient client = conn.getClient();
    IScope scope = conn.getScope();
    // ...
}

第二种需要这个方法被定义一个IConnection类型的参数,同时当一个客户端调用该方法时第一个参数会被red5自动添加,代码如下:

import org.red5.server.api.IClient;
import org.red5.server.api.IConnection;
import org.red5.server.api.IScope;
 
public void whoami(IConnection conn) {
    IClient client = conn.getClient();
    IScope scope = conn.getScope();
    // ...
}

Additional handlers

附加事件的处理

对于许多应用程序而言,已经存在的类包含的应用程序逻辑(指那些和red5不相关的)是必须被重复使用的,为了能对那些通过RTMP连接的客户端有效,这些类需要在Red5中作为事件注册。

当前有两个方法去注册这些事件:

1.    通过配置文件去增加他们

2.    通过手工从应用程序中注册他们

这些事件被客户端调用执行的示例代码如下:

nc = new NetConnection();
nc.connect("rtmp://localhost/myapp");
nc.call("handler.method", nc, "Hello world!");

如果一个事件处理器被请求,Red5总是会在检测配置文件环境中的设置的事件处理器之前先去在客户端的作用域范围内寻找它。

Handlers in configuration files

在配置文件中处理事件

这种方法更适用于那些对所有作用域的程序都运行的常见事件

下面是一个事件处理的例子,它的作用是去注册类com.fancycode.red5.HandlerSample

下面的bean 需要加入WEB-INF/red5-web.xml的文件中。

<bean id="sample.service" 
      class="com.fancycode.red5.HandlerSample" 
      singleton="true" />

Note that the id of the bean is constructed as the name of the handler (heresample) and the keyword service.

注意这个beanid 被构建作为处理器程序和关键字服务的名字

 

 

Handlers from application code

在应用程序中用代码注册事件处理

不同作用域的应用程序使用不同的事件处理,如果想去更改它们,就需要在服务端的代码中注册他们。写在服务端的这些事件处理总会覆盖在red5-web.xml中配置的事件。这些已经注册过的必要函数被命名在IServiceHandlerProvider中,当然IServiceHandlerProviderApplicationAdapter类中实现哈

如同上面描述的类文件能被用代码注册的例子如下:

public boolean appStart(IScope app) {
    if (!super.appStart(scope))
        return false;
    
    Object handler = new com.fancycode.red5.HandlerSample();
    app.registerServiceHandler("sample", handler);
    return true;
}
 
注意:在这个例子中,只是这个应用程序的作用域有sample处理程序,而不是子作用域,如果想这个处理程序同样在
房间中起作用,必须在房间的作用域内的
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics