- 浏览: 497250 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (185)
- job (15)
- linux/windows/unix/bash/shell (31)
- JAVA/J2EE/spring/hibernate/struts (30)
- VC/C++ (48)
- mysql/postgresql (6)
- php/jsp/asp/pear (1)
- FMS/flex/openlaszlo/red5/openmeetings (34)
- apache/tomcat/ftp/svn (6)
- xen/vm/Hadoop/cloudcompute (6)
- visual studio/eclipse/zendstudi/ant (8)
- others (1)
- windows异常处理 __try __except (1)
- (1)
- matlab (4)
- android (0)
最新评论
-
hongzhounlfd:
很透彻,很详细
依赖注入和控制反转 -
jefferyqjy:
谢谢~言简意赅~很明了!
依赖注入和控制反转 -
elderbrother:
太好了,谢谢
依赖注入和控制反转 -
east_zyd_zhao:
终于搞明白了
依赖注入和控制反转 -
Dremeng:
完美,一看就懂理解透彻
依赖注入和控制反转
Red5如何响应rmpt的请求,中间涉及哪些关键类?
响应请求的流程如下:
1.Red5在启动时会调用RTMPMinaTransport的start()方法,该方法会开启rmtp的socket监听端口(默认是1935),然后使用mina(apache的io操作类库)的api将RTMPMinaIoHandler绑定到该端口。
2.RTMPMinaIoHandler上定义了messageReceived、messageSent、sessionOpened和sessionClosed等方法,当有socket请求时,相应的方法会被调用,这时RTMPMinaIoHandler会使用当前的socket连接来创建一个RTMPMinaConnection(或者使用一个之前创建好的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的方法来实现自己的逻辑。
简单的流程图:
- RTMPMinaIoHandler
- |--[delegate method call and pass RTMPMinaConnection to]-->RTMPHandler
- |--[call lookupGlobal method]-->Server
- |--[use globalScope to lookup webScope]-->GlobalScope
- |--[call connect method and pass WebScope to]-->RTMPMinaConnection
RTMPMinaIoHandler |--[delegate method call and pass RTMPMinaConnection to]-->RTMPHandler |--[call lookupGlobal method]-->Server |--[use globalScope to lookup webScope]-->GlobalScope |--[call connect method and pass WebScope to]-->RTMPMinaConnection
Red5如何启动?在它的启动过程中如何初始化这些关键类?
这里探讨的是Red5 standalone的启动过程(也就是我们执行red5.bat),关于Red5如何在tomcat中启动,目前仍在研究中。
Red5启动过程如下:
1.编辑red5.bat,找到关键的一行:
- C:\Program Files\Java\jre1.5.0_15\bin\java"
- -Djava.security.manager
- -Djava.security.policy=conf/red5.policy
- -cp red5.jar;conf;bin org.red5.server.Standalone
C:\Program Files\Java\jre1.5.0_15\bin\java" -Djava.security.manager -Djava.security.policy=conf/red5.policy -cp red5.jar;conf;bin org.red5.server.Standalone
可以看到它是调用org.red5.server.Standalone作为程序启动的入口,这也是为什么使用eclipse在debug模式下启动Standalone就可以调试Red5代码。需要注意的是,如果你要调试Red5,记得除了源代码(src)之外,把conf和webapps两个文件夹都拷入项目中,并把conf加入classpath。
2.观察Standalone的main方法,你会看到它使用spring的ContextSingletonBeanFactoryLocator来载入classpath下面的red5.xml,注意ContextSingletonBeanFactoryLocator还会在下面的步骤中被使用,由于它是singleton的,所以保证了我们自己的项目中定义的bean可以引用red5.xml中定义的bean,这个下面会有介绍。
- try {
- ContextSingletonBeanFactoryLocator.getInstance(red5Config).useBeanFactory("red5.common");
- } catch (Exception e) {
- // Don't raise wrapped exceptions as their stacktraces may confuse people...
- raiseOriginalException(e);
- }
try { ContextSingletonBeanFactoryLocator.getInstance(red5Config).useBeanFactory("red5.common"); } catch (Exception e) { // Don't raise wrapped exceptions as their stacktraces may confuse people... raiseOriginalException(e); }
3.查看red5.xml,这个文件首先定义了指向classpath:/red5-common.xml的名字为“red5.common”的BeanFactory,注意它会是整个BeanFactory层次中的根节点,所以在red5-common.xml中定义的bean可以被其他地方所引用。
- <bean id="red5.common" class="org.springframework.context.support.FileSystemXmlApplicationContext">
- <constructor-arg><list><value>classpath:/red5-common.xml</value></list></constructor-arg>
- </bean>
<bean id="red5.common" class="org.springframework.context.support.FileSystemXmlApplicationContext"> <constructor-arg><list><value>classpath:/red5-common.xml</value></list></constructor-arg> </bean>
这里我们主要留意red5-common.xml中定义的类型为org.red5.server.Server的“red5.server”,它会在接下来很多地方被用到。
<bean id="red5.server" class="org.red5.server.Server"/>
4.回到red5.xml,接着定义指向classpath:/red5-core.xml的名字为“red5.core”的BeanFactory,注意“red5.core”是以“red5.common”为parent context。
- <bean id="red5.core" class="org.springframework.context.support.FileSystemXmlApplicationContext">
- <constructor-arg><list><value>classpath:/red5-core.xml</value></list></constructor-arg>
- <constructor-arg><ref bean="red5.common" /></constructor-arg>
- </bean>
<bean id="red5.core" class="org.springframework.context.support.FileSystemXmlApplicationContext"> <constructor-arg><list><value>classpath:/red5-core.xml</value></list></constructor-arg> <constructor-arg><ref bean="red5.common" /></constructor-arg> </bean>
查看red5-core.xml,这个文件主要定义了之前说过的RTMPMinaTransport,RMTPMinaIoHandler和RTMPHandler这些类的Bean。对于RTMPMinaTransport,注意init-method="start"这段代码,这说明RTMPMinaTransport的start方法会在该Bean初始化时调用,正如上面提到的,该方法会做开启1935端口,绑定RTMPMinaIoHandler到该端口等等的操作。对于RTMPHandler,注意它的server属性通过“red5.server”引用了定义在parent context(red5-common.xml)上面的Server,通过它RTMPHandler能够找到GlobalScope,进而找到WebScope。
- <!-- RTMP Handler -->
- <bean id="rtmpHandler"
- class="org.red5.server.net.rtmp.RTMPHandler">
- <property name="server" ref="red5.server" />
- <property name="statusObjectService" ref="statusObjectService" />
- </bean>
- <!-- RTMP Mina IO Handler -->
- <bean id="rtmpMinaIoHandler"
- class="org.red5.server.net.rtmp.RTMPMinaIoHandler">
- <property name="handler" ref="rtmpHandler" />
- <property name="codecFactory" ref="rtmpCodecFactory" />
- <property name="rtmpConnManager" ref="rtmpMinaConnManager" />
- </bean>
- <!-- RTMP Mina Transport -->
- <bean id="rtmpTransport" class="org.red5.server.net.rtmp.RTMPMinaTransport" init-method="start" destroy-method="stop">
- <property name="ioHandler" ref="rtmpMinaIoHandler" />
- <property name="address" value="${rtmp.host}" />
- <property name="port" value="${rtmp.port}" />
- <property name="receiveBufferSize" value="${rtmp.receive_buffer_size}" />
- <property name="sendBufferSize" value="${rtmp.send_buffer_size}" />
- <property name="eventThreadsCore" value="${rtmp.event_threads_core}" />
- <property name="eventThreadsMax" value="${rtmp.event_threads_max}" />
- <property name="eventThreadsQueue" value="${rtmp.event_threads_queue}" />
- <property name="eventThreadsKeepalive" value="${rtmp.event_threads_keepalive}" />
- <!-- This is the interval at which the sessions are polled for stats. If mina monitoring is not enabled, polling will not occur. -->
- <property name="jmxPollInterval" value="1000" />
- <property name="tcpNoDelay" value="${rtmp.tcp_nodelay}" />
- </bean>
<!-- RTMP Handler --> <bean id="rtmpHandler" class="org.red5.server.net.rtmp.RTMPHandler"> <property name="server" ref="red5.server" /> <property name="statusObjectService" ref="statusObjectService" /> </bean> <!-- RTMP Mina IO Handler --> <bean id="rtmpMinaIoHandler" class="org.red5.server.net.rtmp.RTMPMinaIoHandler"> <property name="handler" ref="rtmpHandler" /> <property name="codecFactory" ref="rtmpCodecFactory" /> <property name="rtmpConnManager" ref="rtmpMinaConnManager" /> </bean> <!-- RTMP Mina Transport --> <bean id="rtmpTransport" class="org.red5.server.net.rtmp.RTMPMinaTransport" init-method="start" destroy-method="stop"> <property name="ioHandler" ref="rtmpMinaIoHandler" /> <property name="address" value="${rtmp.host}" /> <property name="port" value="${rtmp.port}" /> <property name="receiveBufferSize" value="${rtmp.receive_buffer_size}" /> <property name="sendBufferSize" value="${rtmp.send_buffer_size}" /> <property name="eventThreadsCore" value="${rtmp.event_threads_core}" /> <property name="eventThreadsMax" value="${rtmp.event_threads_max}" /> <property name="eventThreadsQueue" value="${rtmp.event_threads_queue}" /> <property name="eventThreadsKeepalive" value="${rtmp.event_threads_keepalive}" /> <!-- This is the interval at which the sessions are polled for stats. If mina monitoring is not enabled, polling will not occur. --> <property name="jmxPollInterval" value="1000" /> <property name="tcpNoDelay" value="${rtmp.tcp_nodelay}" /> </bean>
5.再次回到red5.xml,接下来定义类型为org.red5.server.ContextLoader的bean,并在初始化后调用它的init方法。
- <bean id="context.loader" class="org.red5.server.ContextLoader" init-method="init">
- <property name="parentContext" ref="red5.common" />
- <property name="contextsConfig" value="red5.globals" />
- </bean>
<bean id="context.loader" class="org.red5.server.ContextLoader" init-method="init"> <property name="parentContext" ref="red5.common" /> <property name="contextsConfig" value="red5.globals" /> </bean>
查看该方法的源代码,可以看到它会读取在classPath下面的red5.globals文件,对于每一行初始化一个以“red5.common”为parent context的BeanFactory,具体来说,现在red5.globals中只有一行default.context=${red5.root}/webapps/red5-default.xml,那么会创建一个名字为“default.context”的指向webapps/red5-default.xml的Bean Factory,它以“red5.common”为parent context。
- protected void loadContext(String name, String config) {
- log.debug("Load context - name: " + name + " config: " + config);
- ApplicationContext context = new FileSystemXmlApplicationContext(
- new String[] { config }, parentContext);
- contextMap.put(name, context);
- // add the context to the parent, this will be red5.xml
- ConfigurableBeanFactory factory = ((ConfigurableApplicationContext) applicationContext)
- .getBeanFactory();
- // Register context in parent bean factory
- factory.registerSingleton(name, context);
- }
protected void loadContext(String name, String config) { log.debug("Load context - name: " + name + " config: " + config); ApplicationContext context = new FileSystemXmlApplicationContext( new String[] { config }, parentContext); contextMap.put(name, context); // add the context to the parent, this will be red5.xml ConfigurableBeanFactory factory = ((ConfigurableApplicationContext) applicationContext) .getBeanFactory(); // Register context in parent bean factory factory.registerSingleton(name, context); }
查看red5-default.xml,发现它主要是定义了GlobalScope的bean,然后把它注册到“red5.server”上。
- <bean id="global.scope" class="org.red5.server.GlobalScope" init-method="register">
- <property name="server" ref="red5.server" />
- <property name="name" value="default" />
- <property name="context" ref="global.context" />
- <property name="handler" ref="global.handler" />
- <property name="persistenceClass">
- <value>org.red5.server.persistence.FilePersistence</value>
- </property>
- </bean>
<bean id="global.scope" class="org.red5.server.GlobalScope" init-method="register"> <property name="server" ref="red5.server" /> <property name="name" value="default" /> <property name="context" ref="global.context" /> <property name="handler" ref="global.handler" /> <property name="persistenceClass"> <value>org.red5.server.persistence.FilePersistence</value> </property> </bean>
6.继续看red5.xml,最后定义类型为org.red5.server.jetty.JettyLoader的bean,并且在初始化后调用它的init方法,查看该方法源代码,很明显它是初始化并且启动jetty这个web server。
- <bean id="jetty6.server" class="org.red5.server.jetty.JettyLoader" init-method="init" autowire="byType" depends-on="context.loader">
- <property name="webappFolder" value="${red5.root}/webapps" />
- </bean>
<bean id="jetty6.server" class="org.red5.server.jetty.JettyLoader" init-method="init" autowire="byType" depends-on="context.loader"> <property name="webappFolder" value="${red5.root}/webapps" /> </bean>
7.到了这里似乎所有的初始化和启动都完毕了,但是问题就来了,这里仅仅定义了RTMPMinaIoHandler,RTMPHandler,Server和GlobalScope,但是在我们之前提到过的Red5响应rmpt的请求的过程中,还需要有WebScope来最终处理RTMPMinaConnection,这个WebScope又是怎么配置并且加进来的呢?
8.查看webapps下的项目,这里以oflaDemo为例,查看WEB-INF下面的web.xml,发现有以下三个参数contextConfigLocation,locatorFactorySelector和parentContextKey,同时还有一个org.springframework.web.context.ContextLoaderListener。
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>/WEB-INF/red5-*.xml</param-value>
- </context-param>
- <context-param>
- <param-name>locatorFactorySelector</param-name>
- <param-value>red5.xml</param-value>
- </context-param>
- <context-param>
- <param-name>parentContextKey</param-name>
- <param-value>default.context</param-value>
- </context-param>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/red5-*.xml</param-value> </context-param> <context-param> <param-name>locatorFactorySelector</param-name> <param-value>red5.xml</param-value> </context-param> <context-param> <param-name>parentContextKey</param-name> <param-value>default.context</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
查看这个listener的javadoc,其实这个listener会在web app(就是我们自己的项目)启动时,创建一个指向contextConfigLocation(其实就是WEB-INF\red5-web.xml)的Bean Factory,同时为它设置parent context。这个parent context实际上是使用locatorFactorySelector找到ContextSingletonBeanFactoryLocator,进而使用parentContextKey找到定义在这个locator里面的Bean Fanctory,由于ContextSingletonBeanFactoryLocator是singleton的,所以这个ContextSingletonBeanFactoryLocator对象跟我们在第2步中拿到的对象是一样的,而由于parentContextKey被设置成“default.context”,这就意味着该parent context是第5步中定义的名为“default.context”的Bean Factory。基于以上的参数,我们得到这样一个Bean Factory的链条,由上至下分别是
conf\red5-common.xml -> webapps\red5-default.xml -> webapps\oflaDemo\WEB-INF\red5-web.xml
这就使得red5-web.xml可以使用red5-common.xml和red5-default.xml中定义的bean。
9.最后查看webapps\oflaDemo\WEB-INF\red5-web.xml,它定义了类型为org.red5.server.WebScope的bean,初始化了它的server(指向“red5.server”),parent(指向“global.scope”)等属性,最后调用它的register方法初始化,查看该方法源代码,发现它会把自己注册到GlobalScope上面,至此所有的关键类的初始化完毕。
- <bean id="web.scope" class="org.red5.server.WebScope" init-method="register">
- <property name="server" ref="red5.server" />
- <property name="parent" ref="global.scope" />
- <property name="context" ref="web.context" />
- <property name="handler" ref="web.handler" />
- <property name="contextPath" value="${webapp.contextPath}" />
- <property name="virtualHosts" value="${webapp.virtualHosts}" />
- </bean>
<bean id="web.scope" class="org.red5.server.WebScope" init-method="register"> <property name="server" ref="red5.server" /> <property name="parent" ref="global.scope" /> <property name="context" ref="web.context" /> <property name="handler" ref="web.handler" /> <property name="contextPath" value="${webapp.contextPath}" /> <property name="virtualHosts" value="${webapp.virtualHosts}" /> </bean>
Spring beanFactory 的层次图
- conf\red5-common.xml
- |-- conf\red5-core.xml
- |-- webapps\red5-default.xml
- |-- webapps\root\WEB-INF\red5-web.xml
- |-- webapps\SOSample\WEB-INF\red5-web.xml
- |-- webapps\oflaDemo\WEB-INF\red5-web.xml
conf\red5-common.xml |-- conf\red5-core.xml |-- webapps\red5-default.xml |-- webapps\root\WEB-INF\red5-web.xml |-- webapps\SOSample\WEB-INF\red5-web.xml |-- webapps\oflaDemo\WEB-INF\red5-web.xml
看清了Red5 Standalone的启动过程,感觉为了实现自定义项目集成到Red5的核心服务上,Red5 Standalone非常依赖于spring的多个Bean Factory之间的复杂层次关系,之所以Red5能建立这样一种层次关系,是因为它能够控制jetty这样一个嵌入式的web server。问题在于,一旦Red5需要作为一个web app运行在类似Tomcat这样的独立的web server上面,那么整个过程就很不一样了,所以后很多东西都要改,我想这也是为什么Red5 0.8 RC1为什么只有安装版但还没有war版的原因。
发表评论
-
Red5安装和配置
2011-02-24 10:23 4048Red5安装和配置参考网页:http://www.cahblo ... -
基于Moodle平台的网站调查报告
2011-02-24 10:18 2576基于Moodle平台的网站调查报告 网站举例: ² 西南 ... -
moodle插件模块功能汇总
2011-02-24 10:03 5013Moodle官方提供654种插件或者模块moodle.org ... -
moodle 一体包安装手册(window)
2011-02-24 09:55 1285见附件 -
moodle中上传文件大小控制
2011-02-24 09:51 1843第一步:修改在php4下POST文件大小的限制1.编修php. ... -
linux下面安装moodle
2011-02-24 09:50 20861. 安装moodle运行 ... -
OpenMeetings安装文档
2011-02-15 11:09 2603OpenMeetings 是一个多语言可定制的视频会议和协作系 ... -
Compilation and Execution (openlaszlo)
2010-11-22 11:02 10507. Compilation and Exe ... -
Combining Tags and Script in LZX Programs (openlaszlo)
2010-11-22 11:01 13216. Combining Tags and ... -
Data Access, Manipulation, and Binding (openlaszlo)
2010-11-22 10:33 11985. Data Access, Manipu ... -
Constraints(openlaszlo)
2010-11-22 10:18 1126constraint 表示可变的变量赋值形式 In LZX, ... -
Events and Methods (openlaszlo)
2010-11-22 09:35 13743. Events,Methods ,han ... -
Dimdim&Moodle安装配置文档节选
2010-11-09 17:40 2551Dimdim&Moodle安装配置文档节选 ... -
red5的eclipse插件和用法
2010-10-30 20:56 1142参见http://www.red5.org/wiki/Red5 ... -
red5集群分析
2010-10-28 19:42 50301. 边(Edge ): 1. 边的主要作用是管理连接,并可以 ... -
red5源代码分析
2010-10-26 08:59 3869Red5如何响应rmpt的请求 ... -
创建第一个red5程序
2010-10-25 15:33 21501.下载最新版本的RED5 http://osflash.or ... -
openlaszlo中多媒体组件介绍
2010-10-14 15:50 1130在openlaszlo中我们可以处理图像,音视频等媒体文件。详 ... -
openlaszlo组件的简单介绍
2010-10-14 15:50 1293openlaszlo组件的简单介绍 收藏 在写laszlo ... -
创建一个简单的openlaszlo程序
2010-10-14 15:49 1073前面说到过openlaszlo程序是一组xml格式和javas ...
相关推荐
RMPT常被用来实现实时流媒体,例如将手机拍摄的视频实时推送到服务器,这里提到的是使用RMPT将Android设备上的视频实时上传到Red5服务器。 Red5是一款开源的流媒体服务器,它支持RTMP(Real-Time Messaging ...
【标题】"android-rmpt-red5-web" 涉及的是一个Android应用程序与Red5服务器之间的交互,主要关注实时多媒体传输(RMT)技术在Web服务端的应用。Red5是一个开源流媒体服务器,能够处理视频、音频流以及数据应用。在...
本项目是由springboot构建的red5流媒体服务器。服务添加了hls支持http请求支持。red5_hls是对red5的1.1.1版本进行springboot整合,整合后直接使用springboot进行启动和管理。打jar包运行。目前通过实时推流测试。该...
同时,RED5利用了Java的Servlet技术,对于理解服务器如何处理请求和响应也有帮助。 3. **Spring框架**:RED5利用Spring框架进行依赖注入和配置管理,学习Spring的核心概念如IoC(控制反转)和AOP(面向切面编程)将...
这通常涉及到修改Red5的启动脚本和配置文件,使其适应Web容器的运行方式。 4. **部署到Tomcat**:将修改后的Red5应用打包成WAR文件,然后将其放入Tomcat的`webapps`目录下。Tomcat会自动检测并解压WAR文件,启动Red...
Red5是一款开源的流媒体服务器,它支持实时流传输协议(RTMP),并提供录制、播放、存储等功能,广泛应用于在线视频直播、VoIP、互动游戏等场景。本教程将介绍如何进行Red5的入门学习,并结合Tomcat和MyEclipse进行...
理解这些配置文件的内容和用途是深入使用Red5的关键。 4. **安全沙箱冲突** - 在开发过程中,可能会遇到Flash Player的安全沙箱限制问题。如果跨域通信或访问本地资源,需要正确配置服务器的crossdomain.xml文件,...
《Red5服务器详解及其核心组件——以red5-war-0.8.0.zip中的red5.jar为例》 在IT行业中,尤其是在线媒体流服务领域,Red5是一个非常重要的开源服务器平台。它支持实时流传输协议(RTMP),使得开发者能够构建实时...
安装和配置Red5-0.9.1通常涉及以下步骤: 1. **下载与解压**:从官方网站或源代码仓库获取Red5-0.9.1的压缩包,并将其解压到合适的位置。 2. **环境配置**:确保系统满足Java运行环境的要求,配置好JDK,并设置好...
ICMP timestamp请求响应漏洞 修复 Traceroute探测漏洞 修复 使用firewall-cmd打开关闭防火墙与端口 linux 7 ICMP timestamp请求响应漏洞 修复 Traceroute探测漏洞 修复 使用firewall-cmd打开关闭防火墙与端口 linux ...
在集成过程中,需要将 Red5 的库文件添加到 Tomcat 的类路径中,并调整配置文件以确保两者协同工作。 4. **下载与解压 Red5**:从官方网址(http://code.google.com/p/red5/)获取 Red5 的最新稳定版本(在这个例子...
总结起来,RED5的安装和配置涉及创建应用程序目录、设置配置文件、理解并配置`Context`和`Scope`等关键元素。通过正确配置这些参数,开发者可以成功搭建并运行基于RED5的流媒体应用,为用户提供高质量的音视频服务。...
【Red5流媒体服务器安装与使用入门】 Red5是一款基于Java开发的开源流媒体服务器,它支持多种功能,包括将音频(MP3)和视频(FLV)转换为播放流,客户端播放流的录制(仅限FLV),共享对象,现场直播流发布,以及...
标题中的"red5-1.0.0-webapps-demos.zip"表明这是一个关于Red5服务器的Web应用程序示例的压缩包。Red5是一款开源的流媒体服务器,它支持实时流传输协议(RTMP)、文件录制、播放以及直播等功能。1.0.0是其版本号,...
在实际部署“red5+flowplayer”解决方案时,你需要设置Red5服务器环境,安装并配置Red5应用,确保服务器能够正常运行并处理流媒体请求。接着,将Flowplayer嵌入到你的网页中,配置播放器参数以连接到Red5服务器上的...
熟悉AS3的基本语法和Red5相关的API是开发的关键。 三、Flash多媒体应用 1. 视频直播:通过Red5,你可以构建自己的视频直播平台。Flash客户端可以捕获用户摄像头的视频流,然后通过RTMP协议推送到Red5服务器,其他...
Red5是一款开源的流媒体服务器,它支持实时流传输协议(RTMP)、RTMPT、RTMPE、RTMPF、RTMPS等,能够处理音视频的直播、点播和录制等多种应用场景。在本项目中,我们关注的是Red5 1.0的Web版本,该版本特别适合在Web...
3. **共享对象**:Red5提供了在客户端之间共享数据的能力,这在实现多人协作游戏或实时互动应用时非常关键。 4. **屏幕共享**:通过Red5,用户可以实现桌面或应用程序的屏幕共享,这对于远程教育、在线会议等场景...