Android系統(tǒng)整體架構(gòu):
我們先看一下多媒體框架在整個(gè)Android系統(tǒng)所處的位置
從框架圖可以看出Media Framework處于Libraries這一層,這層的Library不是用Java實(shí)現(xiàn),一般是C/C++實(shí)現(xiàn),它們通過Java的JNI方式調(diào)用。
Android系統(tǒng)的多媒體業(yè)務(wù):
多媒體框架變動(dòng):
Android froyo版本多媒體引擎做了變動(dòng),新添加了stagefright框架,并且默認(rèn)情況android選擇stagefright,棄用之前的opencore,僅僅對(duì)opencore中的omx-component部分做了引用。Stagefright自android2.0后才添加,其穩(wěn)定性有待商榷,是否存在bug也未知,opencore自android誕生起便存在,穩(wěn)定性有保障。
Opencore上的開發(fā)較stagefright上要復(fù)雜耗時(shí)些。不過,從目前android代碼看,opencore有被stagefright取代的趨勢(shì),從Android2.3 (Gingerbread) 開始,預(yù)設(shè)的多媒體框架為 Stagefright。
以MediaPlayer為例,我們先看一下多媒體的簡單框架。
上圖可知,stagefright是在MediaPlayerService這一層加入的,和opencore是并列的,在選用opencore還是stagefright的代碼切換上也非常容易。
OpenCore框架介紹:
Open Core是Android 多媒體框架的核心,所有Android平臺(tái)的音視頻采集,播放的操作都是通過它來實(shí)現(xiàn)。它也被稱為PV(Packet Video), Packet Video是一家專門提供多媒體解決方案的公司。
通過Open Core程序員可以方便快速的開發(fā)出想要的多媒體應(yīng)用程序,例如:音視頻的采集,回放,視頻會(huì)議,實(shí)時(shí)的流媒體播放等等應(yīng)用。在實(shí)際開發(fā)中我們并不會(huì)過多的研究Open Core的實(shí)現(xiàn),Android提供了上層的Media API給開發(fā)人員使用,MediaPlayer和MediaRecorder。
CODEC(編解碼器)使用OpenMAX IL interface 接口進(jìn)行擴(kuò)展,可以方便得支持hardware / software codec plug-ins,支持的格式包括:MPEG4、H.264、MP3、AAC、AMR、JPG、PNG、GIF等。
Open Core的代碼在Android代碼的External/Opencore目錄中。這個(gè)目錄是OpenCore的根目錄,其中包含的子目錄如下所示:
· android:這里面是一個(gè)上層的庫,它實(shí)現(xiàn)了一個(gè)為Android使用的音視頻采集,播放的接口,和DRM數(shù)字版權(quán)管理的接口實(shí)現(xiàn)。
· baselibs:包含數(shù)據(jù)結(jié)構(gòu)和線程安全等內(nèi)容的底層庫
· codecs_v2:音視頻的編解碼器,基于OpenMAX實(shí)現(xiàn)
· engines:核心部分,多媒體引擎的實(shí)現(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:編譯工具以及一些可注冊(cè)的模塊。
StageFright框架介紹:
具體stagefright的內(nèi)部變動(dòng),可見下圖概述。Stagefright并沒有完全拋棄opencore,主要是做了一個(gè)OMX層,用來引用opencore的omx-component部分。而stagefright內(nèi)部而言,與opencore是完全不同的設(shè)計(jì)。
Stagefright的內(nèi)部組成模塊
AwesomePlayer的內(nèi)部組成模塊
調(diào)用openMAX IL層時(shí)的Video Buffer傳輸流程
Video Rendering內(nèi)部組成模塊
Video Playback流程
VideoEvent事件驅(qū)動(dòng)
Audio Playback流程
awesomeplayer初始化流程
兩個(gè)框架之間的具體差異:
Opencore所支持的格式
Stagefright所支持的格式
Opencore與stagefright兩套機(jī)制,對(duì)于我們的開發(fā)而言,主要體現(xiàn)在parser和codec部分。Opencore方面,必須按照其規(guī)范完成相應(yīng)的parser-node,codec則要按照omx規(guī)范實(shí)現(xiàn)相應(yīng)的component。Stagefright方面,則要按照其規(guī)范實(shí)現(xiàn)相應(yīng)的extractor和decoder。 最基本的實(shí)現(xiàn),二者是相同的,可以共用,差別在封裝上,opencore難度和工作量要大。
Opencore處理流程如下圖示
engine分別創(chuàng)建audio/video datapath,parser/dec/sink作為node節(jié)點(diǎn)由各自datapath連接起來,后續(xù)node節(jié)點(diǎn)由統(tǒng)一調(diào)度器調(diào)度。
Stagefright處理流程如下圖示。
Audioplayer為AwesomePlayer的成員,audioplayer通過callback來驅(qū)動(dòng)數(shù)據(jù)的獲取,awesomeplayer則是通過videoevent來驅(qū)動(dòng)。二者有個(gè)共性,就是數(shù)據(jù)的獲取都抽象成mSource->Read()來完成,且read內(nèi)部把parser和dec綁在一起。
Opencore和stagefright處理機(jī)制對(duì)比:
(1)Opencore的parser與dec是分離的,各行其職;stagefright則是綁在一起作為一個(gè)獨(dú)立的原子操作。
(2)Stagefright通過callback和videoevent來驅(qū)動(dòng)數(shù)據(jù)輸出;opencore是通過sink-node節(jié)點(diǎn)控制輸出。
(3)Opencore中parser/dec/sink是并行處理的;stagefright中為串行處理。
Opencore有一個(gè)主clock,audio/video分別與該主clock同步,作為輸出的判定依據(jù),且audio會(huì)不斷校準(zhǔn)主clock。
Stagefright部分,audio完全是callback驅(qū)動(dòng)數(shù)據(jù)流,video部分在onVideoEvent里會(huì)獲取audio的時(shí)間戳,是傳統(tǒng)的AV時(shí)間戳做同步。
- Opencore相對(duì)成熟穩(wěn)定,作為框架采用,風(fēng)險(xiǎn)小;parser/codec集成相對(duì)復(fù)雜,如果android后續(xù)版本棄用opencore轉(zhuǎn)用stagefright,那多媒體引擎的選擇是個(gè)問題。
- Stagefright新推出,肯定有未預(yù)知的bug,直接采用有潛在風(fēng)險(xiǎn);parser/codec集成相對(duì)容易,架構(gòu)較opencore做了極大簡化,通俗易懂。
- 目前來看opencore支持的文件格式多些。
- Opencore與stagefright在數(shù)據(jù)處理機(jī)制及AV同步上有很大差異,需要在實(shí)際板子上評(píng)估性能差異。
- 如果在android froyo版本開發(fā)多媒體相關(guān)產(chǎn)品,建議采用opencore框架,這樣舊版本opencore上的成果可以沿用,且節(jié)省項(xiàng)目時(shí)間。
- Opencore支持的文件格式較stagefright豐富。
stagefright框架中調(diào)用OMX的時(shí)序圖
Openmax架構(gòu)在Android中位置
Openmax架構(gòu)