編輯:關於Android編程
前言:前面一篇分析了mediaplayerservice及MediaPlayer中的CS模型,但是對於如何能把數據解析出來,渲染到最終的SurfaceView上顯示,並且播放起來,我們依然還不得而知,從今天開始,就開始介紹多媒體框架中數據解析->解碼->渲染輸出過程,也就是後面幾篇都要介紹的stagefright框架。
先看下今天的Agenda:
Stagefright的整體結構中角色 Stagefright在playback中角色 Stagefright初識 StagefrightPlayer及AwesomePlayer初識 MediaExtractor數據解析流程前面一篇中,分析到mediaplayerservice會調到Stagefright中,進行編碼解碼操作
在libsstagefright中,預設的多媒體解碼是openCore,由於其過於龐大和復雜,需要成本較高,開始引進了另一個框架,也就是stagefright框架,以後默認情況android選擇stagefright,但是並沒有完全拋棄opencore,做了一個OMX層,僅僅是對 opencore的omx-component部分做了引用。stagefright是和opencore是並列的。Stagefright在 Android中是以shared library的形式存在(libstagefright.so),其中的module – AwesomePlayer可用來播放video/audio。 AwesomePlayer提供許多API,可以讓上層的應用程序(Java/JNI)來調用。
先看下源頭,從mediaplayerservice到Stagefright:
接著進入MediaPlayerFactory中的createPlayer方法中:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxpbWcgYWx0PQ=="這裡寫圖片描述" src="/uploadfile/Collfiles/20160912/201609120928171011.png" title="\" />
開始進入StagefrightPlayer的構造函數
StageFrightPlayer中引用了AwesomePlayer,進而進行相關操作,
從上面代碼可以看出,接著分析下StagefrightPlayer,如下代碼:
StagefrightPlayer繼承了MediaPlayerInterface接口,
同樣以setDataSource為例,通常我們負責的模塊或調用別人的模塊時,在模塊和模塊之間,相關於一個黑盒一樣。裡面什麼流程我們並不清楚,call後,返回對應的狀態或數據,僅此而已。
AwesomePlayer,就像是StagefrightPlayer中一個小盒子一樣。
當mediaplayerservice中setDataSource傳下來之後,進入如下方法:
以上代碼總結為:所以執行步驟都會調用 mPlayer->setDataSource(xxxx),而在前面的分析,我們知道,這個mPlayer是被定義成AwesomePlayer,因為文件的setDataSoure及uri方式的setData僅在實現有些區別,接著向下看:
以上代碼總結為:當setDataSource好後,返回上層OK狀態,
再看下文件類型的setDataSource,如下:
以上代碼總結為:匹配不同的文件類型,並用數據解析器處理,Mime表示該資源的媒體類型,當出現以右邊格式出現的時候,就能被播放器識別,如經常手機中文件,單擊時,就會彈出一個用哪個軟件打開一樣。列舉一些常用的Mime類型的資源,如下:
接著,我們看下上面一直在用的MediaExtractor(數據解析器)
以上代碼總結:
根據對文件解析的不同格式創建一個Extractor解析器,並解析,創建好解析器後,回到AwesomePlayer::setDataSource_l()中,繼續執行setDataSource_l(extractor),對新建的這個解析器做處理,其實質是顯示音視頻A/V的分離。 setVideoSource(extractor->getTrack(i));//設置視頻源mVideoTrack ; setAudioSource(extractor->getTrack(i));//設置音頻源mAudioTrack; mVideoTrack和mAudioTrack的做為創建的AwesomePlay的成員函數,其類型為MPEG4Source,繼承了MediaSource。以上過程就進行了A\V的分離,對音頻和視頻資源進行分開處理,其過程是mediaplayerservice->Stagefrightplayer—>Awesomeplayer——>MPEG4Extractor——>MPEG4Source.這幾個過程。StageFright的Parse,Decode過程下節分析。
使用數據庫實現對數據的存儲。 下面上一個小例子,寫日記。 效果如下: 當LIstView中沒有數據顯示時,我們需要告訴用戶沒有數據.
ContentProvider,從字面意義上理解,內容提供者,這個類目的就是一個橋梁的作用,讓一個應用的數據(SQLiteDatabase, SharedPreferen
Prime Land Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2972
小編也曾經遇到過連續幾天都打不開新浪微博的圖片,一開始還以為新浪微博的服務器出問題了!於是問問朋友們有沒這種問題,然而他們都沒出現。於是小編就自己研究了一下