文档章节

Red5源码研究一

mickelfeng
 mickelfeng
发布于 2013/11/15 18:59
字数 1564
阅读 38
收藏 0

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的请求处理流就是这样了。

本文转载自:http://hi.baidu.com/janins/item/7fdcb5735d1dfb10d1dcb3ba

mickelfeng

mickelfeng

粉丝 236
博文 2778
码字总数 604219
作品 0
成都
高级程序员
私信 提问
请教red5关于一对多视频聊天的解决方案以及性能??

最近在研究red5,想弄个一对多的视频聊天,就是每个用户都能看见一个共享的视频对象和他自己,怎样实现?另外red5大概能支持多少这样的room并发,每个room能支持多少个客户进入,服务器的带宽...

kaka0515
2011/03/01
3.7K
3
请推荐一款流媒体服务器软件,谢谢

最近研究视频播放,涉及到负载、分流、协议等 由于不了解,只知道有red5,还有其它比较好的吗?请推荐,多谢!

jack_jones
2014/10/29
87
0
向Red5发送视频时发送能够成功但是在界面中看不到视频的情况

问题描述:这两天正在研究如何通过Flex客户端向Red5发送视频,在客户端边拍摄边发送.问题是Red5已经接收到视频了,电脑摄像头的灯也打开了,但是在客户端就是看不到视频,这个问题困扰了我。...

独鸣在彼岸
2013/11/27
0
0
openmeetings实现简单的单点登录(自动登录)

研究openmeetings也有一段时间了,由于中文资料确实是少得可怜,不过《改造OpenMeetings成为Flash视频会议室》的一、二、三、四确实是非常有用的资料,现在回想起来,里面说的很多东西都是很...

c61811
2010/06/21
4.4K
7
CentOS7下安装配置流媒体服务器Red5

背景:因工作需要,要研究一些流媒体服务器相关的技术,主要是为了搭建直播所用的服务器,本文是基于CentOS7搭建Red5流媒体服务器,利用OBS推流工具可实现简单的直播、观看功能。 本文主要介...

botaozhao
2017/07/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

搭建tftp服务

前言: 最近整理一些以前的学习笔记。 过去都是存储在本地,此次传到网络留待备用。 TFTP服务: TFTP:Trivial File Transfer Protocol 不重要文件传输协议 主要用来传送小文件,不支持认证和...

迷失De挣扎
今天
3
0
rest 的理解

rest:表现层状态转移。 什么是restful协议?https://en.wikipedia.org/wiki/Representational_state_transfer 使用restful的好处。 Rest是一种体系结构样式,他定义了一组用于创建web服务的...

xiaoxiao_go
今天
5
0
聊聊spring cloud的CachingSpringLoadBalancerFactory

序 本文主要研究一下spring cloud的CachingSpringLoadBalancerFactory CachingSpringLoadBalancerFactory spring-cloud-openfeign-core-2.2.0.M1-sources.jar!/org/springframework/cloud/o......

go4it
昨天
4
0
一篇文章搞定——JDK8中新增的StampedLock

一、StampedLock类简介 StampedLock类,在JDK1.8时引入,是对读写锁ReentrantReadWriteLock的增强,该类提供了一些功能,优化了读锁、写锁的访问,同时使读写锁之间可以互相转换,更细粒度控...

须臾之余
昨天
5
0
Android Camera原理之CameraDeviceCallbacks回调模块

在讲解《Android Camera原理之openCamera模块(二)》一文的时候提到了CameraDeviceCallbacks回调,当时没有详细展开,本文我们详细展开讲解一下。 CameraDeviceCallbacks生成过程: 《Android...

天王盖地虎626
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部