串流直播,免费直播系统,会议直播服务,游戏直播首选

Red5 Media Server的搭建和应用

   2016-06-07 17:09 本文来源:   IBM developerWorks    作者: IBM软件工程师

Red5 安装

准备工作:

一、JAVA 环境配置:下载的 JDK 安装包,本文选择的是 jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008.exe
二、确认你的安装环境并选择 Red5 安装包:如果是 Windows 操作系统,可以下载对应的安装文件 Red5 0.9 RC2(本文写作时使用的该版本),如需下载最新版本或了解 Red5 其他相关信息,可以参考该页面 https://github.com/Red5/red5-server
准备工作完成,一切就绪。

安装工作:

步骤一:首先安装上面下载的 JDK 安装包(备注:如果你先安装 Red5,会提示找不到 JDK,你必须先完成步骤一再继续以下操作)。安装时首先安装 JDK,必须记住安装路径,保持默认即可,默认是 C:\Program Files\Java\jdk1.6.0_10,然后安装 JRE, 保持默认即可,默认是 C:\Program Files\Java\jre6。安装完成后,必须配置环境变量,我的电脑–>属性–>高级 选项卡–>环境变量 (N)–>找到 系统变量 (S) 下 新建(W),然后输入 变量名(N):JAVA_HOME,变量值(V):上面 JDK 安装路径 C:\Program Files\Java\jdk1.6.0_10,确定即可,JDK 准备就绪。
步骤二:安装 Red5,安装 Red5 时,会要求输入外网可访问的 IP, 比如 121.52.209.62, 然后输入可访问的端口(Port),一般是 5080, 最后安装完成即可。

Red5 简单的应用实例

经过上面精彩的介绍,相信大家对 Red5 会有所兴趣,在这里我给大家用一个简单的应用实例,仅以登录过程为例,来帮助大家更好的理解 Red5 中的一些概念和模型。本应用实例中,Server 端基于 Red5 0.9 RC2 采用 Java 编写,而 Client 端则采用 Action Script。
图 1. 项目结构
图 1. 项目结构由于 Red5 是在 Tomcat 中运行的,因此 Red5 项目与普通 JAVAEE 项目结构类似。不同点在于,Red5 的配置文件需要加上“red5-”前缀,在 Tomcat 启动时,所有“red5-”被默认为 Red5 Server 的配置文件而不会被 Tomcat 加载,而后当 Red5 启动时才会加载相应的配置文件。让我们来看看 red5-web.xml 中都有哪些组成部分。
清单 1. red5-web.xml 中 Context 部分
<bean id="web.context" class="org.red5.server.Context" autowire="byType">
<property name="scopeResolver" ref="red5.scopeResolver" />
<property name="serviceInvoker" ref="global.serviceInvoker" />
<property name="mappingStrategy" ref="global.mappingStrategy" />
<property name="clientRegistry" ref="IloveClientRegistry" />
</bean>
清单 1 中前三项 Property 为 Red5 项目默认的属性。第四项“ClientRegistry”为项目自定义的 Context, 主要用于实现用户注册的功能。
清单 2. red5-web.xml 中 Scope 部分
<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>
清单 2 中定义了 Red5 项目中 Scope 的默认值。如需要可以添加自己定义的 Scope,并给它赋值。
清单 3. red5-web.xml 中 Handler 部分
<bean id="web.handler" class="org.red5.server.webapps.Ilove.Application">
<property name="userInfoService" ref="userInfoService" />
</bean>
清单 3 重载了 web.handler,因此当有 Client 与 Server 提出连接请求时,org.red5.server.webapps.Ilove.Application 将被用于处理客户请求。
接下来我们看下如何实现从 Flash 客户端调用 Red5 应用的方法,以及如何使用 Scope 来判断用户登录状态。
图 2. 客户端登录
图 2. 客户端登录
图 3. 登录界面
图 3. 登录界面图 2 中展示了 Flash 客户端中 ActionScript 面对不同 Connection 状态的处理方法。由 Flash 客户端发起的登录请求,首先需要判断当前与 Server 的 Connection 状态, 只有状态为”NetConnection.Connect,Sucess”时, 才可以向 Server 端调用方法“logicProcess”。 图 3 中展示了不同 Connection 状态时 Flash 客户端会给出的提示。
清单 4. LoginInterface
public interface LoginInterface extends IStreamAwareScopeHandler {

……
//用户登录时服务器端调用当前 connection 的方法
public String loginProcess(String[] args) throws FileNotFoundException,
ParserConfigurationException, SAXException, IOException;

//用户登录时服务器端报错调用当前 connection 的方法
public void systemError();

/**用户登出时客户端端调用当前 connection 的方法
 * 
 * @param userName 需要剔除的用户名
 */
public void logoutProcess(String userName);

