android mediaplayer 架構

1引言
Android froyo版本多媒體引擎作了變更,新添加了stagefright框架,而且默認狀況android選擇stagefright,棄用以前的opencore,僅僅對opencore中的omx-component部分作了引用。
Stagefright自android2.0後才添加,其穩定性有待商榷,是否存在bug也未知,opencore自android誕生起便存在,穩定性有保障。不過,從目前android代碼看,opencore有被stagefright取代的趨勢,因此在opencore上所做工做也許會沒法沿用。Opencore上的開發較stagefright上要複雜耗時些。html

2框架變更
以MediaPlayer爲例,咱們先看一下多媒體的簡單框架。
 
上圖可知,stagefright是在MediaPlayerService這一層加入的,和opencore是並列的,在選用opencore仍是stagefright的代碼切換上也很是容易。
 具體stagefright的內部變更,可見下圖概述。Stagefright並無徹底拋棄opencore,主要是作了一個OMX層,用來引用opencore的omx-component部分。而stagefright內部而言,與opencore是徹底不一樣的設計。
  node

3具體差別
3.1所支持的文件格式
Opencore所支持的格式。
       
Stagefright所支持的格式。
android


3.2 Parser和codec部分開發有差別
 Opencore與stagefright兩套機制,對於咱們的開發而言,主要體如今parser和codec部分。Opencore方面,必須按照其規範完成相應的parser-node,codec則要按照omx規範實現相應的component。Stagefright方面,則要按照其規範實現相應的extractor和decoder。
 最基本的實現,兩者是相同的,能夠共用,差異在封裝上,opencore難度和工做量要大。api


3.3 數據處理機制不一樣
Opencore處理流程以下圖示。
 
 engine分別建立audio/video datapath,parser/dec/sink做爲node節點由各自datapath鏈接起來,後續node節點由統一調度器調度。
Stagefright處理流程以下圖示。
 
 Audioplayer爲AwesomePlayer的成員,audioplayer經過callback來驅動數據的獲取,awesomeplayer則是經過videoevent來驅動。兩者有個共性,就是數據的獲取都抽象成mSource->Read()來完成,且read內部把parser和dec綁在一塊兒。
 Opencore和stagefright處理機制對比:
 (1)Opencore的parser與dec是分離的,各行其職;stagefright則是綁在一塊兒做爲一個獨立的原子操做。
 (2)Stagefright經過callback和videoevent來驅動數據輸出;opencore是經過sink-node節點控制輸出。
 (3)Opencore中parser/dec/sink是並行處理的;stagefright中爲串行處理。架構

3.4 AV同步
 Opencore有一個主clock,audio/video分別與該主clock同步,做爲輸出的斷定依據,且audio會不斷校準主clock。
 Stagefright部分,audio徹底是callback驅動數據流,video部分在onVideoEvent裏會獲取audio的時間戳,是傳統的AV時間戳作同步。框架

3.5 穩定性
 客觀來說,opencore存在時間長,相對穩定;stagefright剛推出,確定會有未預知的bug存在。ide

4 總結
1.Opencore相對成熟穩定,做爲框架採用,風險小;parser/codec集成相對複雜,若是android後續版本棄用opencore轉用stagefright,那多媒體引擎的選擇是個問題。
2.Stagefright新推出,確定有未預知的bug,直接採用有潛在風險;parser/codec集成相對容易,架構較opencore作了極大簡化,通俗易懂。
3.目前來看opencore支持的文件格式多些。
4.Opencore與stagefright在數據處理機制及AV同步上有很大差別,須要在實際板子上評估性能差別。
5.若是在android froyo版本開發多媒體相關產品,建議採用opencore框架,這樣舊版本opencore上的成果能夠沿用,且節省項目時間。
6.Opencore支持的文件格式較stagefright豐富。
7.若是項目研發中android出現新版本,或stagefright作了更新,仍然維持opencore不變,多媒體引擎變動問題待ipad後再議。一種選擇是一直延續採用opencore,或者在適當時候(認爲stagefright足夠穩定)切換到stagefright。post


Stagefright閱讀筆記附錄
兩套方案對比過程當中,基本上把stagefright的代碼閱讀過一遍,摘錄以下,以圖爲主。
Stagefright總體框圖。
 
Stagefrightplayer裏awesomeplayer初始化流程
 
Awesomeplayer框圖,其中涵蓋主要節點元素。
 
Stagefrightrecorder部分
 
MediaPlayer框圖。
 
MediaRecorder框圖。
 
Libstagefright草圖,涵蓋了主要節點元素。
 性能

相關文章
相關標籤/搜索