大概了解了FMS的功能以及一个简单的用法。这节课呢!再来看看FMS的另一个入门级的例子。
这个例子就展示了如何播放FMS上的视频文件。
再来想想上节课的比喻:一根管子,一端是FMS,另一端是客户端,现在我们就要在这根管子里建立一个流,这个流运载的是你要播放的流媒体文件数据,这股数据流从FMS流到客户端。我们的终极目标就是让这个流在客户端变出活生生的视频来。
先看看一下整体的代码:
Code
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 连接关闭
不同的状况有不同的处理,处理方式可以参考下面的代码
Code
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的视频了!