 ……
}
如清单 4 所示,org.red5.server.webapps.Ilove.Application 实现了 LoginInterface 接口, 其中定义了一些客户端可见的方法名称。因为 org.red5.server.webapps.Ilove.Application 被定义为项目的 Handler,类中所有 public 方法都可以被客户端调用。
清单 5. 用户登录
public String loginProcess(String[] args) throws FileNotFoundException,
ParserConfigurationException, SAXException, IOException {

final IConnection conn = Red5.getConnectionLocal();
if (conn.getClient() == null)
return SystemContent.NO_ENTRY;

final IScope scope = conn.getScope();
final IClient client = conn.getClient();
final int code = (Integer) client.getAttribute("codeName");

//检查当前登录冲突
if (code == SystemContent.STATUS_CODE_DUPLICATEUSER) {
//此用户名已登录,notify 客户端不允许重复登录
if (model.statusMap.get(args[0]))
return SystemContent.NO_ENTRY;

//如果没有用户登录,则更新数据库中 session 值为当前用户
else {
this.userInfoService.updateSession(args[0], (String) client
.getAttribute("currentId"));
}
}
//如果通过验证,则 client 应该为 IloveStreamClient 类型
if (client instanceof IloveStreamClient) {
boolean authenticated = ((IloveStreamClient) client)
.isAuthenticated(); //当前验证状态

if (authenticated) {
 
synchronized (model.statusMap) {
model.statusMap.put(args[0], true);
refreshUserList(conn, args[0], "refresh");
refreshUserList(conn, args[0], "add");
}
invokeClientMethod(conn, "declarePublicSo",
new Object[] { "chatingSO" }, null);
messageAdapter
.sendPublicMessage(so, "欢迎登录!" + args[0], "系统机器人");
final String scheduleName = this.addScheduledJob(5000,
new IloveUserListChecker(conn, args[0]));
scope.setAttribute((String) client.getAttribute("currentId"),
scheduleName);
return args[0] + " found";
}
}

return args[0] + " not found";

}
如清单 5 所示,程序首先通过 Red5 的 GlobalScope 获取当前用户的 Credential,因为每个 Connection 在 Scope 中都是独立存在的。登录过程中会判断当前用户是否重复登录,或者登录信息是否正确。只有当用户为 Authenticated 状态时,服务器端才会调用 Flash 客户端的方法,同时生成 shared Object 以帮助 Flash 客户端初始化界面。
 
回页首

Red5 应用的部署

Red5 0.9 RC2 中已经内嵌了 Tomcat 服务器。因此 Red5 应用的部署和普通 JavaEE 应用在 Tomcat 中的部署方式是一样的。这里需要注意的是,上文中提到的 XML 配置文件必须是正确的,以防止运行报错。图 4 中是一个基于 Red5 应用的视频聊天系统,当用户登录成功后,可以在当前的聊天室中与其他已登录用户进行文字交谈或者视频聊天。具体功能的实现就不在本文中阐述了。
图 4. 视频聊天系统界面
Figure xxx. Requires a heading
专业视频直播服务提供商
视频直播服务,会议直播服务