Android一詞的本義指“機(jī)器人”,同時(shí)也是Google于2007年11月5日宣布的基于Linux平臺(tái)的開源手機(jī)操作系統(tǒng)的名稱,該平臺(tái)由操作系統(tǒng)、中間件、用戶界面和應(yīng)用軟件組成,號(hào)稱是首個(gè)為移動(dòng)終端打造的真正開放和完整的移動(dòng)軟件。目前,最新版本為Android 2.4 Gingerbread和Android 3.0 Honeycomb.Android是基于Linux內(nèi)核的操作系統(tǒng),是Google公司在2007年11月5日公布的手機(jī)操作系統(tǒng)。它采用了軟件堆層(software stack,又名軟件疊層)的架構(gòu),主要分為三部分。底層Linux內(nèi)核只提供基本功能,其他的應(yīng)用軟件則由各公司自行開發(fā),部分程序以Java編寫。我們可以通過(guò)本文介紹的Android多媒體框架的源碼解讀,來(lái)具體分析一下這方面的基本知識(shí)。
重力感應(yīng)裝置包括感應(yīng)器、處理器和控制器三個(gè)部分。感應(yīng)器負(fù)責(zé)偵測(cè)存儲(chǔ)器的狀態(tài),計(jì)算存儲(chǔ)器的重力加速度值;處理器則對(duì)加速度值是否超出安全范圍進(jìn)行判斷;而控制器則負(fù)責(zé)控制將磁頭鎖定或者釋放出安全停泊區(qū)。一旦感應(yīng)器偵測(cè)并經(jīng)處理器判斷當(dāng)前的重力加速度超過(guò)安全值之后,控制器就會(huì)通過(guò)硬件控制磁頭停止讀寫工作,并快速歸位,鎖定在專有的磁頭停泊區(qū)。這一系列動(dòng)作會(huì)在200毫秒內(nèi)完成。當(dāng)感應(yīng)裝置探測(cè)到加速度值恢復(fù)到正常值范圍之后,產(chǎn)品才會(huì)恢復(fù)工作。
Android多媒體框架的代碼在以下目錄中:external/opencore/。這個(gè)目錄是Android多媒體框架的根目錄,其中包含的子目錄如下所示:
* android:這里面是一個(gè)上層的庫(kù),它基于PVPlayer和PVAuthor的SDK實(shí)現(xiàn)了一個(gè)為Android使用的Player和Author.
* baselibs:包含數(shù)據(jù)結(jié)構(gòu)和線程安全等內(nèi)容的底層庫(kù)
* codecs_v2:這是一個(gè)內(nèi)容較多的庫(kù),主要包含編解碼的實(shí)現(xiàn),以及一個(gè)OpenMAX的實(shí)現(xiàn)
* engines:包含PVPlayer和PVAuthor引擎的實(shí)現(xiàn)
* extern_libs_v2:包含了khronos的OpenMAX的頭文件
* fileformats:文件格式的據(jù)具體解析(parser)類
* nodes:編解碼和文件解析的各個(gè)node類。
* oscl:操作系統(tǒng)兼容庫(kù)
* pvmi: 輸入輸出控制的抽象接口
* protocols:主要是與網(wǎng)絡(luò)相關(guān)的RTSP、RTP、HTTP等協(xié)議的相關(guān)內(nèi)容
* pvcommon:pvcommon庫(kù)文件的Android.mk文件,沒(méi)有源文件。
* pvplayer:pvplayer庫(kù)文件的Android.mk文件,沒(méi)有源文件。
* pvauthor:pvauthor庫(kù)文件的Android.mk文件,沒(méi)有源文件。
* tools_v2:編譯工具以及一些可注冊(cè)的模塊。
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格式的成員函數(shù),此類應(yīng)該就是最終的解析類。我們搜索PV_Wav_Parser類被用到的地方可知,在PVMFWAVFFParserNode類中有PV_Wav_Parser的一個(gè)指針成員變量。
再搜索可知,PVMFWAVFFParserNode類是通過(guò)PVMFWAVFFParserNodeFactory的CreatePVMFWAVFFParserNode()成員函數(shù)生成的。而CreatePVMFWAVFFParserNode()函數(shù)是在PVPlayerNodeRegistry::PVPlayerNodeRegistry()類構(gòu)造函數(shù)中通過(guò)PVPlayerNodeInfo類被注冊(cè)到Oscl_Vector 的vector中,在這個(gè)構(gòu)造函數(shù)中,AMR,mp3等node也是同樣被注冊(cè)的。
由上可知,Android多媒體框架中對(duì)splitter的管理也是與ffmpeg等類似,都是在框架的初始化時(shí)注冊(cè)的,只不過(guò)Opencore注冊(cè)的是每個(gè)splitter的factory函數(shù)。
綜述一下splitter的定義與初始化過(guò)程:
每個(gè)splitter都在fileformats目錄下有個(gè)對(duì)應(yīng)的子目錄,其下有各自的解析類。
每個(gè)splitter都在nodes目錄下有關(guān)對(duì)應(yīng)的子目錄,其下有各自的統(tǒng)一接口的node類和node factory類。
播放引擎PVPlayerEngine類中有PVPlayerNodeRegistry iPlayerNodeRegistry成員變量。
在PVPlayerNodeRegistry的構(gòu)造函數(shù)中,將 AMR, AAC, MP3等splitter的輸入與輸出類型標(biāo)示和node factory類中的create node與release delete接口通過(guò)PVPlayerNodeInfo類push到Oscl_Vector iType成員變量中。
當(dāng)前Splitter的匹配過(guò)程
PVMFStatus PVPlayerNodeRegistry::QueryRegistry(PVMFFormatType& aInputType, PVMFFormatType& aOutputType, Oscl_Vector& aUuids)函數(shù)的功能是根據(jù)輸入類型和輸出類型,在已注冊(cè)的node vector中尋找是否有匹配的node,有的話傳回其唯一識(shí)別標(biāo)識(shí)PVUuid.
從QueryRegistry這個(gè)函數(shù)至底向上搜索可得到,在android中splitter的匹配過(guò)程如下:
android_media_MediaPlayer.cpp之中定義了一個(gè)JNINativeMethod(JAVA本地調(diào)用方法)類型的數(shù)組gMethods,供java代碼中調(diào)用MultiPlayer類的setDataSource成員函數(shù)時(shí)找到對(duì)應(yīng)的c++函數(shù)
1.{“setDataSource”, “(Ljava/lang/String;)V”, (void *)
android_media_MediaPlayer_setDataSource},
2.static void android_media_MediaPlayer_setDataSource
(JNIEnv *env, jobject thiz, jstring path)
此函數(shù)中先得到當(dāng)前的MediaPlayer實(shí)例,然后調(diào)用其setDataSource函數(shù),傳入路徑
3.status_t MediaPlayer::setDataSource(const char *url)
此函數(shù)通過(guò)調(diào)getMediaPlayerService()先得到當(dāng)前的MediaPlayerService, const sp& service(getMediaPlayerService());
然后新建一個(gè)IMediaPlayer變量, sp player(service-》create(getpid(), this, fd, offset, length));
在sp MediaPlayerService::create(pid_t pid, const sp& client, const char* url)中
調(diào)status_t MediaPlayerService::Client::setDataSource(const char *url)函數(shù),Client是MediaPlayerService的一個(gè)內(nèi)部類。
在MediaPlayerService::Client::setDataSource中,調(diào)sp MediaPlayerService::Client::createPlayer(player_type playerType)
生成一個(gè)繼承自MediaPlayerBase的PVPlayer實(shí)例。
以上就是對(duì)Android多媒體框架的源代碼的解讀。
-
處理器
+關(guān)注
關(guān)注
68文章
19400瀏覽量
230742 -
控制器
+關(guān)注
關(guān)注
112文章
16442瀏覽量
179018 -
Android
+關(guān)注
關(guān)注
12文章
3941瀏覽量
127729
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論