天天看點

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作) 轉

FMS是個很牛X的東西,到底有多牛X我不想在這裡多說,有興趣的朋友可以baidu一把了解一下,如果實在是不想動手,那你就點下面的連接配接吧,我搜尋了點資料簡單的總結了一下。

   你可以點選這裡了解一些關于FMS的基本知識: 了解一些FMS的基本概念

   通常做FMS都是和Flash或是Flex結合開發的,特别是在視訊流這方面相當的突出,成功案例也不少,比如http://www.tudou.com,  www.ku6.com , http://www.15dv.com 等視訊網站都與FMS挂鈎。本人也是因為工作需要,趁工作之餘來學習這門技術,想通過寫部落格的方式來鞏固和分享學習,更希望愛好或是在從事這方面開發工作的朋友多多指正,交流。OK,本文就以連接配接FMS伺服器作為寫作話題,來看看我們學習FMS應該從什麼地方出發,逐漸的走上更高的台階。

   Adobe公司的産品Flash和Flex都可以結合FMS進行程式設計,本文示例比較簡單,為了多湊幾個字我打算通過Flash和Flex兩種實作來介紹怎麼來實作我們的第一個FMS程式“連接配接到FMS伺服器”。

   上山砍柴不忘磨柴刀,那麼我們做技術開發肯定也離不開對開發環境,開發工具,開發語言的選擇和準備。本文中我們的工具就是Flash CS 4,Flex Builder 3和FMS 3.0,所使用的開發語言是ActionScript 3.0,這裡我不想浪費時間去介紹軟體的安裝,相信看這篇文章的你對于安裝軟體不會存在有什麼難度,OK,下面看看怎麼編碼實作。

  一 、FMS應該做些什麼

   本文中所使用到的FMS是非常簡單的,主要就就是建立一個FMS應用,方法很簡單。找到你安裝FMS的目錄你會發現裡面有一個appliations的目錄。對的,它就是管理FMS應用的目錄,進入該目錄在裡面建立一個檔案夾就OK,我建立的檔案夾為"firstFMS"。

二、Flash連接配接到FMS伺服器

   首先建立一個Flash檔案(ActionScript 3.0)并将其儲存在某個目錄(自己決定吧)中。然後打開元件面闆(可以按Ctrl+F7)從元件面闆中拖拽一個button元件到剛建立好的Flash的舞台(也就是Flash顯示東西的那一塊地方),然後通過屬性面闆(可以按Ctrl+F3)将剛拖拽出的button取個名字(Flash中叫他為執行個體名,舞台中的每一個元件就是一相對應的對象的執行個體),我取的是btnConnFMS。

   完成上面兩步後回到舞台,滑鼠在舞台中空白位置點選一下,然後同樣打開屬性面闆,你會發現現在的屬性面闆和先前的有些不一樣,在釋出選項下找到“類”,這裡我填寫的為“ConnFMS”,表示我将要通過ConnFMS.as這個類檔案來對目前的這個Flash進行編碼。

   上面承諾了由ConnFMS.as來負責Flash的編碼工作,那該怎麼做呢?建立一個ActionScript類檔案,儲存在之前儲存Flash檔案的同一目錄就OK,記住這個類檔案一定是“ConnFMS.as”。下面是ConnFMS.as的完整代碼:

 1 package  2 {  3     import flash.net.NetConnection;  4     import flash.net.NetStream;  5     import flash.display.MovieClip;  6     import flash.net.Responder;  7     import flash.events.MouseEvent;  8     import flash.events.NetStatusEvent;  9     import flash.events.AsyncErrorEvent; 10     11     public class ConnFMS extends MovieClip 12     { 13         private var nc:NetConnection; 14         15         public function ConnFMS() 16         { 17             btnConnFMS.label="連接配接到FMS"; 18         } 19         20         private function onClickHandler(evt:MouseEvent):void 21         { 22             trace("正在連接配接FMS伺服器"); 23             nc = new NetConnection(); 24             nc.connect("rtmp://localhost/firstFMS"); 25             nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatusHandler); 26         } 27         28         private function onNetStatusHandler(evt:NetStatusEvent):void 29         { 30             switch (evt.info.code) 31             { 32                 case "NetConnection.Connect.Success": 33                     trace("成功連接配接FMS伺服器!"); 34                     break; 35                 case "NetConnection.Connect.Rejected": 36                     trace ("通路FMS伺服器權限不足,連接配接被拒絕!"); 37                     break; 38                 case "NetConnection.Connect.InvalidApp": 39                     trace("指定的應用程式名稱沒有找到"); 40                     break; 41                 case "NetConnection.Connect.Failed": 42                     trace("連接配接失敗!"); 43                     break; 44                 case "NetConnection.Connect.AppShutDown": 45                     trace("伺服器端應用程式已經關閉(由于資源耗用過大等原因)或者伺服器已經關閉!"); 46                     break; 47                 case "NetConnection.Connect.Closed": 48                     trace("與FMS的連接配接中斷!"); 49                     break; 50             } 51         } 52     } 53 }

三、Flex連接配接到FMS伺服器

   首先建立好Flex項目,預設會建立一個MXML檔案,簡單化實作這裡就直接在這個MXML檔案裡來實作連接配接FMS。代碼上和Flash連接配接到FMS幾乎沒有什麼差别,主要就是學習NetConnection類來完成,如下代碼定義:

1 //Flex與FMS建立連接配接的對象 2 private var netConn:NetConnection; 3 //FMS伺服器的位址,使用rtmp協定 4 private var rtmpUrl:String="rtmp://localhost/firstFMS"; 

  NetConnection訓示 Flash Player 是通過持久性的 RTMP 連接配接連接配接到伺服器,實作這一步操作是通過NetConnection類的connect()方法來完成的。如下:

