版權聲明:原創作品,允許轉載,轉載時請務必以超連結形式标明文章 原始出處 、作者資訊和本聲明。否則将追究法律責任。http://beniao.blog.51cto.com/389148/137935 |
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,所使用的開發語言是Action. 3.0,這裡我不想浪費時間去介紹軟體的安裝,相信看這篇文章的你對于安裝軟體不會存在有什麼難度,OK,下面看看怎麼編碼實作。 一 、FMS應該做些什麼 本文中所使用到的FMS是非常簡單的,主要就就是建立一個FMS應用,方法很簡單。找到你安裝FMS的目錄你會發現裡面有一個appliations的目錄。對的,它就是管理FMS應用的目錄,進入該目錄在裡面建立一個檔案夾就OK,我建立的檔案夾為"firstFMS"。 二、Flash連接配接到FMS伺服器 首先建立一個Flash檔案(Action. 3.0)并将其儲存在某個目錄(自己決定吧)中。然後打開元件面闆(可以按Ctrl+F7)從元件面闆中拖拽一個button元件到剛建立好的Flash的舞台(也就是Flash顯示東西的那一塊地方),然後通過屬性面闆(可以按Ctrl+F3)将剛拖拽出的button取個名字(Flash中叫他為執行個體名,舞台中的每一個元件就是一相對應的對象的執行個體),我取的是btnConnFMS。 完成上面兩步後回到舞台,滑鼠在舞台中空白位置點選一下,然後同樣打開屬性面闆,你會發現現在的屬性面闆和先前的有些不一樣,在釋出選項下找到“類”,這裡我填寫的為“ConnFMS”,表示我将要通過ConnFMS.as這個類檔案來對目前的這個Flash進行編碼。 上面承諾了由ConnFMS.as來負責Flash的編碼工作,那該怎麼做呢?建立一個Action.類檔案,儲存在之前儲存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:.> 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 20private 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 30private 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 55private function onAsyncErrorHandler(evt:AsyncErrorEvent):void 56 {} 57 ]]> 58 </mx:.> 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版本安裝選擇錯誤引起,如果安裝的是Flash media streaming server就會出現類似上面的問題,建議安裝Flash media interactive server版本。 運作上面的執行個體程式,然後可以通過FMS的管理控制台檢視到詳細的連接配接資訊。我通常是使用的FMS安裝目錄下的fms_adminConsole.swf 來檢視連接配接資訊,也可以使用FMSfms_adminConsole.htm檢視。 本文出自 “beniao” 部落格,請務必保留此出處http://beniao.blog.51cto.com/389148/137935本文出自 51CTO.COM技術部落格 |