大概了解了FMS的功能以及一个简单的用法。这节课呢!再来看看FMS的另一个入门级的例子。

这个例子就展示了如何播放FMS上的视频文件。

再来想想上节课的比喻:一根管子,一端是FMS,另一端是客户端,现在我们就要在这根管子里建立一个流,这个流运载的是你要播放的流媒体文件数据,这股数据流从FMS流到客户端。我们的终极目标就是让这个流在客户端变出活生生的视频来。

先看看一下整体的代码:

android 边播放视频边录音 手机如何边播放边录制_xmlandroid 边播放视频边录音 手机如何边播放边录制_ide_02Code

1 <?xml version="1.0" encoding="utf-8"?>
 2 <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
 3     <mx:Script>
 4         <![CDATA[
 5             import __AS3__.vec.Vector;
 6             import adobe.utils.CustomActions;
 7             import flash.net.NetConnection;
 8             import flash.net.NetStream;
 9             import flash.events.NetStatusEvent;
10             import flash.media.Video;
11             
12             private var nc:NetConnection;
13             private var ns:NetStream;
14             private var vedioCon:Sprite;
15             private var vd:Video;
16             
17             private function connectHandler():void{
18                 nc=new NetConnection();
19                 vedioCon=new Sprite;
20                 vd=new Video();
21                 vedioCon.addChild(vd);
22                 this.rawChildren.addChild(vedioCon);
23                 vedioCon.x=50;
24                 vedioCon.y=50;
25                 nc.connect("rtmp://localhost/playstreams");
26                 nc.addEventListener(NetStatusEvent.NET_STATUS,statusHandler);
27                 
28                 //也可以这样把vedio加到应用里
29 //                var screen:UICompnotallow=new UIComponent(); 
30 //                screen.setActualSize(200,200); 
31 //                screen.addChild(vd); 
32 
33 //                也可以建立一个VideoPlayer组件bvp,然后vp.addChild(vd);
34             }
35             private function statusHandler(event:NetStatusEvent):void{
36                 trace(event.info.code);
37                 if(event.info.code=="NetConnection.Connect.Success"){
38                     ns=new NetStream(nc);
39                     ns.addEventListener(NetStatusEvent.NET_STATUS,statusHandler);
40                     ns.client=this;
41                     vd.attachNetStream(ns);
42                     ns.play("sample",0);
43                 }
44             }
45             
46             public function onBWDone():void{
47               }
48               public function onMetaDate(info:Object):void{
49               }
50               public function onPlayStatus(info:Object):void{
51               }
52             
53         ]]>
54     </mx:Script>
55     <mx:Button label="connect" id="cb" click="connectHandler()"/>
56 </mx:Application

好,那就开始吧!

准备:在FMS安装目录的applications下新建一个文件夹,名字是playstreams,然后在这个文件夹里放一个文件夹名字叫streams,然后在这个文件里再建一个文件夹名字叫_definst_,在这个个_definst_文件夹中放入一个sample.flv文件。为什么这么建?有些麻烦,但是streams/_definst_是视频文件的默认存放位置,有客户端建立流的请求时FMS会自动到这里来找资源。当然,这个默认位置可以修改的。

第一步:建立FMS和客户端之间那个的管子。

1 nc=new NetConnection();
nc.connect("rtmp://localhost/playstreams");
2 nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);

这个NetConnect(本例中实例化为nc)呢就是FMS与客户端之间的那根管道,FMS与客户端的所有数据都是通过它来传递,在以后建立流也要靠这根管子。在你确定它成功连接之后才能建立流或者其他对象。因为这跟管道负责FMS与客户端之间的连接,及其重要,也很最弱,很容易受到网络环境的影响,所以必须时时关注它的状态,所以我们给它添加了监听。每当有NetStatusEvent.NET_STATUS事件发生就会返回相应的信息。下面我们看看如何处理这个事件,如何处理的明白了,也就懂得如何掌握NetConnection的状态了。

第二步:处理连接状态

private function statusHandler(event:NetStatusEvent):void{

    trace(event.info.code);

        if(event .info.code=="NetConnection.Connect.Success"){

        //建立流

            }

}

NetConnection.Connect.Success表示连接成功,在这种状况下才能继续向下处理。

除了成功状态之外还有什么状态呢?

1,NetConnection.Connect.Rejected 连接被拒绝

2,NetConnection.Connect.Failed 连接失败

3,NetConnection.Connect.AppShutDown 应用关闭了

4,NetConnection.Connect.Closed 连接关闭

不同的状况有不同的处理,处理方式可以参考下面的代码

android 边播放视频边录音 手机如何边播放边录制_xmlandroid 边播放视频边录音 手机如何边播放边录制_ide_02Code

switch (event.info.code){

    case "NetConnection.Connect.Success":

    // create live streams

       // play recorded streams

    break;

    case "NetConnection.Connect.Rejected":

    // try to connect again

    break;

    case "NetConnection.Connect.Failed":

    // display a message for the user

    break;

    case "NetConnection.Connect.AppShutDown":

    // this method disconnects all stream objects

    nc.close();

    break;

    case "NetConnection.Connect.Closed":

    // display a reconnect button

    break;

第三步:建立流

管道已经成功建立起来了,下面就应该建立流。这个流对应着NetStream类。下面代码展示了如何建立流。

ns=new NetStream(nc);                   
ns.addEventListener(NetStatusEvent.NET_STATUS,statusHandler);

ns.client=this;

这个NetStream类的实例也加上了监听。这个NetStatusEvent事件不仅能够返回连接状态的信息,也能够返回流的状态的信息,所以在这里也给NetStream加上了监听,但是事件的处理函数跟NetConnection是一个,也可以不同,看实际情况。

第四步:播放视频

终于要实现目标啦!

客户端由那个类来处理数据流呢?这里我们选择Vedio类,这个类在flash.media包里,但是这个类不是UIComponent,所以待会可能会遇到些麻烦。先不管。这个类如何处理流看下面代码:

//vd是Vedio的一个实例

vd.attachNetStream(ns);ns.play("sample",0);

还记得ns吗?ns是上面建立的NetStream的实例。就这样我们把这根载有数据的流查到一个Vedio类。最后调用ns.play()方法就完成了流的播放。

这个方法的签名为:

public function play( name:Object [,start:Number [,len:Number [,reset:Object] ]
]):void

四个参数,一个name,是上面在FMS建立的应用里stream文件夹下的一个视频文件的名字也是流的名字,默认后缀名为flv,第二个参数指明了开始播放的位置,单位是秒,上面的0表示从头播放,第三个参数指明了播放的时间,这里没写,就默认播放完,第四个参数是是否清楚播放列表里的所有播放。

到目前为止我们已经完成了建立连接,建立流,将流导入Vedio,但是还有个很重要的问题,就是客户端的界面如何办?因为,Vedio不是UIComponent的子类,所以不能直接添到界面里。我的解决方法是:建立一个VideoDisplay组件,用这个组件的addChild方法,把Vedio加到VedioDisplay里,这样就能在界面显示了。

运行一下,应该可以来自FMS的视频了!