flash10使用RTMFP 開發點對點應用

 

本文轉載自:http://pvantfln.blog.163.com/blog/static/174309520090173758608/

     通過Stratus 服務器在Flash Player中使用RTMFP 開發 點對點應用

Adobe Flash Player 10 和 Adobe AIR 1.5 引入了一個新的通訊協議,Real-Time Media Flow Protocol (RTMFP),其低延遲,端到端的對等功能,安全性和可擴展性使它特別適合開發實時協作應用,不僅提供卓越的用戶體驗,而且運營商降低成本。

 

早前的Flash Player 版本使用Real-Time Messaging Protocol (RTMP) 需要Adobe Flash Media Server (FMS)提供合作應用(例如 Adobe Acrobat Connect Pro)或者音頻視頻流。RTMP是streaming media, shared objects, 和 remoting連接的卓越選擇,它滿足實時性要求的交互式音頻和視頻通信的能力有限。

 

爲了能夠使用RTMFP,Flash Player 客戶端必須連接到一個支持RTMFP協議的服務器,例如Adobe Stratus beta 服務器或者是新版本的FMS。Stratus 是一臺用於Flash Player 客戶端間通信的主機。不同於FMS, Stratus 不支持視頻轉播,shared objects,腳本,等。因此,使用Stratus,只可以開發Flash Player的客戶端直接相互交流的應用程序。

 

Flash Player 已經在web視頻領域佔有重要的市場份額。由於採用RTMFP和先進的媒體壓縮技術,將有利於Flash Player 10處於實時通信的領先地位。

 

在這篇文章中,我首先強調在即時通訊領域使用RTMFP的優勢。其次,我將要介紹直接管理點對點RTMFP管理所對應的新的ActionScript 3.0 API。最後,我介紹我們的VideoPhone應用實例。

Requirements

要求

爲了使用文中的文件,你需要以下軟件和文件:

Flex Builder 3

注意:請按照Introducing Flex SDK 3.2 and Flex Builder 3.0.2指南中的方法去安裝Flex Builder 3.0.2.這裏麪包括Flex SDK 3.2, 這是爲了建立 Flash Player 10應用。儘管你也可以使用Adobe Flash Professional CS4 作爲開發工具,但這篇文件指導你如果使用Flex Builder 3建立一個簡單的應用.

Flash Player 10

Sample files:

Prerequisite knowledge

預備知識

熟悉ActionScript 3.0 和 Flex Builder 是必要的。

Benefits of RTMFP

RTMFP的好處

Real-Time Media Flow Protocol (RTMFP)是一個引入到Flash Player 10 和 in AIR 1.5新的通訊協議。同Real-Time Messaging Protocol (RTMP)的主要不同點之一是,RTMP基於傳輸控制協議 (TCP) 和 先前版本的Flash Player,RTMFP建立在 User Datagram Protocol (UDP)協議.

TCP提供了可靠的數據傳輸(也適用於文件傳輸,電子郵件等) ,它沒有提供任何端到端延遲保證。可靠的數據傳輸的TCP實現了重新傳輸丟失的數據,其中包括了延遲。由於儘量減少端到端延遲是實時通信 (幾百毫秒的延遲可能使一個會話不可用)中最重要的一個目標,TCP是不適合用於這一目的。傳輸錯誤復原和恢復不可分割的組成部分,最先進的音頻和視頻壓縮技術,如Speex音頻和H.264視頻編解碼器,可同時在Flash Player 10 。因此,可靠的交付所提供的TCP沒有必要的。因此, UDP連接,它提供了一個高效,快速的數據傳輸,是普遍使用的實時協作應用,儘量減少端到端延遲是至關重要的。另一個優勢在於 UDP連接,它使端到端的對等,也就是說,數據直接的傳輸客戶之間後面網絡地址轉換( NAT ) 。

 

