RED5安裝與配置_第1頁(yè)
RED5安裝與配置_第2頁(yè)
RED5安裝與配置_第3頁(yè)
RED5安裝與配置_第4頁(yè)
RED5安裝與配置_第5頁(yè)
已閱讀5頁(yè),還剩37頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、RED5將所有的應(yīng)用程序都放在RED5根目錄下的”webapps“目錄。你需要為所創(chuàng)建的程序在webapps目錄下添加相應(yīng)的目錄。在你的應(yīng)用程序目錄里應(yīng)該有一個(gè)名為”WEB-INF“的目錄,用來(lái)存放你的程序的配置文件。在”doc/templates/myapp“目錄有一個(gè)模板,可以用來(lái)幫你完成建立程序的初始工作。RED5啟動(dòng)的時(shí)候,在”webapps”目錄的程序文件都是搜索”WEB-INF”的目錄下的配置文件來(lái)完成配置的。最主要的配置文件是”web.xml”。這個(gè)文件里包含了以下參數(shù):globalScope:指定全局作用范圍1. <context-param> 2. <par

2、am-name>globalScope</param-name> 3. <param-value>default</param-value> 4. </context-param> contextConfigLocation:指定配置handler的文件的位置。這些配置文件描述了客戶端加入/離開(kāi)的動(dòng)作觸發(fā)后調(diào)用的處理方法,作用范圍。在描述的時(shí)候可以使用通配符來(lái)描述多個(gè)文件:1. <context-param> 2. <param-name>contextConfigLocation</param-name>

3、; 3. <param-value>/WEB-INF/red5-*.xml</param-value> 4. </context-param> locatorFactorySelector:程序的根上下文,通常是”red5.xml”1. <context-param> 2. <param-name>locatorFactorySelector</param-name> 3. <param-value>red5.xml</param-value> 4. </context-param> p

4、arentContextKey:父級(jí)上下文,通常是”default.context”1. <context-param> 2. <param-name>parentContextKey</param-name> 3. <param-value>default.context</param-value> 4. </context-param> log4jConfigLocation:日志配置文件的位置1. <context-param> 2. <param-name>log4jConfigLocati

5、on</param-name> 3. <param-value>/WEB-INF/perties</param-value> 4. </context-param> webAppRootKey:程序的全局唯一名1. <context-param> 2. <param-name>webAppRootKey</param-name> 3. <param-value>/myapp</param-value> 4. </context-param> 對(duì)于每一個(gè)Han

6、dler配置文件最少需要有三個(gè)beanContext:用來(lái)影射路徑到某個(gè)作用范圍、搜索服務(wù)和Handler,它有一個(gè)保留的名字”web.context”。 其默認(rèn)的類為org.red5.server.Context1. <bean id=“web.context“ class=“org.red5.server.Context“ 2. autowire=“byType“ /> 對(duì)于沒(méi)有一個(gè)應(yīng)用程序只應(yīng)該有一個(gè)Context,但是同一個(gè)Context可以被多個(gè)作用范圍共享Scope:每一個(gè)應(yīng)用程序最少有一個(gè)作用范圍,用來(lái)將handler連接到context和服務(wù)器。作用范圍可以建立一棵

7、樹(shù),每一個(gè)客戶端連接到樹(shù)上的一個(gè)節(jié)點(diǎn),而共享對(duì)象存在于作用范圍里??梢园炎饔梅秶醋魇橇奶焓一蛘叱绦?qū)嵗DJ(rèn)的作用范圍通常是web.scope,不過(guò)這名字是可以任意取的。對(duì)于bean有以下屬性:server:與全局服務(wù)器”red5.server”相關(guān)。parent:指定當(dāng)前作用范圍的父范圍,通常是”global.scope”context:當(dāng)前作用范圍的服務(wù)器上下文,一般指定為”web.context”handler:對(duì)應(yīng)當(dāng)前作用范圍的handlercontextPath:用來(lái)連接到當(dāng)前作用范圍的路徑virtualHosts:一個(gè)主機(jī)名或IP的列表,用來(lái)描述虛擬主機(jī)的位置,列表項(xiàng)目之間用逗號(hào)

