最近一直研究流媒体服务器的搭建及使用,今天就简单整理下方便以后查阅。
EasyDarwin是在Apple开源流媒体服务器Darwin Streaming Server(v6.0.3)基础上进行开发和维护的免费开源、高效、易扩展的面向企业级的流媒体平台框架,开始于2013年,遵循 Apple开源License,为了敏捷流媒体服务器开发和简化企业流媒体应用开发而诞生的。 EasyDarwin一直以来保持 Darwin原有体系结构和设计思想,在保持出色的性能和简洁的代码同时,也在不断优化其底层效率和上层通用性。在广大开源爱好者的积极参与和努力下, 易用性、扩展性和稳定性等方面不断优化和改进,已经成长为国内较具影响力的流媒体开发框架,众多应用案例确保可以稳定用于商业开发。
EasyDarwin 使用标准的RTSP/RTCP/RTP协议,服务器部署支持跨平台,包括:Windows、Linux、Mac、Solaris,并 且可以很容易进行自定义的扩展。EasyDarwin可以用于流媒体直播、点播、录像与回放等等需求,EasyDarwin依托于Darwin的优秀架 构,可扩张实现云监控、云视频等项目需求
EasyDarwin目前支持:
1.MPEG-4/H264点播;
2.RTSP/RTP直播(推模式直播/拉模式直播);
3.私有协议接入(海康、大华等SDK接入);
项目主页: http://www.open-open.com/lib/view/home/1420291903515二:Flash流媒体服务器
Red5是一个采用Java开发开源的Flash流媒体服务器。它支持:把音频(MP3)和视频(FLV)转换成播放流; 录制客户端播放流(只支持FLV);共享对象;现场直播流发布;远程调用。Red5使用RSTP作为流媒体传输协议,在其自带的一些示例中演示了在线录制,flash流媒体播放,在线聊天,视频会议等一些基本功能。
一、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 中的一些概念和模型。本应用实例中,Server 端基于 Red5 0.9 RC2 采用 Java 编写,而 Client 端则采用 Action Script。
由于 Red5 是在 Tomcat 中运行的,因此 Red5 项目与普通 JAVAEE 项目结构类似。不同点在于,Red5 的配置文件需要加上“red5-”前缀,在 Tomcat 启动时,所有“red5-”被默认为 Red5 Server 的配置文件而不会被 Tomcat 加载,而后当 Red5 启动时才会加载相应的配置文件。让我们来看看 red5-web.xml 中都有哪些组成部分。
清单 1 中前三项 Property 为 Red5 项目默认的属性。第四项“ClientRegistry”为项目自定义的 Context, 主要用于实现用户注册的功能。
清单 2 中定义了 Red5 项目中 Scope 的默认值。如需要可以添加自己定义的 Scope,并给它赋值。
清单 3 重载了 web.handler,因此当有 Client 与 Server 提出连接请求时,org.red5.server.webapps.Ilove.Application 将被用于处理客户请求。
接下来我们看下如何实现从 Flash 客户端调用 Red5 应用的方法,以及如何使用 Scope 来判断用户登录状态。
图 2 中展示了 Flash 客户端中 ActionScript 面对不同 Connection 状态的处理方法。由 Flash 客户端发起的登录请求,首先需要判断当前与 Server 的 Connection 状态, 只有状态为”NetConnection.Connect,Sucess”时, 才可以向 Server 端调用方法“logicProcess”。 图 3 中展示了不同 Connection 状态时 Flash 客户端会给出的提示。
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 方法都可以被客户端调用。
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. 视频聊天系统界面
1.打开“媒体——流”选项,如图所示:
2.点击“添加”按钮选择流媒体文件,然后点击“串流”按钮
3.点击“下一个”后,在“目标设置”界面选择“RTSP”,然后点击添加 + 按钮
4.填上目标ip地址,并在“转码选项”中选择相应的编码类型(这个视情况而定),目标IP地址就是PC机器本机的IP地址
5.客户端操作,重新打开一个窗口
点击“媒体——打开网络串流”,在弹出的框中输入“rtsp://192.168.1.2:1234/tcp1”,点击“播放”按钮即可。