當同RTMP做對比,RTMFP提供下列高級的即時通訊:

  • 低延遲:一但RTMFP建立起了UDP,它將給即時通訊提供最小的延遲。重要的是要注意RTMFP提供了可靠和不可靠的服務。當在兩個Flash Player 實例之間發送數據的時候(例如,使用NetStream.send()方法),可靠的數據傳輸被使用。當在兩個Flash Player 實例之間發送Speex 音頻的時候,不可靠的交互方式被使用,以提供最小的延遲。
  • 點對點媒體傳輸:媒體直接發送給兩個Flash Player的情況下,不通過路由,而是通過一箇中央中繼服務器。當同RTMP相比發現,在所有通過Flash Media Server傳送的數據, RTMFP不僅進一步降低了端到端的延遲,而且也消除了中央數據中繼的相關開銷,因此,有助於自身的可擴展性部署。
  • 數據的優先次序:音頻傳輸具有較高優先於視頻和非時間關鍵數據(如即時信息等) 。這可以通過帶寬通信通道的限制大大提高在用戶體驗。

所有這些功能代表了應用於實時通信的巨大優勢,提供了一個極大的用戶體驗,其成就比早期版本的Flash播放器的效應更爲巨大。

Firewall traversal

穿越防火牆

RTMFP是建立在UDP連接的基礎上,使客戶端直接的通信,即使它們位於NATs(譯者注:是一個網絡協議允許客戶端後面的NAT (網絡地址轉換) ,以找出其公共地址,類型的NAT是延遲和互聯網方面的端口相關的網絡地址轉換,尤其本地端口。此信息是用來建立UDP連接(用戶數據報協議)之間的溝通 兩個主機都是延遲的NAT路由器。該議定書是指在RFC 3489)或防火牆。爲了RTMFP工作,您的防火牆必須配置爲允許即將發出的UDP通信。大多數的消費者或小型辦公室/家庭辦公室( SOHO )的防火牆是這種情況,許多企業防火牆完全阻止UDP通信。

一種解決辦法是配置的Flash Player使用轉向代理 (遍歷周圍可用的NAT ) 。 Flash Player的支持IETF的因特網草案draft-ietf-behave-turn-08。如果網絡管理員配置轉向代理,允許即將發送的UDP連接, Flash播放器可以增加在mms.cfg的配置(更多的信息Flash Player的配置和位置mms.cfg ,請閱讀Adobe Flash Player的管理指南的Flash Player 10 ) :

RTMFPTURNProxy=ip_address_or_hostname_of_TURN_proxy

直接UDP通信總是被嘗試,轉向代理只是用來作爲備份:它是用於UDP通信,不能在Flash Player和Stratus (如UDP協議封鎖防火牆)之間或Flash Player的端點之間流動。

即使你的防火牆使即將發送的UDP通信的用,可能和你對應端的防火牆不能夠允許通過。當一個端點設在一個所謂的“對稱的防火牆, ” 的後面,端到端的通信可能是不可以實現。 (對於多種防火牆,請進入維基百科參閱 網絡地址轉換。 )在這種情況下,你可以使用轉代理援助你防火牆穿越。

 

 

 

Stratus service

Stratus 服務器

Flash Player實例必須連接到Adobe Stratus service(使用rtmfp : / / stratus.adobe.com ) ,用以彼此的通訊。 Stratus是提供會合服務的主機,幫助Flash Player實例間的互相聯繫,即使它們位於NATs的後面。雖然連接到Stratus服務非常相似連接到Flash Media Server,Stratus沒有提供任何Flash Media Server 典型的功能(媒體中繼,共享對象,遠程等)。 Flash Player客戶端必須保持在整個通訊期間一直與Adobe Stratus連接。爲了獲得Stratus,您將需要您從Adobe公司申請來的開發密鑰。

RTMFP支持正在計劃添加到未來版本的Flash Media Server(無發行日期) 。這樣Flash Media Server,將有可能同Flash Player 9或更早的客戶(使用RTMP )通信和Flash Player 10個客戶端(使用RTMFP ) 通信。

Security

安全

RTMFP 提供終端設備之間的安全通信。它的密鑰採用128位AES談判使用Diffie-Hellmann密鑰交換方法。不過,這並不提供強大的終端認證,如SSL或RTMPS 。爲了幫助端點認證, RTMFP和ActionScript揭露給應用開發者secure nonces。這些nonces可在雙方溝通的Flash Player的終點,並保證比賽。通過覈實這些nonces ,最終用戶可以確保沒有人在中間攻擊。這些nonces還可以用來開發關鍵的連續性機制。

