as3中播放视频主要用到NetStream类,调用NetStream.play()方法即可播放视频。
play方法常用参数:
1.name:Object--视频流的名称,或者文件的uri地址
2.Start:Number--有三个有效的值0或者大于0,表示播放的是录制好的视频流;-1表示播放实时流;-2表示实时流优先播放,即:先会查找是否有实时流,如果有,则播放。如果没有,则查找是否有录制的视频,如果有,则播放。如果没有,则打开实时流。
就是说:如果您要以rtmp方式做视频点播,就用NetStream.play(streamName,0)是比较好的。第二个参数如果不传值,默认为-2。
流播放细节:
当执行NetStream.play(streamName,0)时,FMS会向客户端发送以下状态:
NetStream.Play.Reset
NetStream.Play.Start
NetStream.Buffer.Full
当客户端收到NetStream.Play.Start状态后,如果流上有元数据,则会触发onMetaData事件,从此事件中我们通常可以获取视频的编码,帧频,帧大小,时长等信息,此时视频还是没有开始播放的,知道收到NetStream.Buffer.Full状态,此时视频才真正开始播放。也就是说onMetaData事件会在视频播放之前触发,这样视频播放前就能获取其时长。
具体视频中是否包括元数据,元数据中可能包括哪些信息,这些决定于压缩视频的工具,或者发布视频的人!
从NetStream.Play.Start到NetStream.Buffer.Full的时间是一个视频缓冲的时间,可以用NetStream的bufferTime设置。
当播放到流的结尾时,FMS会向客户端发送以下状态:
NetStream.Play.Stop
NetStream.Buffer.Flush
NetStream.Buffer.Empty
当流要结束时,FMS首先停止发送流数据到客户端,此时客户端会收到NetStream.Play.Stop状态,但此时视频并未停止播放,NetStream会继续读取缓冲区得视频流数据播放视频,此时NetStream.Buffer.Flush状态会触发(可能不止一次),直到NetStream.Buffer.Empty状态到达,此时视频播放真正停止。
当进行seek操作时(查找成功),FMS会向客户端发送以下状态:
NetStream.Seek.Notify
NetStream.Buffer.Full
FMS默认配置中有个参数设置查找时的行为,即默认是查找到目标位置最近的关键帧,所以有时候查找到某个时间时,可能播放进度会显示到此时间前或者后的位置。NetStream.Seek.Notify状态表示查找成功,但此时视频是停止状态的,直到缓冲区写满,即收到NetStream.Buffer.Full状态才真的开始播放,所以查找时不可避免有一点延时!
如果是用http方式播放录制的视频流,而不是rtmp方式,则播放细节又有所不同:
当播放到流的结尾时,FMS会向客户端发送以下状态:
NetStream.Buffer.Flush
NetStream.Play.Stop
注意:NetStream.Buffer.Flush可能会有很多次,且没有收到NetStream.Buffer.Empty状态。
以上结论,只是我个人经过不完全测试得出,同时也参看了一些资料,还有《Programming Flash Communication Server》和as3帮助文档。如果有不正确的地方,请大家指正,一起讨论一下!