资源描述
流媒体服务器配置说明作者:崔红斌QQ:6/、八前言为什么要用red5建立流媒体服务器,因为Red5是一个采用Java开发开源的Flash流媒体服务器,免费。Red5使用RTMP乍为流媒体传输协议,这与FMS完全兼容。它具有流化FLV、MP3文件,实时录制客户端流为FLV文件,共享对象,实时视频播放、Remoting等功1. 流媒体服务器的配置JDKRed5的安装需要java环境的支持,先配置好JDK。1. RED5安装本demored5安装在工作环境中,流媒体服务器读取文件的目录为:X:TAIZHOUwebrootRed5webappsOLDOLD文件下有两个文件夹:streams和WEB-INF其中streams中存放所有的视频资料,WEB-INF则是一些重要的配置文件。Webapps配置说明:classes文件夹(用来存放编译后的java类文件)。中需配置:指定应用程序唯一的名称为:OLDwebAppRootKey/OLD如果该文件中没有请添加如下:Forbidden/streams/*2. red5-web.xml中需要添加控制器(Handlers)这个类文件放在classes中。主要是实现客户端和流媒体服务器的连接。3. red5-web.properties中需配置webapp.contextPath=/OLDwebapp.virtualHosts=*,localhost,虚拟主机应添加*,即任何地址都可访问。否则其他电脑无法读取流媒体。2. FLEXBUILDER3或者FlexSDK的安装Flex这两者的区别是,FLEXBUILDER3集成SDK和可视化编辑窗口,FlexSDK包含了有Framework、AdobeAIRFramework、FlexTools等重要的组件库与API。对于开发人员来说,最好安装FLEXBUILDER3而服务器建议安装FlexSDK。为什么要安装这个工具呢?因为flex程序的编译要用到其中的SDK下面会讲到。FlexSDK安装后需要配置环境变量,在path中添加:C:flex_sdk_3bin;C:flex_sdk_3frameworks;Linux下添加环境变量,这里就不说了。Flex程序以MXML(主程序)和AS为主。开发MXM程序说明:MXML中需要定义RTMP连接地址来找到因为red5采用RTMP协议传输数据流,所以在red5的工作目录。如下程序,本人开发的第一版视频播放器源代码,可以用FLEXBUILDER3新建一个项目,把代码考过去,然后运行就能看到生成SWF视频文件了,由于界面比较难看,所以本人抛弃了它。middle采用RTM协议,需注意:privatevarrtmpURL:String=;RTM所访问的路径为服务器上RED5勺工作目录(即IP+工作文件夹)。上面已经说明,工作文件夹为OLD最重要的是IP地址不要写成:localhost或者,否则除此之外的客户端无法访问到服务器的流媒体,一定要外网IP。另外还需要在程序中制定的是所要播放的视频文件名称:netStream.play(on2_flash8_w_audio.flv);以上red5服务器基本上已经建好了,但是如何将程序发布成SW视频文件呢?总不能每上传一个视频文件,就建立一个MXM文件,利用FLEXBUILDER3来发布成SW文件吧!看来还需要继续寻找解决方法。3. ApacheAnt的安装ApacheAnt是一款基于java的开发工具。是将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发。为什么要安装ApacheAnt,主要是为了将flex和AS程序发布成SWF视频文件。Apacheant安装后要添加环境变量,如在path中添加:D:apache-ant-;本demo中,建立了一套user模板,视频的发布过程中,会复制这套模板,生成一套新的文件。路径如下:X:TAIZHOUwebrootanttasksuser这套模板已经配置完成,如无必要,请不要修改。模板配置说明:1. libs文件夹flexTasks.jar包从X:flexsdks中拷贝过来。好处是节省了一些参数设置。否则,你必须在命令行中使用Ant的-lib选项编译。2. src文件夹该文件夹保存需要编译的MXMI和AS文件。3. build.properties配置文件,FLEX_HOM设置为FLEXSDK的路径,编译MXMI文件必须用到的SDK此处一定要设置正确,否则吾无法编译。其他一些变量的定义,在build.xml中将被用到。4. build.xml该文件使用build.properties中定义的变量。主要内容如下:withfalserun.bat批处理命令该批处理,自动执行当前目录下的build.xml文件,并根据其参数对原文件进行编译。编译后,生成一个DEPLOY勺文件夹,如果编译成功,会生成许多文件,包括SWF和HTML文件。特别说明:视频上传后,系统会自动对视频进行发布。视频发布后,如果变更服务器勺IP地址,所有已经发布勺视频,都将无法播放,这个时候需要重新发布。2. FLEX与JAVAjs的交互技术FLEX与JS的交互Flex与js交互,需要引入方法:import;使用Externallnteface.call(returnSPZT);来访问调用该SWF页面的JS方法。1. FLEX与JAVA的交互本demo使用blazeDS进行与JAVA的交互。BlazeDS配置说明:1. 先下载BLAZEDS压缩包,然后将解压出来的flex文件夹复制到工作环境WEB-INF下,女口:X:TAIZHOUwebrootWEB-INF,并修改remoting-config.xml文件,添加以下内容:其中:destination定义的ID名称必须唯一。Flex端RemoteObject将调用这个唯一的方法。Source就是类文件的路径。2. 将解压后的LIB包下的12个包,全部复制到工作环境的lib包中。3. 修改web.xml文件,添加如下内容:MessageBrokerServletMessageBrokerServlet/WEB-INF/flex/services-config.xml1MessageBrokerServlet/messagebroker/*BlazeDS设置完毕。如何使用BlazeDS呢?一点都不复杂,先看如下代码:varro:RemoteObject=newRemoteObject();/定义RemoteObject对象ro.destination=blatojava;/destination名称必须和remoting-config.xml定义的ID名称一致。ro.source=;ro.endpoint=/messagebroker/amf;/这句必须要添加,否则无法访问。调用默认的amf。ro.insert(,s);执行SPBFJLB类下的insert方法。然后数据保存成功,FLEX访问JAVA成功了。使用RemoteObject必须先引入类import;详细代码如下:privatefunctionconfirmBox(msg:String,title:String,successFunc:Function,successParams:Array,failFunc:Function=null,failParams:Array=null):voidvaralert:Alert=Alert.show(msg,title,Alert.YES|Alert.NO,this,function(evt:CloseEvent):voidif(evt.detail=Alert.YES)if(successFunc!=null)successFunc.apply(this,successParams);elseif(failFunc!=null)failFunc.apply(this,failParams);,null,Alert.YES);privatefunctiongetResult(event:ResultEvent):voidzt=;/*MouseEvent*/privatefunctiononClicks(event:MouseEvent):voidvarrob:RemoteObject=newRemoteObject();rob.destination=getZT;rob.source=;rob.endpoint=/messagebroker/amf;rob.addEventListener(ResultEvent.RESULT,getResult);vars:String=ExternalInterface.call(returnUserID);rob.getBFZT(,s);privatefunctionpp_onClick(event:MouseEvent):voidif(playPressed)pause();playPressed=false;else/varzt:String=ExternalInterface.call(returnSPZT);this.addEventListener(MouseEvent.CLICK,onClicks);if(zt=0)vards:String=ExternalInterface.call(returnBFDS);varye:String=ExternalInterface.call(returnYE);if(ye=0|(Number(ye)-Number(ds)0)confirmBox(播放该视频将扣除+ds+个点数,是否继续?,func1,null,func2,null);elseif(zt=1)func1();privatefunctionfunc1():voidplay();varro:RemoteObject=newRemoteObject();ro.destination=blatojava;ro.source=;ro.endpoint=/messagebroker/amf;vars:String=ExternalInterface.call(returnUserID);ro.insert(,s);playPressed=true;privatefunctionfunc2():void以上流媒体服务器的整体架构,经过个人努力连续多天的加班研究得出的成果,其中需要注意的要点和关键点都已经详细说明。此方案纯属个人理解,并不代表最合理的方案,欢迎大家批评指正。如果阁下最终研究出更好的方案,请告知我,不胜感激。
展开阅读全文