jw flv player是采用MVC模式(model-view-controller模式设计的),如果你还不了解MVC模式,可以去Google一下.我们来看看作者提供的一张示意图:
从这张图上我们看到MediaPlayer(就是我们的视频播放器)和ImageRotator都是AbstractPlayer的子类,它们都首先加载设置参数(congfig对象,内含了所有的参数值),然后实例化出FeedManager类,创建一个feeder,用它来管理播放列表.然后就开始了MVC链.在继续分析之前,我们再看一张结构图:
结合这两张图,我们再进行分析.
Model模块是由继承自AbstractModel类的FLVModel,ImageModel,MP3Model组成的,它的作用是管理媒体对象,比如加载文件,控制音量,播放暂停等功能都是有这个模块完成的.同时它会向View模块发送更新信息,向Controller模块发送播放完成的事件.
View模块是由继承自AbstractView类的AudioView,CallbackView,CaptionsView,ControlbarView,DisplayView,EqualizerView,InputView,JavaScriptView,RotatorView,PlaylistView组成的,它的作用是显示用户界面,接收用户的输入.当Model模块有更新时,View模块的内容会做响应的调整.当接收到用户输入后,会把事件传递到Controller模块.
Controller模块是由继承自AbstractrController类的PlayerController,RotatorController组成的,作用是处理用户的输入(包括鼠标输入,键盘输入).当它接收到View模块传递来的事件消息后,会分类做响应的处理,如跳到前一个文件或有一个文件,全屏等.如果需要的功能它自己可以完成,那么它会完成它,否则会告诉Model模块来完成.
下面更加详细的逐个分析
AbstractPlayer和MediaPlayer
MediaPlayer类继承自AbstractPlayer类,从上面这张图上我们看到,AbstractPlayer类有3个私有方法:loadConfig,loadFile,setupMCV,而MediaPlayer类完全重写了loadConfig和setupMCV方法,新增了checkStream方法.MediaPlayer还覆盖了AbstractPlayer类的私有属性config.其他属性和方法则是完全继承过来的.
当构造出MediaPlayer类的实例时,MediaPlayer类的构造函数内部会首先调用父类的构造函数,设置config对象的clip,width,height属性,然后调用loadConfig方法,加载其他设置参数.获取参数后就会根据bwstreams的值判断是要loadFile()还是要checkStream().
在loadFile的时候要建立FeedManager的实例来管理播放列表以及加载播放文件.
当建立好feeder后便开始通过setupMCV()设置MVC模式.首先是建立Controller模块,也就是实例化PlayerController,然后创建DisplayView和ControlbarView,这两个视图是任何情况下都要建立的.接下来根据获得的config参数,确定是否建立PlaylistView,InputView,EqualizerView,CaptionView,AudioView,JavascriptView,CallbackView,OverlayView.然后建立Model模块的MP3Model,FLVModel和ImageModel,最后由Controller模块的startMCV()激活MVC模式.
Controller块
AbstractController类中的私有属性registeredModels是个保存了使用的Model的数组,发送更新信息的时候用.
PlayerController类中增加了一个名为playerSO的私有属性,用来在用户计算机上保存音量,是否使用字幕,是否使用音频这3个属性.如果当前播放器中没有设置这些参数的话,则从用户计算机上读取保存的数据.
Model块
Model的作用是管理媒体对象,播放暂停,音量等.AbstractModel是基类,FLVModel,MP3Model,ImageModel是子类,分别用来处理视频,声音和图像.每个子类都有一个mediatypes变量,用来保存自己可以处理的文件类型.在构造MeidaPlayer时,会同时创建这3个Model,因此,允许播放列表中有不同的文件类型,比如视频+图片+MP3.Model会根据文件类型激活相应的Model块.
View块
View模块负责显示用户界面,它从Model处获取数据,然后选择合适的界面显示给用户,并接收用户的输入,传递给Controller.