8、分隔開(kāi)。1. <bean id=“web.scope“ class=“org.red5.server.WebScope“ 2. init-method=“register“> 3. <property name=“server“ ref=“red5.server“ /> 4. <property name=“parent“ ref=“global.scope“ /> 5. <property name=“context“ ref=“web.context“ /> 6. <property name=“handler“ ref=“web.ha

9、ndler“ /> 7. <property name=“contextPath“ value=“/myapp“ /> 8. <property name=“virtualHosts“ value=“l(fā)ocalhost, “ /> 9. </bean> 為了應(yīng)用程序配置方便的需要,可以將”contextPath“和”virtualHosts“放到另外一個(gè)單獨(dú)的屬性文件里邊,而在這里使用變量來(lái)表示,為此需要添加一個(gè)特別的bean來(lái)指定屬性文件的位置。1. <bean id=“placeholderConfig“ class=“or

10、g.springframework.beans.factory.config.PropertyPlaceholderConfigurer“> 2. <property name=“l(fā)ocation“ value=“/WEB-INF/perties“ /> 3. </bean> 假設(shè)在屬性文件perties里有如下的數(shù)據(jù):1. webapp.contextPath=/myapp 2. webapp.virtualHosts=localhost, 則上邊的bean的”contextPath“和”vir

11、tualHosts“屬性即可使用變量來(lái)指定值1. <property name=“contextPath“ value=“ /> 2. <property name=“virtualHosts“ value=“ /> 對(duì)于”contextPath“可以視為是一個(gè)根作用范圍。你可以在配置好的”contextPath“路徑后邊隨意添加其他的路徑,而連接到這些路徑的客戶端將動(dòng)態(tài)創(chuàng)建另外的作用范圍,這些作用范圍使用的是同樣的handler,但擁有自己的屬性、共享對(duì)象和活動(dòng)流。handler:每一個(gè)上下文需要一個(gè)handler來(lái)響應(yīng)用戶連接、離開(kāi)作用范圍時(shí)的動(dòng)作,handler實(shí)

12、現(xiàn)了很多方法,用戶可以調(diào)用以達(dá)到特定的目的。這個(gè) handler必須實(shí)現(xiàn)”org.red5.server.api.IScopeHandler“接口,當(dāng)然針對(duì)共享對(duì)象和流的訪問(wèn)還應(yīng)該實(shí)現(xiàn)其他的接口。在”org.red5.server.adapter.ApplicationAdapter“可以找到一個(gè)能夠用作基類的例子,同時(shí)還應(yīng)該多多參照文檔以得到更多細(xì)節(jié)。某個(gè)作用范圍的handler可以如下指定:1. <bean id=“web.handler“ 2. class=“the.path.to.my.Application“ 3. singleton=“true“ /> 其中”id“屬性

13、是上邊定義的作用范圍里指定的。如果你不需要任何服務(wù)端的邏輯處理,可以使用Red5默認(rèn)提供的handler1. <bean id=“web.handler“ 2. class=“org.red5.server.adapter.ApplicationAdapter“ 3. singleton=“true“ /> handler的例子1. package the.path.to.my; 2. import org.red5.server.adapter.ApplicationAdapter; 3. public class Application extends ApplicationA

14、dapter 4. public Double add(Double a, Double b) 5. return a + b; 6. 7. 這里假設(shè)使用上邊的配置,則在客戶端調(diào)用的時(shí)候使用以下方式1. nc = new NetConnection(); 2. nc.connect(“rtmp:/localhost/myapp“); 3. nc.onResult = function(obj) 4. trace(“The result is “ + obj); 5. 6. nc.call(“add“, nc, 1, 2); 返回因該有輸出:The result is 3/基于red5的在線視頻

15、錄制實(shí)例和詳細(xì)注釋最近在學(xué)校做畢業(yè)設(shè)計(jì)頂著壓力,昨天晚上研究了一個(gè)晚上red5和as3發(fā)現(xiàn)還是蠻有意思的red5和fms都是個(gè)不錯(cuò)的東西,發(fā)現(xiàn)在壓力下學(xué)東西學(xué)起來(lái)特別快哈/預(yù)定義聲明import mx.utils.Delegate;/創(chuàng)建一個(gè)基本的網(wǎng)絡(luò)連接對(duì)象var nc:NetConnection = new NetConnection();/連接到本地的Red5服務(wù)器nc.connect("rtmp:/localhost/online");/將已和red5服務(wù)器建立連接的nc傳遞給NetStreamvar ns:NetStream = new NetStream(nc)

