Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 高級開發 >> 全方位解讀Android多媒體框架源碼

全方位解讀Android多媒體框架源碼

編輯:高級開發

android中對於圖形界面以及多媒體的相關操作比較容易實現。而且對於大多數手機用戶來說,他們主要也就是根據這些方面的功能來對系統那個進行修改。我們可以通過本文介紹的android多媒體框架的源碼解讀,來具體分析一下這方面的基本知識。

  • android快速啟動要點總結
  • android垃圾回收實質內容解析
  • android後台程序應用技巧分享
  • android事件偵聽器回調方法淺談
  • android模擬器尺寸隨意改

Android多媒體框架的代碼在以下目錄中:external/opencore/。這個目錄是android多媒體框架的根目錄,其中包含的子目錄如下所示:

* android:這裡面是一個上層的庫,它基於PVPlayer和PVAuthor的SDK實現了一個為android使用的Player和Author。

* baselibs:包含數據結構和線程安全等內容的底層庫

* codecs_v2:這是一個內容較多的庫,主要包含編解碼的實現,以及一個OpenMAX的實現

* engines:包含PVPlayer和PVAuthor引擎的實現

* extern_libs_v2:包含了khronos的OpenMAX的頭文件

* fileformats:文件格式的據具體解析(parser)類

* nodes:編解碼和文件解析的各個node類。

* oscl:操作系統兼容庫

* pvmi: 輸入輸出控制的抽象接口

* protocols:主要是與網絡相關的RTSP、RTP、HTTP等協議的相關內容

* pvcommon:pvcommon庫文件的android.mk文件,沒有源文件。

* pvplayer:pvplayer庫文件的android.mk文件,沒有源文件。

* pvauthor:pvauthor庫文件的android.mk文件,沒有源文件。

* tools_v2:編譯工具以及一些可注冊的模塊。

Splitter的定義與初始化

以wav的splitter為例,在fileformats目錄下有解析wav文件格式的pvwavfileparser.cpp文件,在nodes目錄下有pvmf_wavffparser_factory.cpp,pvmf_wavffparser_node.h, pvmf_wavffparser_port.h等文件。

我們由底往上看,vwavfileparser.cpp中的PV_Wav_Parser類有InitWavParser(),GetPCMData(),RetrIEveFileInfo()等解析wav格式的成員函數,此類應該就是最終的解析類。我們搜索PV_Wav_Parser類被用到的地方可知,在PVMFWAVFFParserNode類中有PV_Wav_Parser的一個指針成員變量。

再搜索可知,PVMFWAVFFParserNode類是通過PVMFWAVFFParserNodeFactory的CreatePVMFWAVFFParserNode()成員函數生成的。而CreatePVMFWAVFFParserNode()函數是在PVPlayerNodeRegistry::PVPlayerNodeRegistry()類構造函數中通過PVPlayerNodeInfo類被注冊到Oscl_Vector<PVPlayerNodeInfo, OsclMemAllocator> 的vector中,在這個構造函數中,AMR,mp3等node也是同樣被注冊的。

由上可知,android多媒體框架中對splitter的管理也是與ffmpeg等類似,都是在框架的初始化時注冊的,只不過Opencore注冊的是每個splitter的factory函數。

綜述一下splitter的定義與初始化過程:

每個splitter都在fileformats目錄下有個對應的子目錄,其下有各自的解析類。

每個splitter都在nodes目錄下有關對應的子目錄,其下有各自的統一接口的node類和node factory類。

播放引擎PVPlayerEngine類中有PVPlayerNodeRegistry iPlayerNodeRegistry成員變量。

在PVPlayerNodeRegistry的構造函數中,將 AMR, AAC, MP3等splitter的輸入與輸出類型標示和node factory類中的create node與release delete接口通過PVPlayerNodeInfo類push到Oscl_Vector<PVPlayerNodeInfo, OsclMemAllocator> iType成員變量中。

當前Splitter的匹配過程

PVMFStatus PVPlayerNodeRegistry::QueryRegistry(PVMFFormatType& aInputType, PVMFFormatType& aOutputType, Oscl_Vector<PVUuid, OsclMemAllocator>& aUuids)函數的功能是根據輸入類型和輸出類型,在已注冊的node vector中尋找是否有匹配的node,有的話傳回其唯一識別標識PVUuid。

從QueryRegistry這個函數至底向上搜索可得到,在android中splitter的匹配過程如下:

android_media_MediaPlayer.cpp之中定義了一個JNINativeMethod(Java本地調用方法)類型的數組gMethods,供Java代碼中調用MultiPlayer類的setDataSource成員函數時找到對應的c++函數

  1. {"setDataSource", "(LJava/lang/String;)V", (void *)
    android_media_MediaPlayer_setDataSource},
  2. static void android_media_MediaPlayer_setDataSource
    (JNIEnv *env, jobject thiz, JString path)

此函數中先得到當前的MediaPlayer實例,然後調用其setDataSource函數,傳入路徑

  1. status_t MediaPlayer::setDataSource(const char *url)

此函數通過調getMediaPlayerService()先得到當前的MediaPlayerService, const sp<IMediaPlayerService>& service(getMediaPlayerService());

然後新建一個IMediaPlayer變量, sp<IMediaPlayer> player(service->create(getpid(), this, fd, offset, length));

在sp<IMediaPlayer> MediaPlayerService::create(pid_t pid, const sp<IMediaPlayerClient>& clIEnt, const char* url)中

調status_t MediaPlayerService::Client::setDataSource(const char *url)函數,ClIEnt是MediaPlayerService的一個內部類。

在MediaPlayerService::Client::setDataSource中,調sp<MediaPlayerBase> MediaPlayerService::ClIEnt::createPlayer(player_type playerType)

生成一個繼承自MediaPlayerBase的PVPlayer實例。

以上就是對android多媒體框架的源代碼的解讀。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved