Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Multimedia框架總結(八)Stagefright框架之AwesomePlayer及數據解析器

Android Multimedia框架總結(八)Stagefright框架之AwesomePlayer及數據解析器

編輯:關於Android編程

前言:前面一篇分析了mediaplayerservice及MediaPlayer中的CS模型,但是對於如何能把數據解析出來,渲染到最終的SurfaceView上顯示,並且播放起來,我們依然還不得而知,從今天開始,就開始介紹多媒體框架中數據解析->解碼->渲染輸出過程,也就是後面幾篇都要介紹的stagefright框架。

先看下今天的Agenda:

Stagefright的整體結構中角色 Stagefright在playback中角色 Stagefright初識 StagefrightPlayer及AwesomePlayer初識 MediaExtractor數據解析流程

Stagefright的整體結構中角色

這裡寫圖片描述

Stagefright在playback中角色

這裡寫圖片描述

Stagefright初識

前面一篇中,分析到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及AwesomePlayer初識

開始進入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數據解析流程

接著,我們看下上面一直在用的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過程下節分析。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved