• 2009-05-15
  • LearningFMS3中文版第5章(4)
  • 文章来源:www.hcxmflash.cn

    5.6.四向的会议应用程序

    从一个双向聊天应用到多个参加会议的应用是大概的缩放和带宽调整。对服务器端,唯一的要求是,再添加两个元素到数组和更改名称。不过,在实际应用中工作,您需要看看对带宽的要求。

    5.6.1. 2 等于2:4等于12

    在本章开始之前,图5-1显示了流的数量是如何增长的:双向A/V聊天是2个 流,4向A/V聊天是12个流。与流的数量增长,减少对带宽是必不可少的。首先,看看影片发送整个网际网路的尺寸。在Deux应用程序中,相机设置为 240 × 180 ,产生大约43.2千比特(千位)像素。乘以帧速度15fps和流(2),应用程序产生大约1.3兆比特( mbits )每秒。这还不包括音频,但现在, 1.3 mbits可被用来作为4路会议的目标带宽。 (音频的一个好的地方是,在大多数的会议,同一时间只有一人会谈,所以在双向或者4向中,其大小可能不会有很大的不同)。

    使用1.3 mbits作为目标带宽,首先考虑的是要传输的视频的大小。在Deux应用程序中,两个参与者两旁都有很多空白。切割出额外的水平空间,使得议长清晰可 见,和您释放了大量的未使用的bits整个网际网路。 4路会议的应用程序,命名为Quad,削减相机宽度从240至80 。为了更好地集中发言者,高度从180削减到100 。现在,不是一个240 × 180的矩阵,而是80 × 100的矩阵了 。其次,降低fps,从15降到12。做这个简单的算术,bits的数量应该是1.15 mbits –实际上少于2人的聊天。检查下列步骤:

    • a. 80 x 100 = 8,000.
    • b. 8,000 x 12 = 96,000 (where 12 is the number of streams).
    • c. 96,000 x 12 =1,152,000 (where 12 is also the frames per second).

    当你完成这些计算,你能够建立一个站点,是不太可能冻结起来并给予客户一个坏的经验

    5.6.2.布置客户和他们的流

    与4人在一个会议,给他们一个参考框架,帮助他们有一个整体会议意识。为此,应用 程序有背景框,就是视频出现的地方。因此,举例来说,如果有两个用户在网站上,他们可以看到后面两个用户出现在哪里。logo是放置在应用程序的中间,暗 示在一个圆桌,人人的地位平等。然而,由于观看是在一个垂直平面(电脑显示器) ,人在最上方的位置可能会出现比别人更强大,人在底部在是处于最低的地位。

    所幸的是,因为这是一个虚拟会议,放置可以把每个人都在最上方的位置,由用户自己的有利位置。简单地通过发送所有本地视频到最上方的位置,每个用户都可以看到他或她自已在顶部,被其余人环绕着。

    要获得此效果,并正确的分发所有的流, switch语句再度派上用场。以下代码段显示了一切是如何分布式的:

    Code View:

    switch (streamSelect)
    {
      case "left" :
            outStream="left";
            inStream1="right";
            inStream2="top";
            inStream3="bottom";
            break;
      case "right" :
            outStream="right";
            inStream1="left";
            inStream2="top";
            inStream3="bottom";
            break;
      case "top" :
            outStream="top";
            inStream1="left";
            inStream2="right";
            inStream3="bottom";
            break;
      case "bottom" :
            outStream="bottom";
            inStream1="left";
            inStream2="top";
            inStream3="right";
            break;
    }
     

    作为与Deux应用程序,在switch语句中,案例的所有的数据是由服务器端脚本提供的。而不是只二个:left 和 right,现在streamSelect的值观是left, right, top, 和 bottom。这些名称对不同流的位置不产生影响。而他们只是四个方便的名字。后面的代码段显示了如何分布流:

    //Publish local video
    netOut=new NetStream(nc);
    netOut.attachAudio (mic);
    netOut.attachCamera (cam);
    vidOut.attachCamera (cam);
    netOut.publish (outStream, "live");
     
    //Play streamed video
    netIn1=new NetStream(nc);
    vidBottom.attachNetStream (netIn1);
    netIn1.play (inStream1);
     
    netIn2=new NetStream(nc);
    vidLeft.attachNetStream (netIn2);
    netIn2.play (inStream2);
     
    netIn3=new NetStream(nc);
    vidRight.attachNetStream (netIn3);
    netIn3.play (inStream3);

    名为vidOut是在顶部位置的video对像,和名为netOut的是从本地客户端的摄像机和麦克风中即将流出的流。其他传入的流分配给左,右,和下而的视频对象,流的名字,是switch语句中产生的。

    5.6.3.建立会议应用程序

    现在准备开始建立,按以下步骤来建立,首先放置对像在舞台上:

    1. 建立一个Quad.fla文件,在文档类中输入Quad

    2. 使用图5-8作为一个指南,使用矩形工具在舞台上画4个80 X 100的矩形,位置如图5-8所示。

    图5-8. Placement of backdrops

    3. 把你的logo放置在背景的中间,Quad文字在顶部,

    4. 建立一个Quad.as文件

    5. 在Quad.as中输入以下代码

    Example 5-4. Quad.as

    Code View:

    package
    {
      import flash.display.Sprite;
      import flash.display.MovieClip;
      import flash.events.NetStatusEvent;
      import flash.net.NetConnection;
      import flash.net.NetStream;
      import flash.media.Camera;
      import flash.media.Microphone;
      import flash.media.Video;
      import flash.net.Responder;
     
      public class Quad extends Sprite
      {
            private var nc:NetConnection;
            private var good:Boolean;
            private var netOut:NetStream;
            private var netIn1:NetStream;
            private var netIn2:NetStream;
            private var netIn3:NetStream;
            private var cam:Camera;
            private var mic:Microphone;
            private var responder:Responder;
            private var vidOut:Video;
            private var vidBottom:Video;
            private var vidLeft:Video;
            private var vidRight:Video;
            private var outStream:String;
            private var inStream1:String;
            private var inStream2:String;
            private var inStream3:String;
     
            public function Quad ()
            {
                 var rtmpNow:String="rtmp://192.168.0.11/quad";
                 nc=new NetConnection;
                 nc.connect (rtmpNow);
                 nc.addEventListener (NetStatusEvent.NET_STATUS,getStream);
            }
     
            private function getStream (e:NetStatusEvent):void
            {
                 good=e.info.code == "NetConnection.Connect.Success";
                 if (good)
                 {
                       responder=new Responder(streamNow);
                       nc.call ("streamSelect",responder);
                 }
            }
     
            private function streamNow (streamSelect:String):void
            {
                 setCam ();
                 setMic ();
                 setVid ();
     
                 switch (streamSelect)
                 {
                       case "left" :
                            outStream="left";
                            inStream1="right";
                            inStream2="top";
                            inStream3="bottom";
                            break;
                       case "right" :
                            outStream="right";
                            inStream1="left";
                            inStream2="top";
                            inStream3="bottom";
                            break;
                       case "top" :
                            outStream="top";
                            inStream1="left";
                            inStream2="right";
                            inStream3="bottom";
                            break;
                       case "bottom" :
                            outStream="bottom";
                            inStream1="left";
                            inStream2="top";
                            inStream3="right";
                            break;
                 }
     
                 //Publish local video
                 netOut=new NetStream(nc);
                 netOut.attachAudio (mic);
                 netOut.attachCamera (cam);
                 vidOut.attachCamera (cam);
                 netOut.publish (outStream, "live");
     
                 //Play streamed video
                 netIn1=new NetStream(nc);
                 vidBottom.attachNetStream (netIn1);
                 netIn1.play (inStream1);
     
                 netIn2=new NetStream(nc);
                 vidLeft.attachNetStream (netIn2);
                 netIn2.play (inStream2);
     
                 netIn3=new NetStream(nc);
                 vidRight.attachNetStream (netIn3);
                 netIn3.play (inStream3);
            }
     
            private function setCam ():void
            {
                 cam=Camera.getCamera();
                 cam.setMode (80,100,12);
                 cam.setQuality (0,80);
                 cam.setKeyFrameInterval(12);
            }
     
            private function setMic ():void
            {
                 mic=Microphone.getMicrophone();
                 mic.rate=11;
                 mic.setSilenceLevel (12,2000);
            }
     
            private function setVid ():void
            {
                 vidOut=new Video(80,100);
                 addChild (vidOut);
                 vidOut.x=235;
                 vidOut.y=43;
     
                 vidLeft=new Video(80,100);
                 addChild (vidLeft);
                 vidLeft.x=89;
                 vidLeft.y=145;
     
                 vidRight=new Video(80,100);
                 addChild (vidRight);
                 vidRight.x=379;
                 vidRight.y=145;
     
                 vidBottom=new Video(80,100);
                 addChild (vidBottom);
                 vidBottom.x=235;
                 vidBottom.y=253;
            }
      }
    }

    6. 在你的服务端applications目录中建立一个名为Quad的目录

    7. 打开Deux.asc文件,改变第一行

    vidStreams=["bottom", "top",right","left"];

    8. 把Deux.asc另存为Quad.asc,放置在Quad目录中

    9. 发布Quad.fla为html,swf,一旦你把这些文件放置在你的Web服务器上,你已经设置好你的在线会议了。

    邀请3位有摄像机和麦克风连的朋友连接到您的应用程序。每一个进入在线会议,他们将看到别人和仍未出现人的绿色背景。如果有人离开会议时,您会看到 在视频窗口该人的最后一张图像,直到有一个新进来的人。图5-9显示了4个来自四个不同国家的人在聊天应用程序上。这视图显示了本地用户在最上方的位置, 不过,其他三人也看到自己在最上方的位置。

    图5-9. Four-way conference in four countries

    这个应用程序的目的,一直保持简单。您可以添加不同的增强,如使用video.clear()方法来清除萤幕,在旅客已离开了会议后。

    5.7.继续前进到更多的服务端应用程序

    现在,您已经看到如何在客户端与音频和视频工作(服务器端的一些小帮忙),下一步是在对服务器端与 音频和视频工作。第6章:广播和服务器端的带宽控制 ,介绍了另一种类型的A/V应用-广播,更好地形容为一个到多个的应用。主要焦点,会介绍了FMS3服务器端的综合体。首先开始一些简单的服务器端使用。 但正如您将很快地看到,一旦你开始使用服务器端脚本,您将有更多的选择和控制您建立的应用程序。

    -_-||本章终于完了~~

  • x
Powered by LuoYe Lab , Skin in Kaven,XiaoXu RSS Copyright © 2008