1 //當Flex應用程式啟動的時候就建立與FMS伺服器的連接配接, 2 internal function onInit():void 3 { 4     netConn = new NetConnection(); 5     netConn.connect(rtmpUrl); 6     netConn.addEventListener(NetStatusEvent.NET_STATUS,onNetStatusHandler); 7     netConn.addEventListener(AsyncErrorEvent.ASYNC_ERROR,onAsyncErrorHandler); 8 }

  connect()方法打開指定rtmp協定位址的FMS伺服器的連接配接。一旦調用該方法NetConnection的對象就會捕捉到FMS傳回的一個網絡連接配接狀态,通過NetStatusEvent事件監聽可以得到傳回狀态的值(詳細見本文前Flash部分),AsyncErrorEvent事件為異步引發異常(既本機異步代碼)時排程。關于NetConnection的各種狀态的詳細請檢視本文之前的Flash執行個體有詳細的介紹。

  由于執行個體比較簡單,這裡我就不在多說廢話,下面是通過Flex實作連接配接到FMS的完整代碼:

 1<?xml version="1.0" encoding="utf-8"?>  2<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">  3    <mx:Script>  4        <![CDATA[  5            import mx.controls.Alert;  6            //Flex與FMS建立連接配接的對象  7            private var nc:NetConnection;  8            //FMS伺服器的位址,使用rtmp協定  9            private var rtmpUrl:String="rtmp://localhost/firstFMS"; 10            11            //當Flex應用程式啟動的時候就建立與FMS伺服器的連接配接 12            internal function onClick():void 13            { 14                nc = new NetConnection(); 15                nc.connect(rtmpUrl); 16                nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatusHandler); 17                nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR,onAsyncErrorHandler); 18            } 19            20            private function onClickHandler(evt:MouseEvent):void 21            { 22                trace("正在連接配接FMS伺服器"); 23                nc = new NetConnection(); 24                nc.connect("rtmp://localhost/firstFMS"); 25                nc.client=this; 26                nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatusHandler); 27                nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR,onAsyncErrorHandler); 28            } 29        30            private function onNetStatusHandler(evt:NetStatusEvent):void 31            { 32                switch (evt.info.code) 33                { 34                    case "NetConnection.Connect.Success": 35                        trace("成功連接配接FMS伺服器!"); 36                        break; 37                    case "NetConnection.Connect.Rejected": 38                        trace ("通路FMS伺服器權限不足,連接配接被拒絕!"); 39                        break; 40                    case "NetConnection.Connect.InvalidApp": 41                        trace("指定的應用程式名稱沒有找到"); 42                        break; 43                    case "NetConnection.Connect.Failed": 44                        trace("連接配接失敗!"); 45                        break; 46                    case "NetConnection.Connect.AppShutDown": 47                        trace("伺服器端應用程式已經關閉(由于資源耗用過大等原因)或者伺服器已經關閉!"); 48                        break; 49                    case "NetConnection.Connect.Closed": 50                        trace("與FMS的連接配接中斷!"); 51                        break; 52                } 53            } 54            55            private function onAsyncErrorHandler(evt:AsyncErrorEvent):void 56            {} 57    ]]> 58    </mx:Script> 59    <mx:Button x="135" y="89" label="Button" click="onClick()" fontSize="12" fontWeight="normal"/> 60</mx:Application>

四、注意事項

  通常新手在學習FMS的時候都會遇到一個問題,那就是通過NetConnection連接配接FMS伺服器的時候,連接配接狀态總是傳回“NetConnection.Connect.Rejected”這樣的狀态結果,然後接着還有會有一個“NetConnection.Connect.Failed”狀态,是什麼原因造成這樣的錯誤的呢?

  第一個錯誤從本文執行個體中你可以得到,是通路FMS伺服器的權限問題,如果FMS沒有開設足夠的通路權限,通常在通路FMS的用戶端都會接受到這樣一個異常狀态。第二個錯誤又是怎麼産生的呢?這還是又通路權限引起,當用戶端沒有主夠的權限通路FMS伺服器,就将傳回“NetConnection.Connect.Rejected”狀态并自動斷開與FMS伺服器的連接配接,“NetConnection.Connect.Failed”狀态本身是由于連接配接伺服器失敗産生,而這裡是因為權限問題而引發的。

  前幾天很多朋友就在問我這個問題,怎麼來解決這個問題呢?如果你是一個技術專研者,如果又你趕興趣的技術在你面前,你首先會做什麼?檢視官方提供的文檔?執行個體代碼?還是什麼? OK,其實要解決這個問題很簡單,在FMS伺服器安裝好後的目錄下有一個"applications"目錄,裡面有兩個FMS預設安裝的FMS伺服器(live和vod),随便打開一個預設安裝然後打開裡面的"readme.txt"檔案會看到下面的字樣:

  ================================================================

  Deploying an unsigned vod service

  ================================================================

  1. Create a new folder in the {FMS-Install-Dir}/applications folder.

  2. If you are replacing the default Adobe signed live service, back up

   the following files: 

   * main.far    * Application.xml    * allowedHTMLDomains.txt    * allowedSWFDomains.txt

  3. Copy files from {FMS-Install-Dir}/samples/applications/vod to the directory you created in step 1.

  現在你知道怎麼解決上面出現的問題了嗎??将這main.far、Application.xml、allowedHTMLDomains.txt和allowedSWFDomains.txt這四個檔案複制到你建立的FMS伺服器目錄下就解決了,運作上面的執行個體程式,然後可以通過FMS的管理控制台檢視到詳細的連接配接資訊。

  我通常是使用的FMS安裝目錄下的fms_adminConsole.swf 來檢視連接配接資訊,也可以使用FMSfms_adminConsole.htm檢視。

繼續閱讀