1. 程式人生 > >Android Multimedia框架總結(八)Stagefright框架之AwesomePlayer及資料解析器

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

前言:前面一篇分析了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方法中:

這裡寫圖片描述

這裡寫圖片描述

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過程下節分析。

第一時間獲得部落格更新提醒,以及更多android乾貨,原始碼分析,歡迎關注我的微信公眾號,掃一掃下方二維碼或者長按識別二維碼,即可關注。

這裡寫圖片描述

如果你覺得好,隨手點贊,也是對筆者的肯定,也可以分享此公眾號給你更多的人,原創不易