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檢視。