重要的是要注意到, Flash播放器不僅從您的麥克風和攝像頭設備發送媒體,其他的Flash Player端點訂閱您的媒體流。代表Flash播放器並不中繼任何其他Flash Player的端點數據(如在一個多播的情況) 。

對於更多關於RTMFP的信息,請閱讀Adobe Labs 上的幫助:

ActionScript 3.0 API supporting RTMFP
ActionScript 3.0 API 支持 RTMFP

有一個新版本的ActionScript 3.0API支持Flash Player 10的RTMFP 。連接到Stratus錯服務和創造端到端媒體流的方法類似於Flash Media Server的工作方法。請注意,您必須使用的ActionScript 3.0或者Flash Professional CS4或Flex Builder 3 構建目標於Flash Player 10或AIR 1.5 。

正如我前面提到的,首先你必須連接到Adobe公司Stratus的服務:

private const StratusAddress:String = "rtmfp://stratus.adobe.com";
private const DeveloperKey:String = "your-developer-key";
private var netConnection:NetConnection;
 
netConnection = new NetConnection();
netConnection.addEventListener(NetStatusEvent.NET_STATUS,
netConnectionHandler);
netConnection.connect(StratusAddress + "/" + DeveloperKey);

開發者鑰匙是你通過登陸你的Adobe公司開發者帳戶申請得到,這個申請在Adobe Stratus beta服務的網站。

在成功連接到Stratus,你得到NetConnection.Connect.Success事件。失敗可能有幾個方面的原因。如果您提供了一個無效的開發者或不正確的鑰匙指定地址,您將收到NetConnection.Connect.Failed 。如果你的防火牆阻擋即將發送的UDP通信,您會收到的NetConnection.Connect.Failed事件後, 90秒超時。

在成功建立連接的Stratus服務中,您被分配一個獨特的256位peer ID( NetConnection.nearID ) 。其他Flash Player的端點必須知道這個peer ID,以便收到您發表的音頻/視頻流。Flash Player或Stratus的服務是如何將這些ID在需要通訊的Flash Player客戶端內傳遞,不在文章討論範圍內。對於交換ID ,你可以使用一個XMPP協議的服務或一個簡單的網絡服務,如視頻電話樣本應用程序。

Flash Player實例直接通訊使用單向網流渠道。也就是說,如果你想雙向語音交談,每個Flash Player的端點必須建立一個發送NetStream和接收NetStream

首先創建一個發送NetStream

private var sendStream:NetStream;
 
sendStream = new NetStream(netConnection, NetStream.DIRECT_CONNECTIONS);
sendStream.addEventListener(NetStatusEvent.NET_STATUS,netStreamHandler);
sendStream.publish("media");
sendStream.attachAudio(Microphone.getMicrophone());
sendStream.attachCamera(Camera.getCamera());

這意味着,媒體作爲一個端到端的流發佈。由於Stratus不能中繼媒體,您只可以發佈端到端的流。從您的設置管理器選擇本地默認設備發出的流媒體將包括音頻和視頻。

注:音頻/視頻無法發送,直到另一Flash Player的客戶端訂閱您的媒體流。

現在,創建接收NetStream

private var recvStream:NetStream;
 
recvStream = new NetStream(netConnection, id_of_publishing_client);
recvStream.addEventListener(NetStatusEvent.NET_STATUS, netStreamHandler);
recvStream.play("media");

在這一點上,你聽到聲音,你可以創建一個視頻對象顯示視頻。爲了創造接收NetStream,您必須知道發佈者的256位peer ID(發佈客戶端的 id_ ) 。爲了接收音頻/視頻,您必須知道被髮布出來的流的名字。

Advanced topics

高級主題

發佈者有良好的控制權而接收端可以接收其發佈的流。當一個用戶試圖獲得發佈的流時,onPeerConnect ()方法被調用(默認簡單執行返回true )對發佈的NetStream。發佈者可以禁止某些Flash Player的終端接收媒體:

var o:Object = new Object();
o.onPeerConnect = function(subscriberStream:NetStream):Boolean
{
   if (accept) 
   {
      return true; 
   }
   else
   {
      return false; 
   }
}
sendStream.client = o; 

