您的位置:首页 > 其它

flash10使用RTMFP 开发点对点应用

2009-02-19 10:43 288 查看
本文转载自:http://pvantfln.blog.163.com/blog/static/174309520090173758608/

通过Stratus服务器在FlashPlayer中使用RTMFP开发点对点应用

AdobeFlashPlayer10和AdobeAIR1.5引入了一个新的通讯协议,Real-TimeMediaFlowProtocol(RTMFP),其低延迟,端到端的对等功能,安全性和可扩展性使它特别适合开发实时协作应用,不仅提供卓越的用户体验,而且运营商降低成本。

早前的FlashPlayer版本使用Real-TimeMessagingProtocol(RTMP)需要AdobeFlashMediaServer(FMS)提供合作应用(例如AdobeAcrobatConnectPro)或者音频视频流。RTMP是streamingmedia,sharedobjects,和remoting连接的卓越选择,它满足实时性要求的交互式音频和视频通信的能力有限。

为了能够使用RTMFP,FlashPlayer客户端必须连接到一个支持RTMFP协议的服务器,例如AdobeStratusbeta服务器或者是新版本的FMS。Stratus是一台用于FlashPlayer客户端间通信的主机。不同于FMS,Stratus不支持视频转播,sharedobjects,脚本,等。因此,使用Stratus,只可以开发FlashPlayer的客户端直接相互交流的应用程序。

FlashPlayer已经在web视频领域占有重要的市场份额。由于采用RTMFP和先进的媒体压缩技术,将有利于FlashPlayer10处于实时通信的领先地位。

在这篇文章中,我首先强调在即时通讯领域使用RTMFP的优势。其次,我将要介绍直接管理点对点RTMFP管理所对应的新的ActionScript3.0API。最后,我介绍我们的VideoPhone应用实例。

Requirements


要求

为了使用文中的文件,你需要以下软件和文件:

FlexBuilder3

Try

Buy

注意:请按照IntroducingFlexSDK3.2andFlexBuilder3.0.2指南中的方法去安装FlexBuilder3.0.2.这里面包括FlexSDK3.2,这是为了建立FlashPlayer10应用。尽管你也可以使用AdobeFlashProfessionalCS4作为开发工具,但这篇文件指导你如果使用FlexBuilder3建立一个简单的应用.

FlashPlayer10

Download

Samplefiles:

stratus_article_assets.zip(ZIP,13K)

Prerequisiteknowledge

预备知识

熟悉ActionScript3.0和FlexBuilder是必要的。

BenefitsofRTMFP

RTMFP的好处

Real-TimeMediaFlowProtocol(RTMFP)是一个引入到FlashPlayer10和inAIR1.5新的通讯协议。同Real-TimeMessagingProtocol(RTMP)的主要不同点之一是,RTMP基于传输控制协议(TCP)和先前版本的FlashPlayer,RTMFP建立在UserDatagramProtocol(UDP)协议.

TCP提供了可靠的数据传输(也适用于文件传输,电子邮件等),它没有提供任何端到端延迟保证。可靠的数据传输的TCP实现了重新传输丢失的数据,其中包括了延迟。由于尽量减少端到端延迟是实时通信(几百毫秒的延迟可能使一个会话不可用)中最重要的一个目标,TCP是不适合用于这一目的。传输错误复原和恢复不可分割的组成部分,最先进的音频和视频压缩技术,如Speex音频和H.264视频编解码器,可同时在FlashPlayer10。因此,可靠的交付所提供的TCP没有必要的。因此,UDP连接,它提供了一个高效,快速的数据传输,是普遍使用的实时协作应用,尽量减少端到端延迟是至关重要的。另一个优势在于UDP连接,它使端到端的对等,也就是说,数据直接的传输客户之间后面网络地址转换(NAT)。

当同RTMP做对比,RTMFP提供下列高级的即时通讯:

