技术开发 频道

Android PVPlayer介绍

  【IT168 技术文档】Android的多媒体框架OpenCore(PacketVideo)介绍 本文为个人总结,不代表官方观点。

  分为几个阶段:

  1、整个Android的多媒体框架OpenCore

  2、Player和Author的详细介绍

  2、OpenCore和Android其他部分的集成5.1 Player的组成

  OpenCore的Player的编译文件是pvplayer/Android.mk,将生成动态库文件libopencoreplayer.so。这个库包含了两方面的内容:一方是Player的engine(引擎),一方面是为 Android构件的Player,这实际上是一个适配器(adapter)。engine的路径是engine/player;adapter的路径是 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.h:datasink是媒体数据的输出定义类PVPlayerDataSink这是媒体数据输出的基类作为接口使用
  pv_player_datasinkfilename.h定义类PVPlayerDataSinkFilename继承PVPlayerDataSink
  pv_player_datasinkpvmfnode.h定义类PVPlayerDataSinkPVMFNode继承PVPlayerDataSink
  pv_player_datasource.h:datasource是媒体数据的输入定义类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其中定义了类PVPlayerEngine,PVPlayerEngine继承了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的状态机:初始化的时候Player是PVP_STATE_IDLE状态,调用Init后,进入PVP_STATE_INITIALIZED状态;调用AddDataSink,进入PVP_STATE_PREPARED状态;调用Prepare后,进入PVP_STATE_PREPARED状态;调用start后进入PVP_STATE_STARTED状态,之后可以调用 pause进入PVP_STATE_PAUSED状态。
   PVP_STATE_STARTED和PVP_STATE_PAUSED状态是播放情况下的状态,可以使用start和pause函数在这两个状态中切换。
   在播放过程中,调用stop可以返回PVP_STATE_INITIALIZED状态,在调用RemoveDataSource返回PVP_STATE_IDLE状态。

0
相关文章