Android Media Framework(1): 總綱

Android系統(tǒng)整體架構(gòu):

我們先看一下多媒體框架在整個(gè)Android系統(tǒng)所處的位置


Android多媒體框架opencore和stagefright分析

從框架圖可以看出Media Framework處于Libraries這一層,這層的Library不是用Java實(shí)現(xiàn),一般是C/C++實(shí)現(xiàn),它們通過Java的JNI方式調(diào)用。


Android多媒體框架opencore和stagefright分析

Android系統(tǒng)的多媒體業(yè)務(wù):

Android多媒體框架opencore和stagefright分析

多媒體框架變動(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。


Android多媒體框架opencore和stagefright分析

以MediaPlayer為例,我們先看一下多媒體的簡單框架。


Android多媒體框架opencore和stagefright分析

上圖可知,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等。


Android多媒體框架opencore和stagefright分析

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è)的模塊。


Android多媒體框架opencore和stagefright分析

StageFright框架介紹:
具體stagefright的內(nèi)部變動(dòng),可見下圖概述。Stagefright并沒有完全拋棄opencore,主要是做了一個(gè)OMX層,用來引用opencore的omx-component部分。而stagefright內(nèi)部而言,與opencore是完全不同的設(shè)計(jì)。


Android多媒體框架opencore和stagefright分析

Stagefright的內(nèi)部組成模塊


Android多媒體框架opencore和stagefright分析

AwesomePlayer的內(nèi)部組成模塊
Android多媒體框架opencore和stagefright分析

調(diào)用openMAX IL層時(shí)的Video Buffer傳輸流程
Android多媒體框架opencore和stagefright分析

Video Rendering內(nèi)部組成模塊


Android多媒體框架opencore和stagefright分析

Video Playback流程
Android多媒體框架opencore和stagefright分析

VideoEvent事件驅(qū)動(dòng)
Android多媒體框架opencore和stagefright分析

Audio Playback流程
Android多媒體框架opencore和stagefright分析

awesomeplayer初始化流程
Android多媒體框架opencore和stagefright分析

兩個(gè)框架之間的具體差異:
Opencore所支持的格式


Android多媒體框架opencore和stagefright分析

Stagefright所支持的格式


Android多媒體框架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處理流程如下圖示


Android多媒體框架opencore和stagefright分析

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處理流程如下圖示。


Android多媒體框架opencore和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í)間戳做同步。

  1. Opencore相對(duì)成熟穩(wěn)定,作為框架采用,風(fēng)險(xiǎn)小;parser/codec集成相對(duì)復(fù)雜,如果android后續(xù)版本棄用opencore轉(zhuǎn)用stagefright,那多媒體引擎的選擇是個(gè)問題。
  2. Stagefright新推出,肯定有未預(yù)知的bug,直接采用有潛在風(fēng)險(xiǎn);parser/codec集成相對(duì)容易,架構(gòu)較opencore做了極大簡化,通俗易懂。
  3. 目前來看opencore支持的文件格式多些。
  4. Opencore與stagefright在數(shù)據(jù)處理機(jī)制及AV同步上有很大差異,需要在實(shí)際板子上評(píng)估性能差異。
  5. 如果在android froyo版本開發(fā)多媒體相關(guān)產(chǎn)品,建議采用opencore框架,這樣舊版本opencore上的成果可以沿用,且節(jié)省項(xiàng)目時(shí)間。
  6. Opencore支持的文件格式較stagefright豐富。

stagefright框架中調(diào)用OMX的時(shí)序圖

Android多媒體框架opencore和stagefright分析

Openmax架構(gòu)在Android中位置


Android多媒體框架opencore和stagefright分析

Openmax架構(gòu)


Android多媒體框架opencore和stagefright分析
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,481評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,697評(píng)論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,182評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,406評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,933評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,772評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,973評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評(píng)論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,644評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,953評(píng)論 2 373

推薦閱讀更多精彩內(nèi)容