`
gongminrui
  • 浏览: 63537 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Red5研究

    博客分类:
  • Red5
 
阅读更多

最近因为工作需要,暂停手机视频直播系统的学习和开发,转为完成一个比较急的任务:将从DVR得到的视频通过网页的flash player插件来直播。

    要完成这个任务,首先必须对基于RTMP的流媒体服务器有一定的了解。以前我有花了一段时间学Flash Media Server,不过因为FMS卖得很贵,所以还是用免费的Red5好了。

    读了研究生之后,我就进入了图像处理领域,写程序都是用matlab、C、C++,本来以为本科时候写的7万行java代码要浪费了,现在发现还是挺有用的,因为Red5是java写的。Java代码看起来比C、C++容易。

    下面开始介绍Red5:

Red5是建立在Jetty(servlet engine) , Mina (networking)基础之上的,参考了Terracotta Clustering技术理念,并通过使用Spring框架将起整合起来的。

Jetty是一款运行速度较快轻量级的开源servlet 容器,可以作为嵌入式服务使用。

Mina 是Apache组织下的一个基于 Java NIO 技术的新项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。

Terracotta是开源的Java集群技术。

Spring是轻量级Java企业级开发的事实标准,Red5采用Spring来管理使程序逻辑更加清晰,耦合性更低,扩展性更好。

 

Red5响应请求的流程

(1)Red5在启动时会调用RTMPMinaTransport的start()方法,该方法会开启rmtp的socket监听端口(默认是1935),然后使用Mina 的api 将RTMPMinaIoHandler 绑定到该端口。

(2)RTMPMinaIoHandler 上定义了messageReceived()、messageSent()、sessionOpened()和sessionClosed()等方法,当有socket请求时,相应的方法会被调用。这时RTMPMinaIoHandler 会使用当前的socket连接来创建一个(或者使用之前创建好的)RTMPMinaConnection,并将其作为参数传递给定义于RTMPHandler类上的相应的messageReceived()、messageSent()、connectionOpened()和connectionClosed()方法。

(3)RTMPHandler会调用Server类的lookupGlobal()方法获得当前的GlobalScope,然后再利用GlobalScope找到当前socket请求应该使用的WebScope(这个WebScope 由开发者在WEB-INF\red5-web.xml中定义)。最后,RTMPHandler会调用RTMPMinaConnection 的connect ()方法连接到相应的WebScope。

(4)通常来说,WebScope又会将请求转移给ApplicationAdapter,由它来最终响应请求,而项目中通过重载ApplicationAdapter的方法来实现自己的逻辑。至此,控制流进入了开发者的项目中。

 

ApplicationAdapter类介绍

MultiThreadedApplicationAdapter类,是Red5应用程序的基础类。它提供了操作SharedObjects 和 streams的方法,还有连接和服务列表,是一个应用程序基本的Iscope。它实现了IstreamAwareScopeHandler接口,提供了在应用程序种控制流的方法。它还提供了一个很有用的事件控制器,可以拦截流、授权用户访问等。可以在其子类中添加各种方法,在客户端上通过NetConnection.call()方法调用服务器端的方法。这与Flash Media Server不同,FMS需要将你的客户端方法保存在服务器端,Red5提供更方便的方式进行远程方法调用。

ApplicationAdapter类是MultiThreadedApplicationAdapter的子类。ApplicationAdapter使用单线程的方式进行方法调用的消息出来,所以其性能不如MultiThreadedApplicationAdapter。

这2个类的核心方法为:

public boolean appStart(IScope arg0):Red5应用程序启动时自动执行此方法,进行一些参数初始化,如声明连接数据库的资料等。

public void appStop(IScope arg0):Red5应用程序停止时自动执行此方法。

public boolean appConnect(IConnection arg0, Object[] arg1):当客户端连接本应用程序时自执行此方法。

public boolean appDisconnect(Iconnection conn):当客户端断开连接时自动执行此方法。(如关闭浏览器、关闭FLASH PLAYER等特殊情况,均会触发该方法)。

public boolean appJoin(IClient arg0, IScope arg1):当有新的连接加入进来时自动调用。

获取某客户在服务器端保留/设置的变量:首先要通过Red5.getConnectionLocal()方法获得Iconnection对象,然后调用它的getClient()方法获得Client对象,再通过Client对象的getAttributes(“var_name”) 方法获得对应的变量的值。

 

下面是继承ApplicationAdapter类实现自己的Red5应用程序的代码例子:

 

import org.red5.server.adapter.ApplicationAdapter;

import org.red5.server.api.IClient;

import org.red5.server.api.IConnection;

import org.red5.server.api.IScope;

 

public class Application extends ApplicationAdapter

{

    @Override

  public boolean appStart(IScope arg0)  // 应用程序启动时自动执行

  {

        return super.appStart(arg0);

    }

    @Override

  public void appStop(IScope arg0)  // 应用程序停止时自动执行

  {

        super.appStop(arg0);

    }

    @Override

  public boolean appConnect(IConnection arg0, Object[] arg1)  // 客户端连接本应用程序时自执行

  {

        if(arg1 != null){

            for(Object o:arg1){

               …

            }

        }

        return super.appConnect(arg0, arg1);

    }

    @Override

  public boolean appJoin(IClient arg0, IScope arg1)  // 有新的连接加入进来时自动调用

  {

        //client.setAttribute("username",username);

        //IConnection current = Red5.getConnectionLocal();

        //current.getClient().getAttribute("username")

        //Iterator<IConnection> it=appScope.getConnections();

        //var nc:NetConnection=new NetConnection();

        //nc.connect("rtmp://127.0.0.1/your_app","your_vars");

        return super.appJoin(arg0, arg1);

    }

}

 

 

 

主要API简介

Red5提供了很多接口供开发人员进行二次开发:

IConnection:连接对象。每个连接都有一个关联的客户端和域。连接可能是持续型、轮询型、或短暂型。建立此接口的目的,是为了给不同的子类,如 RTMPConnection,RemotingConnection,AJAXConnection, HttpConnection 等,提供基础通用的方法。它提供getClient()方法来获取客服端对象。

IScope :每个Red5应用程序至少有一个域,用来搭建处理器、环景、服务器之间的连接。域可以构成树形结构,所有客户端都可以作为其节点共享域内的对象(比如流和数据)。所有的客服端(client)通过连接(connection)连接到域中。对于单一域,每个连接对应一个客服端,每个客服端对应一个id,简单的应用,操作就针对一个id和一个连接进行。

IServiceCapableConnection :获取有效连接。代码中先获取到连接实例,然后判断是否是有效连接并强制类型转换,之后调取客户端相应函数。

IClient :客户端对象代表某单一客户端。一个客户端可以和同一主机下不同的域分别建立连接。客户端对象和HTTP session 很相像。可以使用IClientRegistry.newClient(Object[])方法来创建IClient对象。

ApplicationAdapter:ApplicationAdapter是应用层级的IScope。若要处理流进程,需实现 IStreamAwareScopeHandler接口中的相应处理方法。ApplicationAdapter还提供了有效的事件处理机制,来进行截取流、确认用户等操作。同时,其子类中引入的方法均可在客户端通过 NetConnection 调取。在Aodbe 的FMS 中必须在服务器端维护客户端对象,与之相较,Red5 为您的远程请求提供了更加方便快捷的操作方法。

 

Red5开发示例

开发一个Red5 应用的服务器项目,和一般的J2EE 程序相似。进入Red5的webapps目录下,参考doc/templates目录下的myapp 文件夹,新建一个以自己项目命名的文件夹,比如myFirst,并对配置文件做相应的修改。然后开始编写自己的服务器端程序:

 

public class MyApplication extends ApplicationAdapter

{

  private IScope appScope; 

  private String username=””;

 

  // 取得本次连接的Iscope, appStart方法在连接开始时自动触发

  public boolean appStart(IScope app)

  {

    appScope = app;

    return true;

  }

 

  // 连接时触发的函数,定义本过程中的username

  public boolean appConnect(IConnection conn, Object[]params)

  {

    username = (String)params[0];

    return true;

  }

  // 连接加入时触发的函数,写入username的值

  public boolean appJoin(IClient client, IScope app)

  {

    client.setAttribute(”username”,username);

    return true;

  }

  // 客户端登录时调用函数,将返回目前登录的在线列表

  public String login()

  {

    IConnection current = Red5.getConnectionLocal();

    System.out.println(”<—”+current.getClient().getId()+”:”

    +current.getClient().getAttribute(”username”));

    return getOnlineList();

  }

  // 取得在线列表,对在线的客户端进行遍历,并显示。

  public String getOnlineList()

  {

    Iteratorit=appScope.getConnections();

    StringonLineList=””;

    while(it.hasNext())

    {

      IConnectionthis_conn=it.next();

      IClientic=this_conn.getClient();

      Stringu=ic.getAttribute(”username”).toString();

      onLineList+=ic.getId()+”,”+u+”;”;

      System.out.println(u);

    }

    return onLineList;

  }

 

 

 

我们还需要对刚刚完成的程序进行配置,编辑WEB-INF下的red5-web.xml,增加<bean id=”web.handler”  class=”MyApplication”>这样本程序将以刚才写的Application来运行。编辑web.xml,找到webAppRootKey,将其下面的paramvalue标签中的值修改为/myFirst,编辑red5-web.properties,将第一句修改为webapp.contextPath=/myFirst。

这样,在客户端中就可以轻易的调用login()方法了。在FLASH 中新建一个文件,输入以下代码:

 

nc = new NetConnection();

nc.connect(”rtmp:// localhost/myFirst”);

nc.onResult = function(obj)

{

  trace(obj);

}

nc.call(”login”,nc);

 

 

客户端登录服务器,需要调用login方法,服务器便能得到一份客户端的在线列表了。

至于建立和运行一个Red5应用程序的具体过程,这里就不讲了。

分享到:
评论
2 楼 Joburgess 2016-04-25  
[flash=200,200][url][url][img][list]
[*]
引用
[/list][/img][/url][/url][/flash]
             
1 楼 panghaichao 2014-04-03  

相关推荐

    Red5研究学习(1)

    Red5是一款开源的流媒体服务器,它基于几个关键的技术组件构建,包括Jetty、Mina和...通过对Red5的学习和研究,我们可以深入了解流媒体服务的运作机制,并掌握如何利用这些工具来满足各种复杂的在线视频和音频需求。

    red5聊天建议系统

    2. Red5 API:研究Red5提供的Java API,了解如何创建应用程序,监听连接,处理数据流等。 3. ActionScript编程:学习基本的ActionScript语法,熟悉Flash开发者工具,创建与Red5服务器通信的客户端程序。 4. RTMP协议...

    RED5 1.0.6源码

    研究源码时,了解各个模块的职责和协作方式,有助于整体把握RED5的架构设计。 9. **日志与调试**:RED5使用Log4j或其他日志系统进行日志记录,学习如何利用这些工具进行问题排查和性能监控是必不可少的技能。 10. ...

    red5 java源码

    研究Red5的源码,可以学习到以下知识点: 1. **Java多线程编程**:Red5服务器需要处理并发连接,源码中会涉及到线程池、同步机制等多线程编程技术。 2. **网络编程**:包括TCP/IP协议栈的理解,如何处理网络I/O,...

    Red5 Example 实例源码

    Red5是一款开源的Java流媒体服务器,它支持实时流传输协议(RTSP)、实时传输协议(RTP)、实时消息协议(RTMP)以及...通过研究和运行这些示例,你可以深入理解Red5的工作机制,从而在实际项目中有效地利用这个强大的工具。

    red5-server

    Red5 Server是一款开源的流媒体服务器,主要用于处理和分发实时多媒体数据,如视频和音频流。这个"red5-server"项目包含的就是Red5的源代码,对于开发者来说,它是理解流媒体服务工作原理和自定义功能的一个宝贵资源...

    red5chatv2.1 red5建的一个FLASH视频聊天会议例子

    【标题】"red5chatv2.1"指的是一个基于RED5开源流媒体服务器构建的视频聊天和会议应用的版本...通过深入研究源代码,可以了解实时视频通信的实现机制,掌握RED5服务器的使用,以及Flash和PHP在构建多媒体应用中的应用。

    red5入门教程(pdf)

    这个“Red5入门教程”显然是一份面向初学者的指南,旨在帮助那些对Red5感兴趣的人快速掌握其基本概念、安装过程以及如何利用Red5进行流媒体处理。 Red5的核心功能包括视频直播、录制、播放和存储,这些功能使得它在...

    Red5+的安装和使用

    Red5是一款基于Java的开源Flash流媒体服务器,它支持RSTP协议,提供了一系列示例应用,如在线录制、播放、聊天和视频会议等。Red5作为Macromedia商业产品FMS的一个替代方案,具有开源、成本低和可扩展性强的优势。在...

    red5 1.0.7整合tomcat6+maven+oflaDemos

    标题中的"red5 1.0.7整合tomcat6+maven+oflaDemos"涉及到的是一个关于搭建和配置Red5服务器的教程,其中包含了使用Maven构建工具以及OFLA Demos的实践。Red5是一个开源的流媒体服务器,能够处理音频、视频、数据和...

    RED5 入门资料

    标签 "源码" 表明RED5作为一个开源项目,其源代码是公开的,允许开发者进行深入研究、定制或扩展功能。这对于技术爱好者和有特定需求的企业来说是非常有价值的,他们可以修改源代码以适应自己的业务需求。 "工具" ...

    flex + red5 简单实例

    通过研究这个实例,开发者可以了解如何在Flex客户端中创建RTMP连接,发送和接收数据,以及如何在Red5服务器上创建和管理这些连接。这有助于开发者深入理解Flex与Red5之间的交互机制,为构建更复杂的多媒体应用奠定...

    red5的oflaDemo

    Red5是一款开源的Java流媒体服务器,它支持实时流传输协议(RTSP)、实时传输协议(RTP)、实时消息协议(RTMP)以及HLS、H.264等多种流媒体格式,使得开发者能够创建丰富的多媒体应用。"oflaDemo"是Red5服务器附带的一个...

    Red5 Pro---Android demo

    **Red5 Pro——Android 应用程序演示** ...通过研究这个示例项目,开发者可以深入理解如何在Android应用中集成Red5 Pro,实现视频直播功能,同时也可以参考其架构设计和最佳实践,提升自己的开发技能。

    red5 server 1.0.10-M7 源码

    Red5 Server是一款开源的流媒体服务器,主要支持RTMP(Real-Time Messaging Protocol)协议,用于实时音频、视频的传输和互动应用。这个1.0.10-M7版本的源码包提供了Red5 Server的最新开发成果,相较于CSDN上的一些...

    【red5】实现点播-直播功能

    Red5是开源的,因此你可以深入研究其源码,了解其工作原理,甚至可以根据需要进行定制开发。这为开发者提供了更大的灵活性和可扩展性。 总结,Red5提供了一套完整的解决方案来实现点播和直播功能,开发者可以通过...

    Red5 Java 端聊天室代码

    在这个名为"Red5 Java 端聊天室代码"的压缩包中,包含的是一个使用Red5服务器构建的聊天室应用的源代码。下面我们将深入探讨Red5服务器、Java编程以及聊天室应用的相关知识点。 1. **Red5服务器** - Red5是一个...

    red5入门教程.....

    ### Red5入门教程知识点解析 #### 一、Red5介绍及安装 1. **Red5概述**:Red5是一款基于Java开发的...通过以上知识点的学习,初学者可以全面了解Red5的核心功能和应用开发流程,为后续深入研究和实践打下坚实的基础。

    RED5多人会议源码

    在多人会议系统中,RED5作为一个核心组件,能够处理音视频数据的录制、播放以及多用户间的互动交流。基于FLEX的客户端界面可以提供丰富的用户交互体验,FLEX是一种基于ActionScript 3.0的开发框架,用于创建富互联网...

    流媒体服务器Red5的扩展设计、测试与优化

    论文通过实验研究,对Red5服务器进行了深入的技术分析,提出的扩展设计、测试与优化方法对于改善Red5服务器的性能以及在不同应用中的适用性有着重要的参考价值。 在此基础上,Red5的未来发展可能会在与现代流媒体...

Global site tag (gtag.js) - Google Analytics