Android系統(tǒng)整體架構(gòu):
我們先看一下多媒體框架在整個Android系統(tǒng)所處的位置
從框架圖可以看出Media Framework處于Libraries這一層迅矛,這層的Library不是用Java實現(xiàn)谴返,一般是C/C++實現(xiàn)矾睦,它們通過Java的JNI方式調(diào)用枪狂。
Android系統(tǒng)的多媒體業(yè)務(wù):
多媒體框架變動:
Android froyo版本多媒體引擎做了變動,新添加了stagefright框架,并且默認情況android選擇stagefright藻茂,棄用之前的opencore,僅僅對opencore中的omx-component部分做了引用。Stagefright自android2.0后才添加辨赐,其穩(wěn)定性有待商榷优俘,是否存在bug也未知,opencore自android誕生起便存在掀序,穩(wěn)定性有保障帆焕。
Opencore上的開發(fā)較stagefright上要復雜耗時些。不過森枪,從目前android代碼看视搏,opencore有被stagefright取代的趨勢,從Android2.3 (Gingerbread) 開始县袱,預設(shè)的多媒體框架為 Stagefright浑娜。
以MediaPlayer為例,我們先看一下多媒體的簡單框架式散。
上圖可知筋遭,stagefright是在MediaPlayerService這一層加入的,和opencore是并列的暴拄,在選用opencore還是stagefright的代碼切換上也非常容易漓滔。
OpenCore框架介紹:
Open Core是Android 多媒體框架的核心,所有Android平臺的音視頻采集乖篷,播放的操作都是通過它來實現(xiàn)响驴。它也被稱為PV(Packet Video), Packet Video是一家專門提供多媒體解決方案的公司。
通過Open Core程序員可以方便快速的開發(fā)出想要的多媒體應(yīng)用程序撕蔼,例如:音視頻的采集豁鲤,回放,視頻會議鲸沮,實時的流媒體播放等等應(yīng)用琳骡。在實際開發(fā)中我們并不會過多的研究Open Core的實現(xiàn),Android提供了上層的Media API給開發(fā)人員使用讼溺,MediaPlayer和MediaRecorder楣号。
CODEC(編解碼器)使用OpenMAX IL interface 接口進行擴展,可以方便得支持hardware / software codec plug-ins怒坯,支持的格式包括:MPEG4炫狱、H.264、MP3剔猿、AAC毕荐、AMR、JPG艳馒、PNG、GIF等。
Open Core的代碼在Android代碼的External/Opencore目錄中弄慰。這個目錄是OpenCore的根目錄第美,其中包含的子目錄如下所示:
· android:這里面是一個上層的庫,它實現(xiàn)了一個為Android使用的音視頻采集陆爽,播放的接口什往,和DRM數(shù)字版權(quán)管理的接口實現(xiàn)。
· baselibs:包含數(shù)據(jù)結(jié)構(gòu)和線程安全等內(nèi)容的底層庫
· codecs_v2:音視頻的編解碼器慌闭,基于OpenMAX實現(xiàn)
· engines:核心部分别威,多媒體引擎的實現(xiàn)
· extern_libs_v2:包含了khronos的OpenMAX的頭文件
· fileformats:文件格式的解析(parser)工具
· nodes:提供一些PVMF的NODE,主要是編解碼和文件解析方面的驴剔。
· oscl:操作系統(tǒng)兼容庫
· pvmi: 輸入輸出控制的抽象接口
· protocols:主要是與網(wǎng)絡(luò)相關(guān)的RTSP省古、RTP、HTTP等協(xié)議的相關(guān)內(nèi)容
· pvcommon:pvcommon庫文件的Android.mk文件丧失,沒有源文件豺妓。
· pvplayer:pvplayer庫文件的Android.mk文件,沒有源文件布讹。
· pvauthor:pvauthor庫文件的Android.mk文件琳拭,沒有源文件。
· tools_v2:編譯工具以及一些可注冊的模塊描验。
StageFright框架介紹:
具體stagefright的內(nèi)部變動白嘁,可見下圖概述。Stagefright并沒有完全拋棄opencore膘流,主要是做了一個OMX層絮缅,用來引用opencore的omx-component部分。而stagefright內(nèi)部而言睡扬,與opencore是完全不同的設(shè)計盟蚣。
Stagefright的內(nèi)部組成模塊
AwesomePlayer的內(nèi)部組成模塊
調(diào)用openMAX IL層時的Video Buffer傳輸流程
Video Rendering內(nèi)部組成模塊
Video Playback流程
VideoEvent事件驅(qū)動
Audio Playback流程
awesomeplayer初始化流程
兩個框架之間的具體差異:
Opencore所支持的格式
Stagefright所支持的格式
Opencore與stagefright兩套機制,對于我們的開發(fā)而言卖怜,主要體現(xiàn)在parser和codec部分屎开。Opencore方面,必須按照其規(guī)范完成相應(yīng)的parser-node马靠,codec則要按照omx規(guī)范實現(xiàn)相應(yīng)的component奄抽。Stagefright方面,則要按照其規(guī)范實現(xiàn)相應(yīng)的extractor和decoder甩鳄。 最基本的實現(xiàn)逞度,二者是相同的,可以共用妙啃,差別在封裝上档泽,opencore難度和工作量要大俊戳。
Opencore處理流程如下圖示
engine分別創(chuàng)建audio/video datapath,parser/dec/sink作為node節(jié)點由各自datapath連接起來馆匿,后續(xù)node節(jié)點由統(tǒng)一調(diào)度器調(diào)度抑胎。
Stagefright處理流程如下圖示。
Audioplayer為AwesomePlayer的成員渐北,audioplayer通過callback來驅(qū)動數(shù)據(jù)的獲取阿逃,awesomeplayer則是通過videoevent來驅(qū)動。二者有個共性赃蛛,就是數(shù)據(jù)的獲取都抽象成mSource->Read()來完成恃锉,且read內(nèi)部把parser和dec綁在一起。
Opencore和stagefright處理機制對比:
(1)Opencore的parser與dec是分離的呕臂,各行其職破托;stagefright則是綁在一起作為一個獨立的原子操作。
(2)Stagefright通過callback和videoevent來驅(qū)動數(shù)據(jù)輸出诵闭;opencore是通過sink-node節(jié)點控制輸出炼团。
(3)Opencore中parser/dec/sink是并行處理的;stagefright中為串行處理疏尿。
Opencore有一個主clock瘟芝,audio/video分別與該主clock同步,作為輸出的判定依據(jù)褥琐,且audio會不斷校準主clock锌俱。
Stagefright部分,audio完全是callback驅(qū)動數(shù)據(jù)流敌呈,video部分在onVideoEvent里會獲取audio的時間戳贸宏,是傳統(tǒng)的AV時間戳做同步。
- Opencore相對成熟穩(wěn)定磕洪,作為框架采用吭练,風險小析显;parser/codec集成相對復雜鲫咽,如果android后續(xù)版本棄用opencore轉(zhuǎn)用stagefright,那多媒體引擎的選擇是個問題谷异。
- Stagefright新推出分尸,肯定有未預知的bug,直接采用有潛在風險歹嘹;parser/codec集成相對容易箩绍,架構(gòu)較opencore做了極大簡化,通俗易懂尺上。
- 目前來看opencore支持的文件格式多些材蛛。
- Opencore與stagefright在數(shù)據(jù)處理機制及AV同步上有很大差異圆到,需要在實際板子上評估性能差異。
- 如果在android froyo版本開發(fā)多媒體相關(guān)產(chǎn)品仰税,建議采用opencore框架构资,這樣舊版本opencore上的成果可以沿用,且節(jié)省項目時間陨簇。
- Opencore支持的文件格式較stagefright豐富。
stagefright框架中調(diào)用OMX的時序圖
Openmax架構(gòu)在Android中位置
Openmax架構(gòu)