视频播放器开发文档
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
视频播放器开发文档钱祥森2015.09.17
本文档是在YTV视频播放器的基础上,对播放器的架构进行研究和重构,并设计播放模式,为以后播放器的开发奠定基础。
1、播放器的架构
播放器通过底层VLC自定义MediaPlayer,与SurfaceView和SurfaceHolder结合实现播放器播放功能,利用接口回调对播放器的状态进行监听和更新数据。
播放器整体可以分为以下几个层次:
(1)VLCLibs解码库。解码库提供了视频播放时各种接口。
(2)MediaPlayer。播放器的核心。
(3)界面GUI。通过SurfaceView和SurfaceHolder将MediaPlayer 展示出来。
(4)接口定义。通过播放时接口返回的信息进行更新数据。
(5)控件Widget。播放器上的播放,暂停等控件,这些控件对播放器的功能进行完善。
2、播放器的状态和生命周期
当播放器获取到播放地址后,会对播放器进行初始化,初始化成功后,对播放器添加相应的监听接口,数据加载完毕播放器准备完
成后,开始播放。当播放器支持回看时,用户从回看切换到直播或从直播切换到回看时,当前播放器会进行销毁,重新加载数据和创建播放器并对数据进行解析和播放。
播放器播放时的各个状态如图2.1。椭圆代表MediaPlayer对象可能驻留的状态。弧线表示驱动MediaPlayer在各个状态之间迁移的播放控制操作。这里有两种类型的弧线,由一个箭头开始的弧代表同步的方法调用,而以双箭头开头的代表的弧线代表异步方法调用。
图2-1 播放器状态图
通过该图我们可以知道,MediaPlayer有以下几种状态:
(1)Idle(空闲)状态和End状态。当一个MediaPlayer对象刚刚被创建或者是调用了reset()方法后,它就处于Idle状态。当调用了release()方法后,它就处于end状态。
(2)Error状态。在某些时候,由于种种原因,如视频格式,分辨率高,流超时等,播放控制操作可能会失效,在这种情况下,错误报告和恢复播放是非常重要的。MedialPlayer提供了OnErrorListener.onError()方法,通过调用setOnErrorListener来注册OnErrorListener。一旦发生错误,MediaPlayer对象就会进入到Error状态。当MediaPlayer对象处于Error状态是,如果想要重用可以通过reset方法将这个对象恢复成Idle状态。
(3)Initialized(已初始化)状态。当MediaPlayer通过setDataSource(String)方法设置播放源时会将处于Idle状态的对象迁移到Initialized状态。
(4)Prepared状态。在开始播放之前MediaPlayer一定会先进入Prepared状态。进入到Prepared状态有两种方法,一是调用prepare()方法(同步),此方法返回就表示MediaPlayer对象已经进入Prepared 状态,二是调用prepareAsync()方法(异步),此方法会使此MediaPlayer对象进入Preparing状态并返回,而内部的播放引擎会继续未完成的准备工作。当同步版本返回时或异步版本的准备工作完全完成时会调用OnPreparedListener.onPrepared()方法。可以调用MediaPlayer.setOnPreparedListener(android.media.MediaPlayer .OnPreparedListener)方法来注册OnPreparedListener.
(5)Started状态。播放器要开始播放,必须要调用start方法。当此方法成功返回时,MediaPlayer对象处于Started状态。可以通过isPlaying方法来MediaPlayer是否处于Started状态。
(6)Paused状态。播放器播放时可以被暂停和调整当前播放的位置。当调用pause()方法并返回时,会使MediaPlayer进入Pause状态。对于一个已处于Pause状态的MediaPlayer对象pause()方法没有影响。
(7)Stopped状态。通过调用stop()方法会停止播放,并且还会让一个处于Started,Pause,Prepared或PlaybackCompleted状态的MediaPlayer进入Stopped状态。对于一个已处于Stopped状态的MediaPlayer对象stop()方法对其没有影响。
(8)PlaybackCompleted状态。当播放到流的,播放就完成了。如果调用了setLooping(boolean)方法开启了循环模式,那么这个MediaPlayer对象就会重新进入Started状态。如果没有开启,当播放完成时会通过OnCompletion.onCompletion()回调方法使MediaPlayer对象处于PlayBackCompleted状态。
3、播放模式
目前我们的播放器支持直播播放,点播,DLNA播放,回看(包括直播时回看和从外部点击回看进入)等播放模式,具体分类和每种播放模式下的网络请求如下。
3.1 直播
播放当前正在直播的节目。根据传过来的tvId(频道id)和lid(分类Id)去请求播放地址和节目单数据,请求成功后显示节目单和播放节目。直播时流程图如图4.1所示。
图4-1 直播流程图
3.2 点播
通过播放地址进行播放,与直播相比显示进度条和节目单。点播主要分为三种,自定义播放地址,服务器传入播放地址,频道共享三
种方式。点播流程图如图4-2所示。
图4-2 点播流程图
3.3 回播
用户点击外部回放按钮进入播放页。该模式下,需要用户传入tvId 和回看节目的aid,通过id请求节目单和播放源,进行播放。刚进入时,节目单要显示当前回看的节目,可以点击直播进行切换。
3.4 DLNA播放
通过发现附近的DLNA设备进行播放。该模式下,用户可以将正在