本文介紹如何使用ActionScript和UMS開發實時交互式多媒體應用。RTMP協議是flash/AIR平臺原生支持的實時消息協議。基於RTMP協議,flash/AIR平臺應用能夠和服務端進行雙向數據通訊、傳輸實時音視頻。ActionScript3中的NetConnection對象提供了與RTMP服務端創建鏈接、收發數據包的接口。使用這些原生接口進行應用開發,無疑是最高效和便捷的。javascript
AMS是Adobe Media Server(之前叫FMS)的縮寫,是Adobe官方推出的標準RTMP服務器,支持用服務端js語言編寫服務端擴展,但AMS的js平臺比較封閉,不能加載外部模塊,只能簡單調用服務端的js對象對鏈接指令、受權進行處理。若是要開發與數據業務集成緊密的大型flash網絡應用,則AMS將顯得力不從心,由於AMS服務器跟經常使用的數據庫(如redis/MySQL/MongoDB/Sqlite3等)集成的能力很是有限。java
UMS是Ultrant Media Server的縮寫,是一款多功能高性能流媒體/交互服務器解決方案,基於node.js構建,底層採用高性能C/C++多線程異步框架實現鏈接管理,並將絕大部分可操做功能以javascript接口方式暴露在node.js上下文中,能實現精確的實時流量統計、鏈接管理、權限驗證以及靈活方便的遠程接口擴展,能應對多媒體上層業務的快速變化。業務層邏輯可以徹底經過js進行擴展和控制,支持RTMP協議,支持AMF0/AMF3編碼,支持RTMP命令服務端擴展。node
因爲node.js是一個開放的開發平臺,擁有龐大而活躍的開發者社區,基於node.js開發的模塊達到10萬之多。UMS將RTMP命令擴展到node.js層面,無異於打通了RTMP鏈接和龐大的應用層模塊之間的藩籬,將AS3應用帶入了豐富多彩的接入層,AS3應用能夠輕鬆接入各種數據庫模塊(sqlite3/redis/mysql/mongodb等)。mysql
長話短說,來看一個簡單的AS3和服務端交互的例子。redis
1 package 2 { 3 import flash.display.Sprite; 4 import flash.events.Event; 5 import flash.events.NetStatusEvent; 6 import flash.net.NetConnection; 7 import flash.net.ObjectEncoding; 8 import flash.net.Responder; 9 10 public class AS3UMSTutor1 extends Sprite 11 { 12 private var _nc:NetConnection = null; 13 private var _responder:Responder = null; 14 15 public function AS3UMSTutor1() 16 { 17 this.addEventListener(Event.ADDED_TO_STAGE, setupPlayer); 18 this._nc = new NetConnection(); 19 this._nc.objectEncoding = ObjectEncoding.AMF3; 20 this._nc.addEventListener( NetStatusEvent.NET_STATUS, netStatusHandler); 21 //Allow method within the class to be called by the server side script 22 this._nc.client = this; 23 this._responder = new Responder(onResponderReply, onResponderError); 24 } 25 26 protected function setupPlayer(event:Event=null):void { 27 try { 28 this.removeEventListener(Event.ADDED_TO_STAGE, setupPlayer); 29 this._nc.connect("rtmp://127.0.0.1/myApp"); 30 } catch (err:Error) { 31 // 32 } 33 } 34 35 //Handle NetStatus 36 private function netStatusHandler( event:NetStatusEvent ):void 37 { 38 //trace(event.info.code); 39 switch( event.info.code ) 40 { 41 // Successfully connected to UMS, execute function 42 case "NetConnection.Connect.Success": 43 { 44 this._nc.call("helloFromAS3", this._responder, "hello,ums :)"); 45 } 46 break; 47 case "NetConnection.Connect.Rejected": 48 break; 49 case "NetConnection.Connect.Closed": 50 break; 51 case "NetConnection.Connect.Failed": 52 break; 53 } 54 } 55 private function onResponderReply(result:Object):void{ 56 trace(result.message); 57 } 58 private function onResponderError(result:Object):void{ 59 trace(result.message); 60 } 61 } 62 }
1 /////////////////////////////////////////////////////////////////////////////// 2 // file : as3tutor1.js 3 // author : IMMAAC Co.,Ltd. 4 // description : example file to demonstrate how to use ums 5 /////////////////////////////////////////////////////////////////////////////// 6 7 var ums = require('umsjs'); 8 9 /** 10 * global options 11 */ 12 13 var rtmpPort = 1935; 14 15 /////////////////////////////////////////////////////////////////////////////// 16 // @function : main 17 // @params : server - (RTMPServer, RTMPServer實例) 18 // @return : 無 19 // @brief : 用戶程序入口,在這裏添加相關業務邏輯操做。 20 // @remark : 進入該入口前,RTMPServer並未添加任何服務端應用程序(server-side 21 // application),只是開始在相應端口上監聽新鏈接,但任何新創建的鏈接 22 // 都會被拒絕。因此必須爲server添加至少一個服務端應用程序,服務才能 23 // 正常工做。 24 /////////////////////////////////////////////////////////////////////////////// 25 function main(server){ 26 // 訂閱TCP鏈接創建的時間通知 27 server.on('connection', function(conn){ 28 // 接受一個TCP鏈接 29 this.accept(conn, true); // 拒絕鏈接用法 : this.accept(conn, false); 30 }); 31 // 訂閱RTMPServer出錯通知 32 server.on('error', function(err){ 33 console.dir(err); 34 }); 35 // 訂閱RTMPServer關閉通知 36 server.on('close', function(){ 37 console.log('server closed.'); 38 }); 39 // 載入服務端應用程序'myApp' 40 loadmyApp(server); 41 } 42 43 /////////////////////////////////////////////////////////////////////////////// 44 // @function : loadmyApp 45 // @params : server - (RTMPServer, 一個已經成功建立並運行的RTMPServer實例) 46 // @brief : 加載一個名爲'myApp'的服務端應用程序。 47 // @remark : 該示例將完成以下操做: 48 // 1.建立一個名爲'myApp'的服務端應用程序; 49 // 2.訂閱相關事件。 50 /////////////////////////////////////////////////////////////////////////////// 51 function loadmyApp(server){ 52 // 建立一個名爲'myApp'的服務端應用程序ums.Application的實例 53 var app = ums.createApplication("myApp"); 54 // 訂閱出錯事件 55 app.on('error', function(err){ 56 console.log('error : ', err); 57 }) 58 // 添加'connect'事件的監聽處理函數 59 app.on('connect', function(cmd, client){ 60 // 接受新鏈接 61 app.accept(cmd, client, true);// 拒絕鏈接用法 : app.accept(cmd, client, false); 62 // 訂閱錯誤事件 63 client.on('error', function(err){ 64 console.dir(err); 65 }); 66 // 訂閱關閉事件 67 client.on('close', function(){ 68 console.log("client[",this.clientId,"] closed. Total time :", 69 (new Date()).getTime() - client.connectedTime.getTime()); 70 }); 71 // 訂閱helloFromAS3事件 72 client.on('helloFromAS3', function(cmd, message){ 73 console.dir(message); // hello,ums :) 74 cmd.echoResult({ 75 message : 'hello, as3 :)' 76 }); 77 }); 78 }); 79 // 將服務端應用實例註冊到RTMPServer實例中 80 server.register(app); 81 } 82 83 /////////////////////////////////////////////////////////////////////////////// 84 // @function : entryPoint 85 // @params : 無 86 // @brief : 主程序入口,在這裏完成RTMPServer的初始化工做 87 /////////////////////////////////////////////////////////////////////////////// 88 function entryPoint(){ 89 // 建立一個RTMPServer選項集合,構造參數指定爲服務器選項集合 90 var serverOpt = ums.createRTMPOptions(true); 91 serverOpt.rtmpPort = rtmpPort; 92 // 建立RTMPServer實例 93 var server = ums.createRTMPServer(serverOpt); 94 server.start(function(err){ 95 if (err) { 96 console.log(err); 97 return; 98 } 99 // 進入用戶入口 100 main(server); 101 }); 102 } 103 104 /////////////////////////////////////////////////////////////////////////////// 105 // 進入主程序入口 106 // Every thing starts form here 107 /////////////////////////////////////////////////////////////////////////////// 108 109 entryPoint(); 110 111 /////////////////////////////////////////////////////////////////////////////// 112 // End of file : as3tutor1.js 113 ///////////////////////////////////////////////////////////////////////////////
本文介紹瞭如何使用AS3原生NetConnection對象與UMS創建RTMP鏈接,以及經過RTMP調用UMS服務端代碼註冊的函數,並從服務端返回消息的方法。更多複雜接口和高級用法,將在後續系列教程裏面陸續推出,敬請期待。sql