您的位置:华清远见教育科技集团 >> Android资料 >> Android PVPlayer引擎的实现  
 
Android PVPlayer引擎的实现
分享到:

在OpenCORE中,媒体引擎从编解码的类型上可以分为3种:播放引擎(PVPlayer Engine)、记录引擎(PVAuthor Engine)、双向引擎(PV2way Engine)。另外适配器引擎(Adapter Engine)和元数据引擎(PV Metadata Engine)也是不可缺少的一部分,本文重点介绍的是PVPlayerInterface播放引擎。

PVPlayer Engine播放引擎

在OpenCORE中,目前支持的播放媒体格式包括MP4、3GPP、RSTP流会话和SMIL等。播放引擎依赖于OSCL、PVMF、OMX IL等组件。

下图中描述了播放引擎的主要接口类图,客户端通过PVPlayerInterface获得播放引擎进行相关的操作,而播放引擎则利用3个观察器PVMFNodeCmdStatusObserver、PVMFNodeInfoEventObserver、PVMFNodeErrorEventObserver来为客户端提供异步的命令完成状况和异常信息等消息。

播放接口类图
播放接口类图

需要说明的是,在一般情况下,在上层应用和播放引擎之间不需要适配器,但如果PVPlayerInterface提供的接口无法满足上层应用的需要,就需要在OSCL和上层应用之间构建一个基于新OSCL接口的适配层。在为特定平台或者操作系统做OpenCORE移植时,这种设计策略常常需要。

播放引擎的实现主要位于external\opencore\engines\player目录中,下图显示的是播放引擎的类图。

播放引擎主要类图
播放引擎主要类图

播放引擎具有较复杂的运行环境,为了便于播放引擎的运行,播放引擎引入了状态机的设计框架。在OpenCORE中,播放引擎的状态切换是基于PVPlayerInterface接口的,相互的状态触发事件由下层的PVMF组件发出。相关的状态在pv_player_types.h文件中定义。

在完成引擎的初始化后,播放引擎将处于PVP_STATE_IDLE状态,在该状态下,通过PVPlayerEngine::AddDataSource()方法可以将数据源添加到引擎中,在添加数据源成功后,通过PVPlayerEngine::Init()方法发送PVP_ENGINE_COMMAND_INIT命令,引擎将会转换为PVP_STATE_INITIALIZED状态。

在PVP_STATE_INITIALIZED状态下,客户端可以查询数据源的各种信息,如媒体轨迹、元数据等。同时通过PVPlayerEngine::AddDataSink()方法可以添加播放引擎的数据槽。在完成添加数据槽的操作后,通过PVPlayerEngine::Prepare()方法发送PVP_ENGINE_ COMMAND_PREPARE命令,引擎将会转换为PVP_ENGINE_STATE_PREPARING状态。

在PVP_ENGINE_STATE_PREPARING状态,数据源将会为接下来的媒体播放进行一个排序方面的准备,然后通过PVPlayerEngine::Start()方法发送PVP_ENGINE_ COMMAND_START命令,引擎将会转换为PVP_STATE_STARTED状态,开始播放媒体。

在PVP_STATE_STARTED状态,用户可以执行暂停、停止等操作,如果执行了PVPlayerEngine::Stop()方法操作,引擎将会转换为PVP_STATE_INITIALIZED状态;如果执行PVPlayerEngine::Pause()方法操作,引擎将会转换为PVP_STATE_PAUSED状态。

在PVP_STATE_PAUSED状态,用户可以执行恢复、停止等操作,如果执行了PVPlayerEngine::Stop()方法操作,引擎将会转换为PVP_STATE_INITIALIZED状态;如果执行PVPlayerEngine:: Resume()方法操作,引擎将会转换为PVP_STATE_STARTED状态。

在执行操作的过程中,如果发生了错误或者异常,系统将会转为PVP_STATE_ERROR状态,并尝试从错误中恢复。如果发生的是无法恢复的错误,引擎将会清除所有痕迹,转为PVP_STATE_IDLE状态。如果错误可以恢复,在出错前状态为PVP_STATE_INITIALIZED、PVP_STATE_PREPARED、PVP_STATE_STARTED、PVP_STATE_PAUSED等时,引擎将会转为PVP_STATE_INITIALIZED状态,否则引擎转为PVP_STATE_IDLE状态。当出错恢复完成时,引擎将会发送相关的异步消息通知。下图显示了播放引擎的状态图。

播放引擎状态图
播放引擎状态图

需要说明的是,在默认情况下,播放引擎并不是多线程安全的,为了支持多线程,可以有两种方法,一种方法是利用OSCL代理接口组件提供多线程支持,另一种方法是在适配层中为特定平台添加多线程支持。

 更多相关文章

·Android OpenIPMP服务器搭建
·Android CPM插件机制
·Android 封装式/嵌入式DRM对比
·Android DRM数字版权管理
·Android OpenCORE 概述