低延迟:一但RTMFP建立起了UDP,它将给即时通讯提供最小的延迟。重要的是要注意RTMFP提供了可靠和不可靠的服务。当在两个FlashPlayer实例之间发送数据的时候(例如,使用NetStream.send()方法),可靠的数据传输被使用。当在两个FlashPlayer实例之间发送Speex音频的时候,不可靠的交互方式被使用,以提供最小的延迟。

点对点媒体传输:媒体直接发送给两个FlashPlayer的情况下,不通过路由,而是通过一个中央中继服务器。当同RTMP相比发现,在所有通过FlashMediaServer传送的数据,RTMFP不仅进一步降低了端到端的延迟,而且也消除了中央数据中继的相关开销,因此,有助于自身的可扩展性部署。

数据的优先次序:音频传输具有较高优先于视频和非时间关键数据(如即时信息等)。这可以通过带宽通信通道的限制大大提高在用户体验。

所有这些功能代表了应用于实时通信的巨大优势,提供了一个极大的用户体验,其成就比早期版本的Flash播放器的效应更为巨大。

Firewalltraversal

穿越防火墙

RTMFP是建立在UDP连接的基础上,使客户端直接的通信,即使它们位于NATs(译者注:是一个网络协议允许客户端后面的NAT(网络地址转换),以找出其公共地址,类型的NAT是延迟和互联网方面的端口相关的网络地址转换,尤其本地端口。此信息是用来建立UDP连接(用户数据报协议)之间的沟通两个主机都是延迟的NAT路由器。该议定书是指在RFC3489)或防火墙。为了RTMFP工作,您的防火墙必须配置为允许即将发出的UDP通信。大多数的消费者或小型办公室/家庭办公室(SOHO)的防火墙是这种情况,许多企业防火墙完全阻止UDP通信。

一种解决办法是配置的FlashPlayer使用转向代理(遍历周围可用的NAT)。FlashPlayer的支持IETF的因特网草案draft-ietf-behave-turn-08。如果网络管理员配置转向代理,允许即将发送的UDP连接,Flash播放器可以增加在mms.cfg的配置(更多的信息FlashPlayer的配置和位置mms.cfg,请阅读AdobeFlashPlayer的管理指南的FlashPlayer10):

RTMFPTURNProxy=ip_address_or_hostname_of_TURN_proxy

直接UDP通信总是被尝试,转向代理只是用来作为备份:它是用于UDP通信,不能在FlashPlayer和Stratus(如UDP协议封锁防火墙)之间或FlashPlayer的端点之间流动。

即使你的防火墙使即将发送的UDP通信的用,可能和你对应端的防火墙不能够允许通过。当一个端点设在一个所谓的“对称的防火墙,”的后面,端到端的通信可能是不可以实现。(对于多种防火墙,请进入维基百科参阅网络地址转换。)在这种情况下,你可以使用转代理援助你防火墙穿越。



Stratusservice

Stratus服务器

