Adobe flash media server 開發(fā)者向導(二)
By:閃閃威廉@nju
3.開發(fā)媒體應用程序
Adobe? Flash? Media Interactive Server的視頻應用程序可以是視屏點播或者是實況視頻的應用程序。視屏點播應用程序是從服務器發(fā)送編碼完的視頻流,比如電視節(jié)目,商業(yè)或個人錄制的存儲在服務器上是視頻。一個組織可能有大量的視頻檔案或最近正在拍攝視頻。視頻可以是短的片段(0-30秒),長片段(30秒到5分鐘),或非常長的片段(5分鐘到小時級別的長度)。
實況視頻應用程序將視屏從服務器流式的發(fā)給用戶或從用戶發(fā)送給服務器然后再到其他用戶。實況視頻是一個實況事件的典型應用,像公司會議,教育,體育事件和音樂會或者持續(xù)的發(fā)送,被電視臺和電臺使用。你可以使用可以從Adobe.com上得到的Adobe Flash Media Encoder來編碼和流傳播實況視頻。
3.1連接到服務器
3.1.1NetConnection類
在一個客戶端可從flash media server播放音頻和視頻之前,它必須連到服務器。連接的需求會被服務器的應用程序的實例接受或拒絕,連接消息會被發(fā)送回客戶端。一個應用程序接受連接請求,一個在客戶端和服務器端可用的連接就產生了。
NetConnection類連接客戶端到以個服務器的應用程序的實例。在最簡單的例子里面,你可以通過創(chuàng)建一個NetConnection對象的實例然后用應用程序實例的URI來調用connect()方法:
var nc:NetConnection = new NetConnection();
nc.connect("rtmp://localhost/HelloServer");
流處理網絡連接上音頻,視頻和數據的流動。一個NetCOnnection對象就像一個從客戶端到服務器,或從服務器到客戶端的傳輸音頻,視頻和數據流的管道。一旦你創(chuàng)建了NetConnection對象,你可以在上面附加一個或多個流。
一個流可以承載不止一種類型的連接(音頻,視頻和數據)。然而,一個流只流向一個方向,從服務器到客戶端或從客戶端到服務器。
許多流可以使用服務器和客戶端之間的NetConnection對象
A. Flash Media Server B. 單個數據流 C. NetConnection D. Flash Player, AIR, or Flash Lite 3客戶端。
3.1.2應用程序的URI
連接到應用程序的URI可以是相對路徑或絕對路徑,有以下語法(括弧里面的是可選的):
protocol:[//host][:port]/appname/[instanceName]
組成部分 | 舉例 | 描述 |
protocol: | rtmp: | 協(xié)議是用來連接到Adobe Flash Media Server, 全城就是 Adobe Real-Time Messaging Protocol. 可能的值為 are rtmp, rtmpe, rtmps, rtmpt, and rtmpte. 要看跟多信息,查看技術前言 |
//host | //www.example.com //localhost | 本地或遠程計算機的主機名. 連接到一個作為服務器和客戶端的同一臺電腦, 使用 //localhost 或者忽略 //host 標識符。 |
:port | :1935 | 連接到 Adobe Flash Media Server的端口號,如果協(xié)議是 rtmp, 默認的端口號是 1935 你不需要制定特殊的端口號 |
/appname/ | /sudoku/ | 當你的應用程序配置完成后RootInstall/applications的子目錄的名字。你可以在fms.ini(在 RootInstall/conf/fms.ini).配置文件里面為你的應用程序的目錄指定其他位置 。 |
instanceName | room1 | 客戶端連接的應用程序的實例,比如,一個聊天室的應用程序會有許多聊天的房間:chatroom/room1, chatroom/room2,等等 如果你不指定一個實例的名字,客戶端就連接默認的實例,名叫_definst_. |
URI里面唯一需要的部分是protocol 和application name,如下所示
rtmp://www.example.com/sudoku/
在下面的例子里面,客戶端是作為服務器的同一臺電腦,這是在你開發(fā)和測試應用程序時很常見的:
rtmp:/sudoku/room1
3.1.3helloserver應用程序
你可以在安裝的根目錄下的documentation/samples/HelloServer目錄下找到HelloServer應用程序。這個簡單的Flash應用程序顯示兩個按鈕,可以讓你創(chuàng)建和關閉與服務器的連接。輸出窗口顯示了連接狀態(tài)的信息。
運行應用程序
最簡單的運行這個范例的方法時將它安裝到作為服務器的同一臺電腦上。
1.在flash media server的安裝根目錄的documentation/samples 目錄下復制HelloServer文件夾。
2.在服務器的application文件夾RootInstall/applications/HelloServer下創(chuàng)建一個文件夾來注冊應用程序。
3.(可選)要想在一個不同的電腦上運行sample,打開HelloServer.as文件,編輯下面的行,把你自己服務器的URL加進去
nc.connect("rtmp://localhost/HelloServer");
要知道如何構造一個URL查看《連接到服務器》。
設計Flash用戶界面
范例已經建號并且包括在一個ZIP文件里面,然而,這些說明告訴你怎么重創(chuàng)建它這樣你就可以建造你自己的并且向里面添加東西。
1.在Adobe Flash CS3 Professional里面,選擇文件 > 新建 > Flash文件 (ActionScript 3.0), 點擊Ok.
2.選擇窗口>組件打開組建面板。
3.點擊按鈕組件并將它拖到舞臺。
4.在屬性查看器中,點擊屬性條目。選擇MovieClip作為實例行為,并且將實例的名稱里面填入connectBtn。
5點擊參數條目,然后選則Label,將按鈕的Label設置為Connect。
6.拖動第二個按鈕組件到舞臺。
7.將第二個按鈕的實例名稱設置為closeBtn,Label為Close。
8.保存FLA文件,命名為HelloServer.fla。
創(chuàng)建客戶端腳本
你可以在Flash Media server的安裝根目錄下的documentation/samples/HelloServer目錄里找到完整的Actionscript范例,名為HelloServer.as。當你開發(fā)Actionscript3.0的代碼。查看ActionScript 3.0語言和組件參考。
1.在Adobe Flash CS3 Professional里面選擇文件>新建>Actionscript文件,然后點擊OK。
2.以大寫字母開頭并且以.as為擴展名來命名和保存這個ActionScript文件。比如HelloServer.as。
3.返回到FLA文件,選擇文件>發(fā)布設置。點擊flash條目然后設置。
4.在文檔類的框框里面,輸入HelloServer。點擊綠色的檢查標記來去確保類文件存在。
5.點擊OK,然后再點擊OK。
6.再ActionScript文件里面聲明包。如果在FLA的同一目錄下保存的actionscript文件,不要使用包名,例如:
package {
}
然而如果你在FLA文件的目錄的子目錄下保存了as文件,包名必須匹配你的Actionscript文件的目錄,例如:
package samples {
}
7.在包里面,導入你需要的類:
import flash.display.MovieClip;
import flash.net.NetConnection;
import flash.events.NetStatusEvent;
import flash.events.MouseEvent;
8.在導入語句后,創(chuàng)建類的聲明。在類里面定義NetConnection類型的變量:
public class HelloServer extends MovieClip {
private var nc:NetConnection;
}
確保類是擴展了MovieClip類的(貌似Sprite類更好)
9編寫構造函數,為每個按鈕注冊事件偵聽。
public function HelloServer() {
// 為兩個按鈕注冊mouse clicks事件偵聽
connectBtn.addEventListener(MouseEvent.CLICK, connectHandler);
closeBtn.addEventListener(MouseEvent.CLICK, closeHandler);
}
使用addEventListener() 來調用一個名叫connectHandler()事件處理函數,處理當Connect按鈕被點擊時的事件。同樣的,當Close按鈕被點擊時調用closeHandler()。
10.編寫connectHandler()函數,當用戶點擊Connect按鈕時通過這個函數來連接到服務器:
public function connectHandler(event:MouseEvent):void {
trace("Okay, let's connect now");
nc = new NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
nc.connect("rtmp://localhost/HelloServer");
}
在connectHandler()中,添加了一個NetConnection對象的netStatus事件的事件偵聽。然后通過調用NetConnection.connect()和使用正確的URI連接到服務器上的應用程序的實例。這個URI連接到一個名叫HelloServer的應用程序實例,它就在這臺既作為服務器又作為客戶端的電腦上。
11.編寫closeHandler()函數來定義當用戶點擊Close按鈕時的行為。
public function closeHandler(event:MouseEvent):void {
trace("Now we're disconnecting");
nc.close();
}
這是明確的調用Close()來關閉和服務器端的連接的最好的實踐。
12.編寫netStatusHandler()函數來處理NetConnection對象返回的netStatus對象。
public function netStatusHandler(event:NetStatusEvent):void {
trace("connected is: " + nc.connected);
trace("event.info.level: " + event.info.level);
trace("event.info.code: " + event.info.code);
switch (event.info.code)
{
case "NetConnection.Connect.Success":
trace("Congratulations! you're connected" + "\n");
break;
case "NetConnection.Connect.Rejected":
trace ("Oops! the connection was rejected" + "\n");
break;
case "NetConnection.Connect.Closed":
trace("Thanks! the connection has been closed" + "\n");
break;
}
}
一個netStatus對象包含了一個info對象,info對象包含了表述連接狀態(tài)的level和 code。
3.1.3.1理解連接消息
當你運行范例,點擊了Connect按鈕時,一旦連接成功,你會看到這樣的消息:
Okay, let's connect now
connected is: true
event.info.level: status
event.info.code: NetConnection.Connect.Success
Congratulations! you'r e connected
Connected行是:true顯示了NetConnection.connected屬性的值,意味這Flash Player是否通過TRMP協(xié)議連接到了服務器。下面兩行描述了netStatus事件,NetConnection對象發(fā)送和報告了它的連接狀態(tài):、
event.info.level: status
event.info.code: NetConnection.Connect.Success
level屬性有兩個值:status或error。code屬性描述了連接的狀態(tài)。你可以在你的netStatusHandler函數里面檢查不同的code的值,并相應的做出響應。在你創(chuàng)建流或在你的應用程序里面做其他事情前都要檢查確保連接成功。
同樣的,當你點擊關閉按鈕時,你可以看到下面的信息:
Now we're disconnecting
connected is: false
event.info.level: status
event.info.code: NetConnection.Connect.Closed
Thanks! the connection has been closed。