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查看。