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

Red5源码研究一

    博客分类:
  • Red5
 
阅读更多

1.    RED5和APACHE MINA

Red5采用的网络编程框架是Apache Mina。所以源码研究的思路可以有:
1)    从Mina的角度进行请求处理流的研究。
2)    从Red5整体管理角度进行Red5的应用框架研究。
3)    从一些核心的处理环节进行研究,例如编解码、录制、回放和直播。
2.    从MINA的角度看RED5的请求处理流(仅仅分析RTMP)
2.1.    建立基于MINA的网络监听


上面完全是Mina的网络特性,就是建立网络监听。
2.2.    通过实现MINA的IOHANDLER引入网络连接管理


SessionCreated回调中来添加Session级别的编码过滤器,同时构建自己的链接管理对象RTMPMinaConnection,注意上面关于握手的代码,其已经涉及到RTMP协议本身,后面我们马上会介绍。

sessionOpened中调用了Red5自己的回调机制,这是把Mina的机制交给Red5机制的一个过渡。
2.3.    RED5自己接管网络管理


在链接打开之后,Red5通过启动一个计时器去检测是否握手成功,所谓的握手是RTMP协议中的一个概念,ADOBE已经开放该协议,具体细节请参考http://www.adobe.com/devnet/rtmp/,70页左右,应该比较好理解。Red5对握手的实现就是在一个Session打开之后通过在一段固定时间去内读取握手信息,如果超过该固定时间还没有握手成功,将直接断开客户端链接。也就是当Red5接管链接之后第一件事情就是读取用户信息进行握手操作。那么握手首先要读取数据,我们先进入读取数据的环节。
2.4.    RED5和客户端进行握手


上面的代码我们基本能看到,当客户端有数据发送过来的时候,首先判断输入的数据是否是Mina的原始数据类型IoBuffer,如果是那么由红色标线的方法去处理,其实红色标线的处理就是进行握手操作。如下代码:

握手成功之后Red5才进入正式的数据读取和处理状态。那我们要问的是为什么判断数据类型是IoBuffer就代表是还没有握手呢?原因我们可以追溯到在SessionCreated阶段时添加的Codec过滤器,Red5的Codec工厂对没有握手的链接是仅仅进行IoBuffer的数据准备,并不进行协议解析。
为了让握手的过程更加清晰我们先看看RTMP协议:
RTMP协议在客户端发起链接时首先要进行一个握手过程,至于握手的目的是什么?我个人认为就是相互通个气,看看是否客户端和服务器端都能读懂RTMP,不能糊里糊涂的就连上。
RTMP的握手在协议中叫Handshake,其过程如下:
1)    首先客户端在建立链接的时候向服务器端发送两个固定长度的数据块(C0,C1)。
2)    然后客户端等待服务器返回对应两个数据块的响应(S0,S1)。
3)    当客户端接收到服务器的返回之后,再发送一个固定长度的数据块(C2)。
4)    客户端等待服务器端的返回(S2)。
其中数据格式要求如下:
C0和S0的格式是一样的,由8位表示的数字3组成(RTMP1.0的定义)。
C1和S1由1536字节组成,只有对前面的8字节有特殊要求,后面的数据都由随机位组成。
C2和S2也有1536字节组成,并且对前面的8字节有特殊要求,后面的数据都由随机位组成。

Red5的具体实现过程可以参考阅读如下代码:

在generateResponse中我们疑惑的是其一次性进行握手的操作,那么数据是如何缓冲到位的呢?这也是Mina的Codec过滤器机制的重要作用体现,请阅读红线标注的方法实现:

RTMPProctocolDecoder获取不到完整的握手数据它根本不交给后端进行处理,这也给我们一个思路就是在Mina基础上开发的时候如何通过Codec过滤器实现让后端的应用不要太依赖网络数据的特性。
其实在上面红线标注的方法中有两次进行握手信息的解析,第一次是C0和C1,第二次是C2。
评价:其实仔细看Red5的代码,我个人并不觉得Red5的一些细节设计有多合理, 既然握手是RTMP是否建立成功的一部分,那么Red5就不应该把其直接放到RTMPHandler中作为一个事件connectionOpened来调用,其实调用了也没起什么作用,仅仅启动一个判断是否超时的计划任务,恰恰造成的后果是在RTMP层面,一个连接完全建立成功,即握手成功之后并没有事件抛出。再仔细看引入RTMPHandler的意义并不大,还不如直接在RTMPMinaIoHandler中解决问题,引入只是给人造成迷惑,Mina清晰的架构被RTMPHandler和RTMPMinaIoHandler的引入搞的有点不可读。还有Red5把客户端和服务器端代码的分离的方法也值得商讨,其实严格意义上说RTMP的客户端和服务器端共享的应该是RTMP协议部分,而不是基于Mina的网络处理部分,我们仔细看Red5,其实包org.red5.server中的代码弄了很多既满足客户端又满足服务器端的东东,真让人费解。那如何分离出来独立的服务器端和客户端的API呢?
2.5.    RED5开始接收数据
当握手完成之后,Red5的Codec过滤器将会起作用,同时Red5在接收到数据的时候直接路由到其自己的处理器。

