我們學習一種新事物必然首先都要對該事物要有個大體的瞭解,熟悉它的整體架構,然後進行劃分歸類,接下來才是各個擊破,逐步學習乃至掌握。對於要學習android Multimedia的人來說也是如此,先來個總括吧 !我打算分三部分來講解,請聽我娓娓道來....
一:多媒體簡介
為啥要講多媒體的概念呢?可能很多人都對這個名稱解釋不怎麼瞭解,所以在這普及普及。
媒體(Media)就是人與人之間實現資訊交流的中介,簡單地說,就是資訊的載體,也稱為媒介。多媒體是電腦和視頻技術的結合,實際上它是兩個媒體;聲音和映像,或者用現在的術語:音響和電視。多媒體本身有兩個方面,和所有現代技術一樣它是由硬體和軟體,或機器和思想混合組成。可以將多媒體技術和功能在概念上區分為控制系統和資訊。多媒體之所以能夠實現是依靠數字技術。多媒體代表數字控制和數位媒體的匯合,電腦是數字控制系統,而數位媒體是當今音頻和視頻最先進的儲存和傳播形式。事實上有人就簡單地認為多媒體是電腦和電視的結合。電腦的能力達到即時處理電視和聲音資料流的水平,這時多媒體就誕生了。
二:android多媒體架構演變曆史
android 的多媒體架構從android誕生以來,發生了天翻地覆的變化,包括引擎的更改,單獨處理流媒體的播放器nuplayer的加入,到最新jellybean(android4.1)nuplayer逐步加入stagefrightplayer的功能,可能以後stagefight引擎會被nuplayer取代,那都是後話了。但是openomx(即引擎串連codec的紐帶)一直都得到了保持。
在Froyo2.2 以前,multimedia framework 的引擎是一直都是opencore,但為啥用stagefright替代呢,由於我沒有開發過opencore,不便下結論,但從網上一些言論來看,估計是opencore太過龐大,不太好維護,具體真正原因就得問google了,如果你知道具體原因,可以給我留言,在此多謝了!
Gingerbread android2.3,加入了真正的支援流媒體的播發器nuplayer,如果你下有源碼,可以用gitk \nuplayer,從gitk可以看到如下提交:Initial support for a true streaming player for mpeg2 transport streams. 2010.12。
android 3.0 到android 4.0 ,總體架構沒有多大變化。
android4.1 (jellybean) 最大的變化是給c/c++部分的多媒體架構單獨設立了一個framework/av的目錄,給它開闢了一個git庫,即從framework/base下的git庫分離了出來,總算給多媒體找了個港灣。
三:jellybean多媒體架構
multimedia framework 架構 由三大部分構成:供上層程式調用的java API,串連java和C/C++的jni部分,多媒體引擎(stagefright)和codec介面(openmax interface)。前面兩部代碼在framework/base/media 下,後一部分在framework/av檔案夾下。如果你修改的是java API介面或加LOG後編譯可以用如下命令:make framework ,JNI 部分 make media_jni,第三部分有三個libs組成:libmedia ,libmediaplayerservice, libstagefright,命令如下 make media ,make stagefright , make mediaplayerservice. 產生各自的.so檔案,用adb push 到system/下就可以調試了。記得重啟!講了好多廢話,還是沒有看到總體架構,罪
我們可以發現上層APK要播放視頻,首先得獲得一個player,而這個player的類型根據你媒體檔案的類型來決定的,分配的任務由mediaplayerservice來完成,除了獲得player外最主要的是到底選用哪種編碼器進行編解碼,這個過程由awesomeplayer和omxcodec來完成,至於聲音和映像就交由audioflinger和surfaceflinger來完成了。具體的調用實現,下一篇videoplayerback將會慢慢討論和學習。