16、;/從攝像頭和麥克風(fēng)取得信息var cam:Camera = Camera.get();var mic:Microphone = Microphone.get();/初始化攝像頭和麥克風(fēng),調(diào)用函數(shù)setupCameraMic();/保存上次錄制的內(nèi)容,并進(jìn)行清空var lastVideoName:String = ""/監(jiān)聽(tīng)開(kāi)始錄制和停止錄制兩個(gè)按鍵的點(diǎn)擊動(dòng)作并進(jìn)行相應(yīng)的處理playButton.addEventListener("click", Delegate.create(this, playClick);stopButton.addEventLi

17、stener("click", Delegate.create(this, stopClick);/定義開(kāi)始錄制的playclick函數(shù)function playClick():Void/此flv文件是保存在 webapps/oflaDemo/streams/文件夾/將攝像頭和麥克風(fēng)賦給nsns.attachVideo(cam);ns.attachAudio(mic);/將攝像頭信息賦給視頻顯示窗口,這樣我們可以即時(shí)看到信息videoContainer.attachVideo(cam);/ 此處是定義存儲(chǔ)名字的,用隨機(jī)數(shù)目獲得一個(gè)唯一的文件名lastVideoName =

18、"red5RecordDemo_" + random(getTimer();ns.publish(lastVideoName, "record");/鎖定開(kāi)始按鍵使其失效playButton.enabled = false;/鎖定停止按鍵使其生效stopButton.enabled = true;function stopClick():Void/關(guān)閉ns與red5的連接ns.close();/并清空視頻顯示窗口videoContainer.attachVideo(null);videoContainer.clear();/鎖定開(kāi)始按鍵使其生效playB

19、utton.enabled = true;/鎖定停止按鍵使其失效stopButton.enabled = false;/播放已經(jīng)錄制的視頻playLastVideo();function playLastVideo():Void/ 傳遞錄制的視頻信息給視屏顯示窗口videoContainer.attachVideo(ns);/回訪已經(jīng)上次錄制的視頻片段ns.play(lastVideoName);function setupCameraMic():Void/啟動(dòng)攝像頭cam = Camera.get();/設(shè)置尺寸cam.setMode(320, 240, 30);/設(shè)置錄制質(zhì)量cam.set

20、Quality(0,70);/啟動(dòng)麥克風(fēng)mic = Microphone.get();mic.setRate(44);/公司今天需要裝一臺(tái)RED5的服務(wù)器用來(lái)開(kāi)發(fā)程序。發(fā)現(xiàn)RED5的0.6已經(jīng)正式放出,以前我寫過(guò)一篇關(guān)于用SVN進(jìn)行抽取,然后建立RED5項(xiàng)目的文 章。而對(duì)于一般的開(kāi)發(fā)者來(lái)說(shuō),不需要去修改RED5本身的程序,只需要建立自己的應(yīng)用程序就可以了?,F(xiàn)在把建立過(guò)程記錄下來(lái),希望對(duì)各位有所幫助。本文適 合第一次接觸RED5(WIN平臺(tái)下),而不知道如何開(kāi)始建立自己的應(yīng)用程序的用戶。流程:1.下載最新版本的RED5 /red52.安裝RED5,注意

21、在安裝RED5前要先安裝好JRE,安裝RED5的時(shí)候會(huì)要求指定JRE的目錄的。3.到RED5的安裝目錄,找到doc/templates目錄,該目錄中存放了一個(gè)標(biāo)準(zhǔn)的RED5應(yīng)用程序模版myapp,將其復(fù)制到RED5安裝目錄 中的webapps目錄下,并改名為你喜歡的文件夾名,比如你要開(kāi)發(fā)一個(gè)聊天的程序,那么可以把myapp改為myChat,這個(gè)名字就是以后你要連接的 服務(wù)名了。4.在WEB-INF中新建一個(gè)文件夾src用來(lái)存放程序的源代碼,新建一個(gè)classes文件夾用來(lái)存放編譯后的文件。5.打開(kāi)Eclipse,將工作區(qū)指定為RED5安裝目錄下webapps,然后新建一個(gè)項(xiàng)目,項(xiàng)目名為myCh

22、at.這個(gè)時(shí)候你應(yīng)該發(fā)現(xiàn)剛才 myChat中的文件都被加載進(jìn)來(lái)了,我們首先把src目錄指定為源代碼目錄,右鍵選擇src,在彈出的菜單中選擇Build Path->Use as Source Folder,即將其指定為代碼文件夾。接下來(lái)要指定項(xiàng)目的目標(biāo)目錄,在項(xiàng)目名上右鍵選擇Properties,選擇Java Bulid Path,在選擇Source標(biāo)簽,在下面的Browse中選擇Classes目錄,將其指定為目標(biāo)目錄。然后選擇Libraries,點(diǎn)擊Add External JARs,將RED5安裝目錄下的red5.jar包含進(jìn)來(lái)。6.這個(gè)時(shí)候,在Eclipse的左邊應(yīng)該多了WEB-IN

23、F/src這樣一個(gè)東東,我們將要在這里開(kāi)始寫入我們的第一個(gè)項(xiàng)目代碼。右鍵選擇它,在彈出的 菜單中選擇New->Package,新建一個(gè)包,舉例,包名可以為org.d5.first,然后再在生成的org.d5.first這個(gè)包上繼 續(xù)右鍵選擇New->File,輸入文件名Application.java。并在建好的文件中輸入以下代碼:package org.d5.first;import org.red5.server.adapter.ApplicationAdapter;public class Application extends ApplicationAdapter publ

24、ic String login()return "Welcome to Chat Servers"7.進(jìn)行配置。編輯WEB-INF下的red5-web.xml,找到bean id=”web.handler”一句,將class=”XXX”中的XXX位置修改為org.d5.first.Application,這樣本程序?qū)?以剛才寫的Application來(lái)運(yùn)行。刪除后面的bean id=”server.handler整句,因?yàn)槲覀儠簳r(shí)用不到這個(gè)東東。編輯web.xml,找到webAppRootKey,將其下面的 param-value標(biāo)簽中的值修改為/myChat。編輯red5

25、-perties,將第一句修改為 webapp.contextPath=/myChat8.編譯項(xiàng)目9.重新啟動(dòng)RED5服務(wù)器10.在FLASH中新建一個(gè)文件,輸入以下代碼:import .NetConnection;import .Responder;var responder:Responder = new Responder(chat);var nc:NetConnection = new NetConnection();nc.connect("rtmp:/localhost/mytest");nc.addEventListener(NetStatusEv

26、ent.NET_STATUS,statusHandler);function chat(obj:Object):void    trace(obj);function statusHandler(event:NetStatusEvent):void    trace(.code);    switch (.code)            case "NetConne

27、ction.Connect.Success":            trace("The connection was made successfully");            break;        case "NetConnection.Connect.Rejected": 

28、0;          trace ("sorry, the connection was rejected");            break;        case "NetConnection.Connect.Failed":          &

29、#160; trace("Failed to connect to server.");            break;    nc.call("login",responder);運(yùn)行程序,顯示結(jié)果為Welcome to Chat Servers。第一個(gè)RED5應(yīng)用程序誕生了,呵呵:)/忙了好幾天,最近也算把Red5服務(wù)器服務(wù)端基本搞 定了。 為了熟悉服務(wù)端代碼,以及了解API,我仿照著FMS的模式做了一個(gè)多人聊天室。基

30、本實(shí)現(xiàn)了視頻、群聊、私聊幾個(gè)基本功能。看到網(wǎng)上似乎還沒(méi)有人放出這類 的源代碼,我索性就先當(dāng)回螃蟹吧! 我們先來(lái)看代 碼: 服務(wù)端: Application.java package org.jerry.videochat; import java.util.*; import org.red5.server.adapter.ApplicationAdapter; import org.red5.server.api.IConnection; import org.red5.server.api.IScope;

31、60;import org.red5.server.api.service.IServiceCapableConnection; import org.red5.server.api.so.ISharedObject; public class Application extends ApplicationAdapter  / 屬性 private IScope appScope; private String username; private ISharedObject listSO; private ISharedOb

32、ject msgSO; private Map<String, IConnection> onLineClient = new HashMap<String, IConnection>(); / 方法 / 此應(yīng)用開(kāi)始運(yùn)行時(shí)觸發(fā)的方法 public boolean appStart(IScope app)  if (!super.appStart(app)  return false;  appScope = app; return true;  / 客戶端連接的

33、時(shí)候觸發(fā)的方法 public boolean appConnect(IConnection conn, Object params)  username = (String) params0; / 登入時(shí)將連接ID和連接信息形成對(duì)應(yīng)關(guān)系并存入在線列表 String link_id = conn.getClient().getId(); onLineClient.put(username, conn); / 為用戶列表共享對(duì)象添加屬性 / 創(chuàng)建用戶列表共享對(duì)象 listSO = getSharedObject(app

34、Scope, "listSO", false); / 創(chuàng)建用戶聊天內(nèi)容共享對(duì)象 msgSO = getSharedObject(appScope, "msgSO", false); listSO.setAttribute(link_id, username); return true;  / 廣播消息 public void broadcastUserMsg(String msg)  / 公聊 / 刷新共享對(duì)象屬性 msgSO.setAttribute(&

35、quot;msg", msg);  / 私聊信息 public void msgFromPrivate(String msg, String from, String to)  IServiceCapableConnection fc = (IServiceCapableConnection) onLineClient .get(from); IServiceCapableConnection tc = (IServiceCapableConnection) onLineClient .get(to); 

36、fc.invoke("showMsgByPrivate", new Object msg ); tc.invoke("showMsgByPrivate", new Object msg );  / 用戶斷開(kāi)連接的時(shí)候觸發(fā) public void appDisconnect(IConnection conn)  String dis_link_id = conn.getClient().getId(); String user = (String) listSO.getAttribute(dis_

37、link_id); / 根據(jù)ID刪除對(duì)應(yīng)在線紀(jì)錄 onLineClient.remove(user); / 刪除用戶列表共享對(duì)象的對(duì)應(yīng)屬性 listSO.removeAttribute(dis_link_id);   客戶端代碼: videoChat.as package  import fl.controls.Button; import fl.controls.List; import fl.controls.TextArea; import fl.c

38、ontrols.TextInput; import fl.data.DataProvider; import fl.managers.StyleManager; import flash.display.Sprite; import flash.events.AsyncErrorEvent; import flash.events.Event; import flash.events.KeyboardEvent; import flash.events.MouseEvent; import flash.events

39、.NetStatusEvent; import flash.events.SecurityErrorEvent; import flash.events.SyncEvent; import flash.media.Camera; import flash.media.Microphone; import flash.media.Video; import .NetConnection; import .NetStream; import .SharedObject; import flash.text.T

40、extField; import flash.text.TextFormat; import flash.ui.Keyboard; /* * . Red5 視頻聊天 . * author Jerry */ public class videoChat extends Sprite  /屬性 private var IP:String; private var redPath:String; private var nc:NetConnection; private var n

41、s:NetStream; private var ns2:NetStream; private var cam:Camera; private var mic:Microphone; private var listSO:SharedObject; private var msgSO:SharedObject; private var userArr:Array; private var sendMsg:String; private var now:Date; private var userIDObj

42、:Object; /構(gòu)造函數(shù) public function videoChat()  _init();       /初始化 _setComponentStyle();    /設(shè)置組件樣式 _startConnect();     /開(kāi)始連接服務(wù)器  /初始化 private function _init()  IP = "0"&#

43、160;redPath = "rtmp:/" + IP + "/videoChat" nc = new NetConnection(); from.text = "guest" + int(Math.random() * 1000); to.text = "所有人" now = new Date();  /設(shè)置組件樣式 private function _setComponentStyle()  var myTF:TextFormat

44、= new TextFormat(); myTF.size = 12; myTF.font = "雅黑宋體" StyleManager.setStyle("textFormat", myTF);  /開(kāi)始連接 private function _startConnect()  nc.addEventListener(NetStatusEvent.NET_STATUS, _statusHandler); nc.addEventListener(SecurityErrorEven

45、t.SECURITY_ERROR, _securityHandler); nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR, _asyncHandler); nc.connect(redPath, from.text); nc.client = this;  /狀態(tài)監(jiān)聽(tīng) private function _statusHandler(evt:NetStatusEvent)  if (.code = "NetConnection.Connect.Succe

46、ss")  chatCon.text += "連接成功!n" _scrollToEnd(); _publishVideo();     /發(fā)布自己的視頻 _setListSO();      /創(chuàng)建用戶列表共享對(duì)象 _setMsgSO();      /創(chuàng)建發(fā)言信息共享對(duì)象 sendBtn.addEventListener(MouseEvent.CLICK, _sen

47、dBtnByClick);   /單擊發(fā)送信息 stage.addEventListener(KeyboardEvent.KEY_DOWN, _sendBtnByKey);     /回車發(fā)送信息  if (.code = "NetConnection.Connect.Failed")  chatCon.text += "連接失敗!n" _scrollToEnd();  if (.code =

48、"NetConnection.Connect.Closed")  chatCon.text += "連接關(guān)閉!n" _scrollToEnd();   /安全性監(jiān)聽(tīng) private function _securityHandler(evt:SecurityError)  chatCon.text += "安全性錯(cuò)誤!n" _scrollToEnd();  /異步錯(cuò)誤 private function _asyncHandle

49、r(evt:AsyncErrorEvent)  chatCon.text += "異步錯(cuò)誤!n" _scrollToEnd();  /發(fā)布自己的視頻 private function _publishVideo()  ns = new NetStream(nc); cam = Camera.getCamera(); mic = Microphone.getMicrophone(); liveVideo.attachCamera(cam); ns.client = this;&

50、#160;ns.addEventListener(NetStatusEvent.NET_STATUS, _statusHandler); ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, _asyncHandler); ns.attachCamera(cam); ns.attachAudio(mic); ns.publish(from.text, "live"); whoseVideo.text = from.text + "的視頻"  

51、/創(chuàng)建用戶列表共享對(duì)象 private function _setListSO()  listSO = SharedObject.getRemote("listSO", nc.uri, false); listSO.connect(nc); listSO.addEventListener(SyncEvent.SYNC, _listSOSyncHandler);  /創(chuàng)建發(fā)言信息共享對(duì)象 private function _setMsgSO()  msgSO = SharedObject.getR

52、emote("msgSO", nc.uri, false); msgSO.addEventListener(SyncEvent.SYNC, _msgSOSyncHandler); msgSO.connect(nc);  /用戶列表共享對(duì)象被更新之后事件 private function _listSOSyncHandler(evt:SyncEvent)  _showUserList();     /更新用戶列表 /用戶列表添加鼠標(biāo)事件 userList.a

53、ddEventListener(MouseEvent.CLICK, _updateChatTo); userList.addEventListener(MouseEvent.DOUBLE_CLICK, _updateVideoShow);  /發(fā)言信息共享對(duì)象被更新之后事件 private function _msgSOSyncHandler(evt:SyncEvent)  /更新聊天內(nèi)容 for (var i in msgSO.data)  chatCon.htmlText += msgSO.datai; 

54、60; /更新用戶列表 private function _showUserList()  userArr = new Array(); /用戶數(shù)組更新 for (var tmp in listSO.data)  userArr.push(listSO.datatmp);  /添加DataProvider var tmpDP:DataProvider = new DataProvider(); for (var i = 0; i < userArr.length; i+ )  t

55、mpDP.addItem( label:userArri );  /名稱排序 tmpDP.sortOn("label"); /在用戶列表頂端加一個(gè)“所有人” tmpDP.addItemAt( label:"所有人" , 0); /將數(shù)組添加到列表中顯示出來(lái) userList.dataProvider = tmpDP;  /更新聊天對(duì)象 private function _updateChatTo(evt:MouseEvent)  to.text

56、= userList.selectedItem.label;  /更新視頻顯示和視頻文本顯示 private function _updateVideoShow(evt:MouseEvent)  ns2 = new NetStream(nc); if (from.text = to.text)  /顯示我的視頻 ns2.close(); liveVideo.clear(); whoseVideo.text = "我的視頻" liveVideo.attachCamera(cam

57、);  else  /顯示其他人的視頻 whoseVideo.text = to.text + "的視頻" ns2.client = this; ns2.addEventListener(NetStatusEvent.NET_STATUS, _statusHandler); ns2.addEventListener(AsyncErrorEvent.ASYNC_ERROR, _asyncHandler); liveVideo.attachNetStream(ns2); ns2.play(

58、to.text);   /單擊發(fā)送信息 private function _sendBtnByClick(evt:MouseEvent)  _sendMsg();  /回車發(fā)送信息 private function _sendBtnByKey(evt:KeyboardEvent)  if (evt.keyCode = Keyboard.ENTER)  _sendMsg();   /發(fā)送信息處理方法 private function _sendMsg() &

59、#160;sendMsg="<font color='#ff0000'>" + from.text + "</font>" + " 對(duì) " + "<font color='#ff0000'>" + to.text + "</font>" + " 說(shuō) " + "(" + "<font color='#0000ff'>" + now.

60、getHours() + ":" + (now.getMinutes() < 10?"0" + now.getMinutes():now.getMinutes() + ":" + (now.getSeconds() < 10?"0" + now.getSeconds():now.getSeconds() + "</font>" + ")" + ":" +"t" + msgInput.text + "n&

61、quot; if (from.text = to.text)  /禁止對(duì)自己發(fā)言 chatCon.text += "對(duì)不起,您不能對(duì)自己發(fā)言!" _scrollToEnd();  else if(msgInput.text="") /發(fā)言不能為空 chatCon.text += "請(qǐng)?jiān)谙旅娴奈谋究蛑休斎氚l(fā)言內(nèi)容!" _scrollToEnd();  else if (to.text = "所有人") 

62、60;/調(diào)用服務(wù)端廣播方法 nc.call("broadcastUserMsg", null, sendMsg); msgInput.text = ""  else  /私聊 nc.call("msgFromPrivate", null, sendMsg, from.text, to.text); msgInput.text = ""   /將滾動(dòng)條滾動(dòng)到最底端 private function _scro

63、llToEnd()  chatCon.verticalScrollPosition = chatCon.maxVerticalScrollPosition;  /私聊方法(被服務(wù)端調(diào)用) public function showMsgByPrivate(_msg:String)  chatCon.htmlText += _msg; _scrollToEnd();   /最近要做一個(gè)流媒體服務(wù)器,在網(wǎng)上逗留了好久決定選擇red5。但是網(wǎng)上中文資料很少視頻資料更是不敢奢望,只有啃一些英文文檔了, 廢

64、話少說(shuō)直奔主題>>> 我用到的軟件有:                 1.  JdkvforWindows;                 2.  setup-Red5-0.7.0.exe(這個(gè)從官網(wǎng)下載http:

65、//red5/070final速度比較慢);                 3.  eclipse(英文版-下載原名是eclipse-jee-galileo-SR1-win32.zip)                 4.&

66、#160;Flash8-chs.exe(這個(gè)很好下,到就可找到)操作流程:第一步> 安裝jdk:            我的jdk安裝目錄是C:Javajdk1.6.0_05安裝時(shí)手動(dòng)改的,jre的目錄是默認(rèn)的C:Program FilesJavajre1.6.0_05。第二步> 配置jdk的環(huán)境變量:            

67、環(huán)境變量的配置,網(wǎng)上到處都有,我在這里就不啰嗦了只是把配置的參數(shù)貼這里:JAVA_HOME >>“C:Javajdk1.6.0_05”;            CLASSPATH>>“.;%JAVA_HOME%lib;%JAVA_HOME%libtools.jar;%JAVA_HOME%libdt.jar;”;            Path>&g

68、t;“;%JAVA_HOME%bin;%JAVA_HOME%jrebin;”;第三步> 安裝red5:             red5的安裝其實(shí)很簡(jiǎn)單,一直默認(rèn)就好了,C:Program FilesRed5;第四步> 解壓eclipse:            把eclipse解壓到任意的目錄都沒(méi)關(guān)系;第五步> 配置red5:   &#

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論