FlashPlayer实例必须连接到AdobeStratusservice(使用rtmfp://stratus.adobe.com),用以彼此的通讯。Stratus是提供会合服务的主机,帮助FlashPlayer实例间的互相联系,即使它们位于NATs的后面。虽然连接到Stratus服务非常相似连接到FlashMediaServer,Stratus没有提供任何FlashMediaServer典型的功能(媒体中继,共享对象,远程等)。FlashPlayer客户端必须保持在整个通讯期间一直与AdobeStratus连接。为了获得Stratus,您将需要您从Adobe公司申请来的开发密钥。

RTMFP支持正在计划添加到未来版本的FlashMediaServer(无发行日期)。这样FlashMediaServer,将有可能同FlashPlayer9或更早的客户(使用RTMP)通信和FlashPlayer10个客户端(使用RTMFP)通信。

Security

安全

RTMFP提供终端设备之间的安全通信。它的密钥采用128位AES谈判使用Diffie-Hellmann密钥交换方法。不过,这并不提供强大的终端认证,如SSL或RTMPS。为了帮助端点认证,RTMFP和ActionScript揭露给应用开发者securenonces。这些nonces可在双方沟通的FlashPlayer的终点,并保证比赛。通过核实这些nonces,最终用户可以确保没有人在中间攻击。这些nonces还可以用来开发关键的连续性机制。

重要的是要注意到,Flash播放器不仅从您的麦克风和摄像头设备发送媒体,其他的FlashPlayer端点订阅您的媒体流。代表Flash播放器并不中继任何其他FlashPlayer的端点数据(如在一个多播的情况)。

对于更多关于RTMFP的信息,请阅读AdobeLabs上的帮助:

Real‐TimeMediaFlowProtocolFAQ(PDF,166K)

ActionScript3.0APIsupportingRTMFP
ActionScript3.0API支持RTMFP
有一个新版本的ActionScript3.0API支持FlashPlayer10的RTMFP。连接到Stratus错服务和创造端到端媒体流的方法类似于FlashMediaServer的工作方法。请注意,您必须使用的ActionScript3.0或者FlashProfessionalCS4或FlexBuilder3构建目标于FlashPlayer10或AIR1.5。

正如我前面提到的,首先你必须连接到Adobe公司Stratus的服务:

privateconstStratusAddress:String="rtmfp://stratus.adobe.com";

privateconstDeveloperKey:String="your-developer-key";

privatevarnetConnection:NetConnection;


netConnection=newNetConnection();

netConnection.addEventListener(NetStatusEvent.NET_STATUS,

netConnectionHandler);

netConnection.connect(StratusAddress+"/"+DeveloperKey);

开发者钥匙是你通过登陆你的Adobe公司开发者帐户申请得到,这个申请在AdobeStratusbeta服务的网站。

在成功连接到Stratus,你得到NetConnection.Connect.Success事件。失败可能有几个方面的原因。如果您提供了一个无效的开发者或不正确的钥匙指定地址,您将收到NetConnection.Connect.Failed。如果你的防火墙阻挡即将发送的UDP通信,您会收到的NetConnection.Connect.Failed事件后,90秒超时。

在成功建立连接的Stratus服务中,您被分配一个独特的256位peerID(NetConnection.nearID)。其他FlashPlayer的端点必须知道这个peerID,以便收到您发表的音频/视频流。FlashPlayer或Stratus的服务是如何将这些ID在需要通讯的FlashPlayer客户端内传递,不在文章讨论范围内。对于交换ID,你可以使用一个XMPP协议的服务或一个简单的网络服务,如视频电话样本应用程序。

FlashPlayer实例直接通讯使用单向网流渠道。也就是说,如果你想双向语音交谈,每个FlashPlayer的端点必须建立一个发送
NetStream
和接收
NetStream


首先创建一个发送
NetStream


privatevarsendStream:NetStream;


sendStream=newNetStream(netConnection,NetStream.DIRECT_CONNECTIONS);

sendStream.addEventListener(NetStatusEvent.NET_STATUS,netStreamHandler);

sendStream.publish("media");

sendStream.attachAudio(Microphone.getMicrophone());

sendStream.attachCamera(Camera.getCamera());

这意味着,媒体作为一个端到端的流发布。由于Stratus不能中继媒体,您只可以发布端到端的流。从您的设置管理器选择本地默认设备发出的流媒体将包括音频和视频。

注:音频/视频无法发送,直到另一FlashPlayer的客户端订阅您的媒体流。

现在,创建接收
NetStream


privatevarrecvStream:NetStream;


recvStream=newNetStream(netConnection,id_of_publishing_client);

recvStream.addEventListener(NetStatusEvent.NET_STATUS,netStreamHandler);

recvStream.play("media");

在这一点上,你听到声音,你可以创建一个视频对象显示视频。为了创造接收
NetStream
,您必须知道发布者的256位peerID(发布客户端的id_)。为了接收音频/视频,您必须知道被发布出来的流的名字。

Advancedtopics
高级主题

发布者有良好的控制权而接收端可以接收其发布的流。当一个用户试图获得发布的流时,onPeerConnect()方法被调用(默认简单执行返回true)对发布的
NetStream
。发布者可以禁止某些FlashPlayer的终端接收媒体:

varo:Object=newObject();

o.onPeerConnect=function(subscriberStream:NetStream):Boolean

{

if(accept)

{

returntrue;

}

else

{

returnfalse;

}

}

sendStream.client=o;

在发布方,NetStream.peerStreams属性中拥有所有订阅发布的实例。例如,使用sendStream.send()将发送相同的数据到所有用户。您可以使用下面的方法将信息发送到一个特定的用户:

sendStream.peerStreams[i].send()

NetConnection.maxPeerConnections属性指定被允许连接发布者的peer流的数量。默认值是设定为8但在实践中,这取决于您的应用程序时,必须考虑到大多数互联网服务供应商提供非对称互联网接入服务的许可。图1说明了直接和三个FlashPlayer的实例通讯。每个FlashPlayer客户端发送和接收两个流,建立一个完全连接网格。从互联网下载的能力普遍高于上传的能力,你必须要格外小心,不要超负荷用户终端的上行能力。



图1使用Stratus服务点对点连接

NetConnection.unconnectedPeerStreams属性是一个没有相关发布的NetStreams数组。当一个发部流同一个订阅流相互竞争时,订阅
NetStream
从NetStream.peerStreams的数组中移除。

探索视频电话示例应用程序

我们已经开发了一个视频电话示例,说明如何使用FlashPlayer10的端到端能力。它也可作为部分文章。

该视频电话示例应用程序依赖于一个用于交流FlashPlayerpeerID简单的HTTP服务。提供的一部分该脚本,封装在(reg.cgi)。这种网络服务不提供任何用户认证。在Flash播放器成功地连接到Stratus,但其peerID的网络服务。当创建一个呼叫电话时,视频电话呼叫使用此网络服务来查找收件人的peerID。

Adobe公司运行这一网络服务专门提供视频电话样本。当您建立自己的视频电话样本,则必须运行您自己的网络服务,并在VideoPhoneLabs.mxml指定WebServiceUrl。您应该使用自己重写的AbstractIdManager类来执行自己的peerID身份证交流机制,例如,XMPP协议,谷歌应用服务,或Facebook的框架。

下列是建立一个视频电话示例应用程序的必要步骤(更多详情,请参阅ReadMe.txt包中包含):

1.使用主机网络服务提供的peerID的reg.cgiPython脚本。

2.更新的FlexBuilder3.0.2配置,并对应开发于FlashPlayer10或AIR1.5环境下。

3.创建一个新的Flex项目。

4.添加源文件的包(VideoPhoneLabs.mxml,AbstractIdManager.as,HttpIdManager.as,IdManagerError.as,并IdManagerEvent.as)的项目源文件夹中。

5.调试你的项目配制为FlexSDK3.2同时发布对象为FlashPlayer10或AIR1.5.

6.在VideoPhoneLabs.mxml文件中替换DeveloperKey为您的Stratus开发密钥。

7.在VideoPhoneLabs.mxml文件中替换WebServiceUrl为指定的webservice。

该视频电话示例应用程序使用的手机模型。呼叫建立程序执行是使用端到端NetStream.send()的信息。既然你可以使用NetStream.send()方法只对指定的NetStream,视频电话发表其他FlashPlayer客户端可以连接的所谓的“听众流”(在这里我们这样叫它)。当客户端(调用者)希望与客户B通讯(A呼叫B),他或她订阅客户B的听众流。在这一点上,客户端B的通知访问者peerID的来电(使用onPeerConnect()方法),并订阅客户A的媒体流。通过这个媒体流,客户端A通知客户B对他或她的好友用户的名称(使用NetStream.send()方法),用户可以选择接受或拒绝呼叫。如果要求被接受,客户端B发布的媒体流和双向通信将要被成立。

何去何从

在本文中,我介绍了一些最令人激动的特点,新的RTMFP协议连同概述了新的ActionScript3.0的API。在阅读本文,您应该很好地理解如何使用这一革命性的协议。我希望你能利用端到端的和先进的媒体功能的FlashPlayer10和AIR1.5开发了不起的应用。

原文地址:http://www.adobe.com/devnet/flashplayer/articles/rtmfp_stratus_app.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: