- 簡介
Red5的主要功能和Macromedia公司的FMS類似,提供基於Flash的流媒體服務的一款基於Java的開源流媒體服務器。它由Java語言編寫,使用RTMP作爲流媒體傳輸協議,這與FMS完全兼容。它具有流化FLV、MP3文件,實時錄製客戶端流爲FLV文件,共享對象,實時視頻播放、Remoting等功能。用Red5替換FMS後,客戶端不用更改可正常運行。
提供red5相關的鏈接:
下載地址:http://www.red5.org/downloads/
相關實例:http://trac.red5.org/wiki/Examples
相關文檔:http://trac.red5.org/wiki/Documentation
- 運行部署實例
- ApplicationAdapter類
- //Red5應用程序啓動時自動執行此方法
- public boolean appStart(IScope arg0)
- public void appStop(IScope arg0)
//flex客戶端連接項目時自動運行的方法
- public boolean appConnect(IConnection arg0, Object[] arg1)
//flex客戶端與服務器斷開連接時觸發的方法
- public void appDisconnect(IConnection arg0)
//flex客戶端與服務器連接時運行,與appConnect比較類似
- public boolean appJoin(IClient arg0, IScope arg1)
//flex客戶端與服務器斷開時運行,與appDisconnect類似
- public void appLeave(IClient arg0, IScope arg1)
- Red5關鍵API
Red5提供了很多接口供開發人員進行二次開發:
IConnection:連接對象。每個連接都有一個關聯的客戶端和域。連接可能是持續型、輪詢型、或短暫型。建立此接口的目的,是爲了給不同的子類,如 RTMPConnection,RemotingConnection,AJAXConnection, HttpConnection 等,提供基礎通用的方法。它提供getClient()方法來獲取客服端對象。
IScope :每個Red5應用程序至少有一個域,用來搭建處理器、環景、服務器之間的連接。域可以構成樹形結構,所有客戶端都可以作爲其節點共享域內的對象(比如流和數據)。所有的客服端(client)通過連接(connection)連接到域中。對於單一域,每個連接對應一個客服端,每個客服端對應一個id,簡單的應用,操作就針對一個id和一個連接進行。
IServiceCapableConnection :獲取有效連接。代碼中先獲取到連接實例,然後判斷是否是有效連接並強制類型轉換,之後調取客戶端相應函數。
IClient :客戶端對象代表某單一客戶端。一個客戶端可以和同一主機下不同的域分別建立連接。客戶端對象和HTTP session 很相像。可以使用IClientRegistry.newClient(Object[])方法來創建IClient對象。
ApplicationAdapter:ApplicationAdapter是應用層級的IScope。若要處理流進程,需實現 IStreamAwareScopeHandler接口中的相應處理方法。ApplicationAdapter還提供了有效的事件處理機制,來進行截取流、確認用戶等操作。同時,其子類中引入的方法均可在客戶端通過 NetConnection 調取。在Aodbe 的FMS 中必須在服務器端維護客戶端對象,與之相較,Red5 爲您的遠程請求提供了更加方便快捷的操作方法。
- 簡單實例
- //創建NetConnection實例
- var netConn:NetConnection = new NetConnection();
- //指定rtmp地址,並且向服務器傳遞一個參數值"hello"
- netConn.connect("rtmp://localhost/chatroom","hello");
- //添加NetStatus事件監聽連接
- netConn.addEventListener(NetStatusEvent.NET_STATUS,function connStatus(e:NetStatusEvent):void{
- switch(e.info.code){
- //連接成功
- case "NetConnection.Connect.Success":
- l_connStatus.text = "連接成功";
- break;
- //服務器斷開
- case "NetConnection.Connect.Closed":
- l_connStatus.text = "連接斷開";
- break;
- //能連上,但被拒絕訪問
- case "NetConnection.Connect.Failed":
- l_connStatus.text = "連接拒絕";
- break;
- default:
- break;
- }
- });
command
參數中指定的方法時,這些參數將被傳遞給該方法- /**
- * 發送消息
- * */
- protected function sendMsg():void
- {
- netConn.call("sendMessage",new Responder(function result():void{
- }),uName,txt_msg.text);
- }
- public void sendMessage(String userName,String message){
- ....
- }
- new Responder(function result(str:String):void{
- ....
- })
- //指定連接client,方便red5調用當前客戶端的方法
- netConn.client = this;
- /**
- * 【供red5調用的方法】
- * 客戶端與red5連接時,red5向客戶端返回的消息
- * */
- public function connection_msg(str:String):void{
- Alert.show(str);
- }
- public boolean appConnect(IConnection arg0, Object[] arg1) {
- callClient(arg0,"通知客戶端連接成功");
- return super.appConnect(arg0, arg1);
- }
- /**
- * Function : red5調用客戶端connection_msg方法,返回相應信息
- * @author : bless<[email protected]>
- * @param conn
- * @param str
- */
- private void callClient(IConnection conn,String str){
- if(conn instanceof IServiceCapableConnection){
- IServiceCapableConnection sc = (IServiceCapableConnection) conn;
- sc.invoke("connection_msg", new Object[]{str});
- }
- }
- public boolean appConnect(IConnection arg0, Object[] arg1) {
- //通知其它用戶該用戶上線
- notifyAppConnect(arg0.getScope(),"用戶A上線啦");
- }
- /**
- * Function : 通知其它客戶,用戶上線信息
- * @author : bless<[email protected]>
- * @param scope
- */
- private void notifyAppConnect(IScope scope,String userName){
- //遍歷所有鏈接到服務器的客戶端
- Collection<Set<IConnection>> col = scope.getConnections();
- for (Set<IConnection> set : col) {
- for (IConnection iConnection : set) {
- //通知有所客戶端上線用戶信息
- if(iConnection instanceof IServiceCapableConnection){
- IServiceCapableConnection sc = (IServiceCapableConnection) iConnection;
- sc.invoke("otherConnection_msg", new Object[]{userName});
- }
- }
- }
- }
- public class HelloRed5 extends ApplicationAdapter implements IScheduledJob{
- public boolean appStart(IScope arg0) {
- System.out.println("啓動 appStart");
- //添加計劃任務
- this.addScheduledJob(10000, this);
- return super.appStart(arg0);
- }
- /**
- * IScheduledJob接口實現方法
- */
- @Override
- public void execute(ISchedulingService arg0)
- throws CloneNotSupportedException {
- //運行定時任務的實際方法
- callEvery(this.getScope(),"運行下計劃任務...");
- }
- }