stagefright與opencore對比

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

2框架變動
以MediaPlayer爲例,我們先看一下多媒體的簡單框架。
 
上圖可知,stagefright是在MediaPlayerService這一層加入的,和opencore是並列的,在選用opencore還是stagefright的代碼切換上也非常容易。
 具體stagefright的內部變動,可見下圖概述。Stagefright並沒有完全拋棄opencore,主要是做了一個OMX層,用來引用opencore的omx-component部分。而stagefright內部而言,與opencore是完全不同的設計。
 

3具體差異
3.1所支持的文件格式

Opencore所支持的格式。
       
Stagefright所支持的格式。


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


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存在。

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。


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

轉:http://blogold.chinaunix.net/u2/61880/showart.php?id=2339481

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章