Android PVPlayer介绍

  5.1 Player的组成

  OpenCorePlayer的编译文件是pvplayer/Android.mk,将生成动态库文件libopencoreplayer.so。这个库包含了两方面的内容:一方是Playerengine(引擎),一方面是为Android构件的Player,这实际上是一个适配器(adapter)。engine的路径是engine/playeradapter的路径是android

  5.2 Player Engine部分

  OpenCorePlayer Engine具有清晰明确的接口。在这个接口之上,不同的系统可一个根据自己的情况实现不同Player。目录engines中的文件结构如下所示:

  OpenCorePlayer Engine具有清晰明确的接口。在这个接口之上,不同的系统可一个根据自己的情况实现不同Player。目录engines中的文件结构如下所示:

engines/player/

|-- Android.mk

|-- build

|   |-- linux_nj

|   |-- make

|   `-- makefile.conf

|-- config

|   `-- linux_nj

|-- include

|   |-- pv_player_datasink.h

|   |-- pv_player_datasinkfilename.h

|   |-- pv_player_datasinkpvmfnode.h

|   |-- pv_player_datasource.h

|   |-- pv_player_datasourcepvmfnode.h

|   |-- pv_player_datasourceurl.h

|   |-- pv_player_events.h

|   |-- pv_player_factory.h

|   |-- pv_player_interface.h

|   |-- pv_player_license_acquisition_interface.h

|   |-- pv_player_registry_interface.h

|   |-- pv_player_track_selection_interface.h

|   `-- pv_player_types.h

|-- sample_app

|   |-- Android.mk

|   |-- build

|   |-- sample_player_app_release.txt

|   `-- src

|-- src

|   |-- pv_player_datapath.cpp

|   |-- pv_player_datapath.h

|   |-- pv_player_engine.cpp

|   |-- pv_player_engine.h

|   |-- pv_player_factory.cpp

|   |-- pv_player_node_registry.h

|   `-- pv_player_sdkinfo.h

`-- test

    |-- Android.mk

    |-- build

    |-- config

    `-- src

     其中,engines/player/include目录中是接口头文件,engines/player/src目录源文件和私有头文件,主要头文件的功能如下所示:

pv_player_types.h:定义一些数据结构和枚举值

pv_player_events.h:定义UUID和一些错误值。

pv_player_datasink.hdatasink是媒体数据的输出,定义类PVPlayerDataSink,这是媒体数据输出的基类,作为接口使用

pv_player_datasinkfilename.h:定义类PVPlayerDataSinkFilename继承PVPlayerDataSink

pv_player_datasinkpvmfnode.h:定义类PVPlayerDataSinkPVMFNode继承PVPlayerDataSink

pv_player_datasource.hdatasource是媒体数据的输入,定义类PVPlayerDataSource,这是媒体数据输入的基类,作为接口使用。

pv_player_datasourcepvmfnode.h:定义类PVPlayerDataSourcePVMFNode继承PVPlayerDataSource

pv_player_datasourceurl.h:定义类PVPlayerDataSourceURL继承PVPlayerDataSource

pv_player_interface.h:定义Player的接口PVPlayerInterface,这是一个接口类。

pv_player_factory.h:主要定义工厂类PVPlayerFactory,用于创建和销毁PVPlayerInterface

    事实上,在engines/player/src目录中,主要实现类为pv_player_engine.cpp,其中定义了类PVPlayerEnginePVPlayerEngine继承了PVPlayerInterface,这是一个实现类,在PVPlayerFactory创建PVPlayerInterface接口的时候,实际创建的是PVPlayerEngine

 

       Player Engine的实现中,包含了编解码和流控制等功能,而输出的介质需要从外部设置近来。PVPlayerInterface定义的接口基本是按照操作顺序的,主要的接口如下所示:

  在Player Engine的实现中,包含了编解码和流控制等功能,而输出的介质需要从外部设置近来。PVPlayerInterface定义的接口基本是按照操作顺序的,主要的接口如下所示:

PVCommandId AddDataSource(PVPlayerDataSource& aDataSource, const OsclAny* aContextData = NULL);

PVCommandId Init(const OsclAny* aContextData = NULL);

PVCommandId AddDataSink(PVPlayerDataSink& aDataSink, const OsclAny* aContextData = NULL);

PVCommandId Prepare(const OsclAny* aContextData = NULL);

PVCommandId Start(const OsclAny* aContextData = NULL);

PVCommandId Pause(const OsclAny* aContextData = NULL);

PVCommandId Resume(const OsclAny* aContextData = NULL);

PVCommandId Stop(const OsclAny* aContextData = NULL);

PVCommandId RemoveDataSink(PVPlayerDataSink& aDataSink, const OsclAny* aContextData = NULL);

PVCommandId Reset(const OsclAny* aContextData = NULL);

PVCommandId RemoveDataSource(PVPlayerDataSource& aDataSource, const OsclAny* aContextData = NULL);

  这里面的DataSink可能包含Video的输出和Audio的输出两者部分。在pv_player_types.h文件中,定义了Player的状态机,以PVP_STATE_为开头,如下所示:

typedef enum

{

    PVP_STATE_IDLE        = 1,

    PVP_STATE_INITIALIZED = 2,

    PVP_STATE_PREPARED    = 3,

    PVP_STATE_STARTED     = 4,

    PVP_STATE_PAUSED      = 5,

    PVP_STATE_ERROR       = 6

} PVPlayerState;

  PVPlayerInterface中的各个操作如果成功,可以更改Player的状态机:初始化的时候PlayerPVP_STATE_IDLE状态,调用Init后,进入PVP_STATE_INITIALIZED状态;调用AddDataSink,进入PVP_STATE_PREPARED状态;调用Prepare后,进入PVP_STATE_PREPARED状态;调用start后进入PVP_STATE_STARTED状态,之后可以调用pause进入PVP_STATE_PAUSED状态。

   PVP_STATE_STARTEDPVP_STATE_PAUSED状态是播放情况下的状态,可以使用startpause函数在这两个状态中切换。

  在播放过程中,调用stop可以返回PVP_STATE_INITIALIZED状态,在调用RemoveDataSource返回PVP_STATE_IDLE状态。


来源:shenbin1430的CSDN博客

上一篇: Android内核的简单分析

下一篇: Android的虚拟机Dalvik 介绍

分享到: 更多