5.1.面对面通信面对面的沟通的梦想,通过一些像一个电视/电话组合一直围绕在至少过去50年。不过,许诺在远程位置的这种个人之间的沟通,只在最近普遍的实现。开放的Socket技术和高速互联网,如面对面的音频/视频((A/V)的通信,在网络上变得简单而且越来越普遍。这一章着眼于,使用FMS3创造一种双向音频/视频应用的基本要素-无论是FMIS3或DevelopmentFMS3。FMSS不能用于交互式应用程序。应用程序在这一章中所有使用的类和对象在前几章简要的讨论过了,特别是在第3章中,“设置您的摄像机和话筒”=研究了摄像头,麦克风和视频对象,和NetStream类。在开始之前,您可能要回故之前第3章的内容,使您不太可能迷失在本讨论中。5.2.NetStream包有时可以把NetStreamod类作为一个包mule。您与不同的东西把它载入,并将按其方式发送它。一旦流到达它的目的地,它卸载其捆绑将收到的视频和音频。像包mule,每一个目的地,需要不同的流。因此,如果您是发出了一个捆绑到九龙,悉尼,日本横滨,孟买,和利马,您需要5个mule,每个mule为每个目的地。至于开发者所关心的,您将只需要建立只有一个单一的NetStream实例,以传送相同的视频和音频到所有那些地方。即使您建立一个单一的实例,FMS3为每一个生成一个单独的流。这很重要,请注意,因为每一个地方接收流,你要付出带宽的代价。(可以想像购买您的每个包mules是一个在带宽bucks为航线机票支付)在除了发出bundles,您也想要接收bundles。您发送音频和视频和您想要接收音频和视频。因此,对于每一个您想要接收的对像,您将需要一个NetStream实例。带宽-告诉这可以得到昂贵的迅速。图5-1显示了2个连接和4个连接之间的差别。图5-1.Connectionsandstreams两个连接需要两个流,但是四个连接需要12个流。你可以用以下公式来计算需要几个流:S=c2–cS代表所产生的流的数量,c代表有几个连接图5-1显示了2个连接只产生两个流(2x2=4;4–2=2),4个连接产生12个流(4x4=16;16-4=12)你可以看到,作为连接数量的增加数值,有多少流增加指数。例如,如果您双重的连接数从4至8,流数量的增加,从12至56-以上翻4倍的流和对带宽的影响。5.3.NetStream类和LiveStreams第2章和第3章介绍了NetStream类,但是它们没有详细的介绍它。本章中开始研究NetStream类用在现场流中,然后加入到最简单地例子中。使用NetStream类,目的是捕捉从视频和麦克风传来的音频和视频输入,然后发送他们给另一个人看和听。这个程序调用以下NetStream方法:·NetStream.connect(myNetConnection)·NetStream.attachAudio(microphone)·NetStream.attachVideo(camera)·NetStream.publish(“streamName“)·NetStream.play(“streamName“)在看产生一个双向A/V连接顺序中所必需的,流通过NetConnection连接到服务器,用来建立一个在用户和应用程序之间的连接。发布流的时候需要添加要发布在的摄像头和麦克风。流发送到FMS3服务器,然后服务器发送它到连接上的客户端。下面的代码片断展示了这些步骤://StreamOutnsOut=newNetStream(nc);nsOut.attachAudio(mic);nsOut.attachCamera(cam);nsOut.publish(left,live);下面这些代码所做的事情:·建立一个流,联合一个网络连接到一个连接到FMS3·附加麦克风到流·附加摄像头到流·使用唯一的流名称发布流现在在您已经有了发布的模块,设立一个播放的模块来捕获和播放被送往的流。您不想捕捉你刚发布的相同的流,所以您将需要有一个除了”left”的流名称。播放流将被称为”right”,要紧记,它代表了当前的接受者。(其他接受者播放”right”和接收“left”)为了捕捉进来的流,你需要把流附加到Video对像上。流包含音频和视频被处理为一个单一的单元—一个视频。您不必把声音对象附加到一个对像上,当你发送视频时。因此,你把流附加到视频对象上使用attachVideo()方法。一旦流正在发送到正确的位置(嵌入式视频对象),所有你需要做的是就是播放流,如以下代码段所示://StreamInnsIn=newNetStream(nc);nsIn.play(right);vidStream.attachNetStream(nsIn);阅读和显示进来的流的顺序,然后将是:·建立一个流,联合一个网络连接到一个连接到FMS3·把流附加到视频对像上·播放流有更多方法创造一个双向的A/V应用程序,但核心这样做的是与NetStream类方法工作。一旦您直接在您的心目中获得该命令,其余的相当容易。5.4.世界上最简单的双向的A/V聊天的应用程序为了制作一个简单的双向A/V聊天应用程序,需要两个模块。紧记FMS3应用程序只是简单的表现在你使用的RTMPURL为简单的名称,你可以在一个应用程序中有多个模块。换句话说就是,应用的名称是在服务端的目录的名称。总而言之,你将要开始制作这个应用程序。这个应用程序的名称将会很简单。你将会有两个模块,Easy1和Easy2。每个模块会通过存储在服务端的应用程序,连接到FMS3。对于这个应用程序,每个模块将会写成用来接受其它人发送的流。如你所见,一个简单的换来做所有真实的工作。所以任务真正地包括写一个模块,然后复制它,做一些修改。图5-2展示了两个视频将出现的区域,和它们的实例名:图5-2.Videoinstances开始之前,回顾一下需要的以下类和对像:ClassesNetConnectionNetStreamNetStatusEventCameraMicrophoneVideo按以下步骤来制作这个聊天应用程序:1.建立一个Easy1.fla2.用文本工具添加一个文本,内容为Easy#1,x=205,y=2233.在文档类中输入Easy14.建立一个Easy1.as与Easy1.fla同一目录Example5-1.Easy1.asCodeView:package{importflash.display.Sprite;importflash.events.NetStatusEvent;importflash.net.NetConnection;importflash.net.NetStream;importflash.media.Camera;importflash.media.Microphone;importflash.media.Video;publicclassEasy1extendsSprite{privatevarnc:NetConnection;privatevargood:Boolean;privatevarrtmpNow:String;privatevarnsIn:NetStream;privatevarnsOut:NetStream;privatevarcam:Camera;privatevarmic:Microphone;privatevarvidLocal:Video;privatevarvidStream:Video;publicfunctionEasy1(){rtmpNow=rtmp://your.web.com/easy;nc=newNetConnection();nc.connect(rtmpNow);nc.addEventListener(NetStatusEvent.NET_STATUS,checkCon);setCam();setMic();setVideo();}privatefunctioncheckCon(e:NetStatusEvent):void{good=e.info.code==NetConnection.Connect.Success;if(good){nsOut=newNetStream(nc);nsOut.attachAudio(mic);nsOut.attachCamera(cam);nsOut.publish(left,live);nsIn=newNetStream(nc);nsIn.play(right);vidStream.attachNetStream(nsIn);}}privatefunctionsetCam(){cam=Camera.getCamera();cam.setKeyFrameInterval(9);cam.setMode(240,180,15);cam.setQuality(0,80);}privatefunctionsetMic(){mic=Microphone.getMicrophone();mic.gain=85;mic.rate=11;mic.setSilenceLevel(15,2000);}privatefunctionsetVideo(){vidLocal=newVideo(cam.width,cam.height);addChild(vidLocal);vidLocal.x=15;vidLocal.y=30;vidLocal.attachCamera(cam);vidStream=newVideo(cam.width,cam.height);addChild(vidStream);vidStream.x=(vidLocal.x+cam.width+10);vidStream.y=vidLocal.y;}}}6.确保rtmpNow=”rtmp://your.web.com/easy”反射你自已的FMSURL,不管它是在你本机,LANIP地址或者远程服务器的URL7.发布HTML和SWF这已经完成了第一个模块,测试它,你会在左边窗口中看到你自已。下一步将简单的改变第一个模块。8.Easy1.fla另存为Easy2.fla9.把文本改为Easy210.把Easy1.as另存为Easy2.as11.改变类名称和构造函数的名称为Easy2:publicclassEasy2extendsSprite....publicfunctionEasy2()12.在checkCon函数中,改变以下两行:nsOut.publish(left,live);-nsOut.publish(right,live);....nsIn.play(right);-nsIn.play(left);13.保存Easy2.as文件。现在你的两个模块应用程序已经完成。步骤12显示了应用程序中的关键几行,Easy1发布一个叫left的流和播放一个叫right的流。Easy2刚好与Easy1相反,所以每个模块的用户可以播放另一个人的流。测试这个应用程序,理论上你需要两个摄像头和两台电脑。一个用户运行Easy1.html,另一个用户运行Easy2.html。不管在LAN或者网上的远程服务器,两个模块都要能访问到FMS3服务器。图5-3中当你运行两个模块时你应该看到的。图5-3.Two-wayAudio-Videochat5.5.一个更好的双向聊天应用程序虽然两个模块的聊天室应用程序是很容易就建立和良好的工作,其唯一目的是显示创建一个双向聊天需要最少的代码。更好的选择是一个双向的聊天室有一个单一的模块,并且可以告诉哪种方式来设定流。最佳方法是将其写入服务器端脚本。一个FMS3应用程序的概念是最好的赞赏,当你考虑一个脚本,所有用户使用相同的应用得到不同的信息。您熟悉变量在一个非FMS应用程序改变,但是使用非服务端数据,像数据库。但是,如果别人使用相同的应用,你这样做不会影响其他人使用相同的应用。例如线上游戏,没有服务器端组件。你的分数将不会影响玩同样游戏的其他人的分数。换个方式来考虑这