Android PVPlayer介紹

  5.1 Player的組成

  OpenCorePlayer的編譯文件是pvplayer/Android.mk,將生成動態庫文件libopencoreplayer.so。這個庫包含了兩方面的內容:一方是Playerengine(引擎),一方面是為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.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,其中定義了類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的狀態機:初始化的時候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 介紹

分享到: 更多
新时时大小单双 pk10骗局全过程揭秘 pk10极速赛车计划软件 黑桃棋牌 重庆时时历史开奖记录 七乐彩2018085开奖视频 齐齐哈尔麻将手机版 pk10群计划群 七星彩前4个规律 21点技巧16点要牌 本金少的玩彩稳赚法 竞彩计算器 北京pk10做号安卓版 阶梯式投注 押龙虎技巧 pk10三码必中规律