在發佈方, NetStream.peerStreams屬性中擁有所有訂閱發佈的實例。例如,使用sendStream.send ()將發送相同的數據到所有用戶。您可以使用下面的方法將信息發送到一個特定的用戶:

sendStream.peerStreams[i].send()

NetConnection.maxPeerConnections屬性指定被允許連接發佈者的peer流的數量。默認值是設定爲8但在實踐中,這取決於您的應用程序時,必須考慮到大多數互聯網服務供應商提供非對稱互聯網接入服務的許可。圖1說明了直接和三個Flash Player的實例通訊 。每個Flash Player客戶端發送和接收兩個流,建立一個完全連接網格。從互聯網下載的能力普遍高於上傳的能力,你必須要格外小心,不要超負荷用戶終端的上行能力。

End-to-end connections using the Stratus service

圖1 使用Stratus服務點對點連接

NetConnection.unconnectedPeerStreams屬性是一個沒有相關發佈的NetStreams數組。當一個發部流同一個訂閱流相互競爭時,訂閱NetStream從NetStream.peerStreams的數組中移除。

探索視頻電話示例應用程序

我們已經開發了一個視頻電話示例,說明如何使用Flash Player 10的端到端能力 。它也可作爲部分文章。

該視頻電話示例應用程序依賴於一個用於交流Flash Player peer ID簡單的HTTP服務。提供的一部分該腳本,封裝在( reg.cgi ) 。這種網絡服務不提供任何用戶認證。在Flash播放器成功地連接到Stratus,但其peer ID的網絡服務。當創建一個呼叫電話時,視頻電話呼叫使用此網絡服務來查找收件人的peer ID。

Adobe公司運行這一網絡服務專門提供視頻電話樣本。當您建立自己的視頻電話樣本,則必須運行您自己的網絡服務,並在 VideoPhoneLabs.mxml 指定WebServiceUrl 。您應該使用自己重寫的AbstractIdManager類來執行自己的peer ID身份證交流機制,例如, XMPP協議,谷歌應用服務,或Facebook的框架。

下列是建立一個視頻電話示例應用程序的必要步驟(更多詳情,請參閱ReadMe.txt包中包含) :

1.使用主機網絡服務提供的peer ID的reg.cgi Python腳本。

2. 更新的Flex Builder 3.0.2配置,並對應開發於Flash Player 10或AIR 1.5 環境下。

3. 創建一個新的 Flex 項目。

4. 添加源文件的包( VideoPhoneLabs.mxml , AbstractIdManager.as , HttpIdManager.as , IdManagerError.as ,並IdManagerEvent.as )的項目源文件夾中。

5. 調試你的項目配製爲Flex SDK 3.2 同時發佈對象爲Flash Player 10 或 AIR 1.5.

6. 在VideoPhoneLabs.mxml文件中替換DeveloperKey爲您的Stratus開發密鑰。

7. 在VideoPhoneLabs.mxml文件中替換WebServiceUrl爲指定的web service。

該視頻電話示例應用程序使用的手機模型。呼叫建立程序執行是使用端到端 NetStream.send ()的信息。既然你可以使用NetStream.send ( )方法只對指定的NetStream,視頻電話發表其他Flash Player客戶端可以連接的所謂的“聽衆流” (在這裏我們這樣叫它)。當客戶端(調用者)希望與客戶B通訊( A呼叫B) ,他或她訂閱客戶B的聽衆流。在這一點上,客戶端B的通知訪問者peer ID 的來電(使用onPeerConnect ()方法) ,並訂閱客戶A的媒體流。通過這個媒體流,客戶端A通知客戶B對他或她的好友用戶的名稱(使用NetStream.send ( )方法) ,用戶可以選擇接受或拒絕呼叫。如果要求被接受,客戶端B發佈的媒體流和雙向通信將要被成立。

何去何從

在本文中,我介紹了一些最令人激動的特點,新的RTMFP協議連同概述了新的ActionScript 3.0的API 。在閱讀本文,您應該很好地理解如何使用這一革命性的協議。我希望你能利用端到端的和先進的媒體功能的Flash Player 10和AIR 1.5開發了不起的應用。

原文地址:http://www.adobe.com/devnet/flashplayer/articles/rtmfp_stratus_app.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章