在红线标注的方法中我们可以看到Red5进入具体RTMP协议路由。
从Mina的角度Red5对RTMP的请求处理流就是这样了。

分享到:
评论

相关推荐

    RED5 1.0.6源码

    1. **RTMP与RTMFP协议**:RED5的核心功能之一就是实现RTMP协议,这是一种用于在网络上进行实时数据传输的协议,主要用于视频流和音频流。RTMFP则是Adobe开发的P2P版本,通过UDP协议进行数据传输,减少了服务器的压力...

    Red5 Example 实例源码

    这个"Red5 Example 实例源码"提供了一组示例代码,帮助开发者理解和使用Red5进行流媒体处理。以下是对这些知识点的详细说明: 1. **Red5服务器**:Red5是基于Java开发的流媒体服务器,能够处理视频、音频流以及数据...

    red5 server 1.0.10-M7 源码

    总之,Red5 Server 1.0.10-M7源码提供了一个深入了解实时流媒体服务器工作原理的机会,对于开发者来说,无论是为了学习、开发还是优化现有系统,都是非常宝贵的资源。通过深入研究和实践,你可以掌握流媒体服务的...

    red5 java源码

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

    RED5多人会议源码

    综上所述,"RED5多人会议源码"项目涵盖了流媒体技术、客户端开发、网络协议、服务器优化等多个方面的知识,对于想要深入理解和开发此类应用的IT从业者来说,这是一个极具挑战性的学习资源。通过分析和研究这个源码,...

    openfire red5插件 sparkweb源码

    在实际应用中,开发者可以深入研究源码,了解Openfire与Red5的集成方式,以及SparkWeb如何处理音视频交互。这有助于定制自己的即时通讯解决方案,例如添加新的功能,优化性能,或者改进用户体验。同时,对于学习Flex...

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

    【标题】"red5chatv2.1"指的是一个基于RED5开源流媒体服务器构建的视频聊天和会议应用的版本2.1。RED5是一款用Java编写,支持实时流传输协议(RTMP)的服务器,它允许用户创建、录制以及播放音频、视频和其他交互式...

    RED5 入门资料

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

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

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

    red5-server

    1. **Red5 Server介绍** Red5 Server是由Java语言编写,因此它具备跨平台的特性,可以在Windows、Linux、Mac OS等操作系统上运行。Red5支持多种协议,包括RTMP(Real-Time Messaging Protocol)、HLS...

    red5入门教程(pdf)

    1. **Red5简介**:Red5是由Java编写的一个开放源代码流媒体服务器,支持RTMP(Real Time Messaging Protocol)、HLS(HTTP Live Streaming)和RTSP(Real Time Streaming Protocol)等多种协议,能够处理音频、视频...

    Red5 Pro---Android demo

    1. **源码文件**:包含Android应用的Java或Kotlin源代码,展示了如何在Android应用中实现与Red5 Pro服务器的交互。 2. **资源文件**:如布局XML文件、图片资源、音频文件等,用于构建应用的用户界面。 3. **Gradle...

    red5 demo

    如果你打算深入研究这个“red5test3”项目,可以期待从中学习到如何构建一个简单的流媒体服务,包括发布、播放和录制媒体流。这将涉及到服务器端的编程、客户端的交互以及可能的UI设计。通过实践,你将能够更好地...

    在eclipse中使用tomcat开发RED5项目

    RED5是一个基于Java语言的开放源代码流媒体服务器,能够处理RTMP、HLS、RTSP等协议,广泛应用于在线视频、直播等领域。 描述中提到的“NULL”表示没有具体的项目细节,但我们可以通过常规的步骤来阐述如何在Eclipse...

    Red5 Java 端聊天室代码

    1. **Red5服务器** - Red5是一个基于Java技术的开源流媒体服务器,由Joel Håkansson于2005年发起。它提供了一个平台来处理音频、视频、数据和应用程序的实时流。 - Red5支持多种协议,如RTMP(用于Adobe Flash ...

    red5-io-1.0.5-RELEASE

    总之,Red5 IO 1.0.5-RELEASE源码包含了大量的核心技术和实用功能,对于希望深入研究和开发流媒体应用的Java开发者来说,是一个宝贵的资源。通过学习和使用这个源码,你可以掌握实时流媒体处理、网络通信以及Java...

    RedBook-源码.rar

    通过研究RedBook的源码,初学者可以了解图形编程的基本原理,比如顶点、图元装配、渲染路径等。 5. **历史与演变** 计算机图形学的历史可以从CGI这样的早期标准开始追溯。学习RedBook的源码可以帮助我们理解图形...

    red5-server-1.0.8-M13

    1. **源代码**:如果你下载的是源码包,那么你会看到Java源文件,这些代码构成了Red5 Server的核心。 2. **构建脚本**:例如Ant或Maven的构建脚本,用于编译、打包和部署Red5 Server。 3. **配置文件**:如`conf`...

Global site tag (gtag.js) - Google Analytics