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

來源:互聯網
上載者:User

  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 的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 iType成員變數中。

  當前Splitter的匹配過程

  PVMFStatus PVPlayerNodeRegistry::QueryRegistry(PVMFFormatType& aInputType, PVMFFormatType& aOutputType, Oscl_Vector& 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函數,傳入路徑

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

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

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

  在sp MediaPlayerService::create(pid_t pid, const sp& client, const char* url)中

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

  在MediaPlayerService::Client::setDataSource中,調sp MediaPlayerService::Client::createPlayer(player_type playerType)

  產生一個繼承自MediaPlayerBase的PVPlayer執行個體。

  以上就是對Android多媒體架構的原始碼的解讀。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.