Media FrameWork簡(jiǎn)介

前言

今天,我們正式開(kāi)始Nuplayer的旅途吧。因?yàn)楸静锁B(niǎo)也是因?yàn)楣ぷ髟騽倓偨佑|Android,更是對(duì)多媒體一竅不通。所以,包括前面的準(zhǔn)備篇——《消息通信機(jī)制AXXX》也有可能是漏洞百出的, 等以后功底深厚了再慢慢修改吧。同時(shí), 在這里也感謝各位看官提出寶貴的意見(jiàn)或者建議。

好,接著說(shuō)一下Nuplayer。既然說(shuō)是“旅途”,那我總要給個(gè)旅游路線(xiàn)圖吧。(本文部分圖是copy自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)及時(shí)告知)

1. “總路線(xiàn)圖”

來(lái)看一看Android整體的一個(gè)“地圖”(框架),如圖1所示:

圖1 Android_Framework.png

可以清晰的看到, 大致可以分為5個(gè)部分。在這里簡(jiǎn)單的介紹一下。(摘錄自http://www.cnblogs.com/forlina/archive/2011/06/29/2093332.html

1.1 Linux Kernel

提供核心系統(tǒng)服務(wù),例如:安全、內(nèi)存管理、進(jìn)程管理、網(wǎng)絡(luò)堆棧、驅(qū)動(dòng)模型、進(jìn)程間通信(Binder)。Linux Kernel也作為硬件和軟件之間的抽象層,它隱藏具體硬件細(xì)節(jié)而為上層提供統(tǒng)一的服務(wù)。(android 7.0現(xiàn)在內(nèi)核是4.1.18(某為手機(jī)上看到的))

1.2 Android Runtime

提供大部分在Java編程語(yǔ)言核心類(lèi)庫(kù)中可用的功能。每一個(gè)Android應(yīng)用程序是Dalvik虛擬機(jī)中的實(shí)例,運(yùn)行在他們自己 的進(jìn)程中。
Dalvik虛擬機(jī)依賴(lài)于Linux 內(nèi)核提供基本功能,如線(xiàn)程和底層內(nèi)存管理。

1.3 Libraries

Android包含一個(gè)C/C++庫(kù)的集合,供Android系統(tǒng)的各個(gè)組件使用。這些功能通過(guò)Android的應(yīng)用程序框架(application framework)暴露給開(kāi)發(fā)者。下面列出一些核心庫(kù):

1.3.1 系統(tǒng)C庫(kù)——標(biāo)準(zhǔn)C系統(tǒng)庫(kù)(libc)的BSD衍生,調(diào)整為基于嵌入式Linux設(shè)備
1.3.2 媒體庫(kù)——基于PacketVideo的OpenCORE。這些庫(kù)支持播放和錄制許多流行的音頻和視頻格式,以及靜態(tài)圖像文件,包括MPEG4、 H.264、 MP3、 AAC、 AMR、JPG、 PNG
1.3.3 界面管理——管理訪(fǎng)問(wèn)顯示子系統(tǒng)和無(wú)縫組合多個(gè)應(yīng)用程序的二維和三維圖形層
1.3.4 LibWebCore——新式的Web瀏覽器引擎,驅(qū)動(dòng)Android 瀏覽器和內(nèi)嵌的web視圖
1.3.5 SGL——基本的2D圖形引擎
1.3.6 3D庫(kù)——基于OpenGL ES 1.0 APIs的實(shí)現(xiàn)。庫(kù)使用硬件3D加速或包含高度優(yōu)化的3D軟件光柵
1.3.7 FreeType ——位圖和矢量字體渲染
1.3.8 SQLite ——所有應(yīng)用程序都可以使用的強(qiáng)大而輕量級(jí)的關(guān)系數(shù)據(jù)庫(kù)引擎

1.4 Application Framework

通過(guò)提供開(kāi)放的開(kāi)發(fā)平臺(tái),開(kāi)發(fā)者可以自由地利用設(shè)備硬件優(yōu)勢(shì)、訪(fǎng)問(wèn)位置信息、運(yùn)行后臺(tái)服務(wù)、設(shè)置鬧鐘、向狀態(tài)欄添加通知等等。
應(yīng)用程序的體系結(jié)構(gòu)旨在簡(jiǎn)化組件的重用,任何應(yīng)用程序都能發(fā)布他的功能且任何其他應(yīng)用程序可以使用這些功能(需要服從框架執(zhí)行的安全限制)。
所有的應(yīng)用程序其實(shí)是一組服務(wù)和系統(tǒng),包括:

1.4.1 視圖(View)——豐富的、可擴(kuò)展的視圖集合,可用于構(gòu)建一個(gè)應(yīng)用程序。包括包括列表、網(wǎng)格、文本框、按鈕,甚至是內(nèi)嵌的網(wǎng)頁(yè)瀏覽器
1.4.2 內(nèi)容提供者(Content Providers)——使應(yīng)用程序能訪(fǎng)問(wèn)其他應(yīng)用程序(如通訊錄)的數(shù)據(jù),或共享自己的數(shù)據(jù)
1.4.3 資源管理器(Resource Manager)——提供訪(fǎng)問(wèn)非代碼資源,如本地化字符串、圖形和布局文件
1.4.4 通知管理器(Notification Manager)——使所有的應(yīng)用程序能夠在狀態(tài)欄顯示自定義警告
1.4.5 活動(dòng)管理器(Activity Manager)——管理應(yīng)用程序生命周期,提供通用的導(dǎo)航回退功能

1.5 Applications

Android裝配一個(gè)核心應(yīng)用程序集合,包括電子郵件客戶(hù)端、SMS程序、日歷、地圖、瀏覽器、聯(lián)系人和其他設(shè)置。

1.6 小節(jié)

這里, 給出一位大神總結(jié)好的圖, 畫(huà)的特別好, 小弟就不班門(mén)弄斧, 直接拿過(guò)來(lái)用了。出處:http://www.cnblogs.com/yaowen/p/6413429.html, 如圖2所示:

圖2 android系統(tǒng)結(jié)構(gòu).png

2. Media Framework“路線(xiàn)圖”

從圖1中, 我們可以看到用紅色框框圈起來(lái)的地方。一個(gè)是app應(yīng)用Gallery(也可以為第三方player);另外一個(gè)是Media Framework。對(duì),沒(méi)錯(cuò),講了這么多,我們的主角“Media Framework”登場(chǎng)了。讓我們來(lái)看看它的廬山真面目, 如圖3所示:

圖3 Media_Framework.png

接下來(lái),給大家簡(jiǎn)單介紹下它??吹捻樞蚴恰?↓ ← ↓ →(腫么都覺(jué)得是在打表情符號(hào):-D)

2.1 代理端

這一端做的事情只是將下面復(fù)雜的邏輯進(jìn)行封裝(java),然后透過(guò)jni調(diào)用底下的native層方法來(lái)實(shí)現(xiàn)具體功能。并且,這些個(gè)具體的功能是在服務(wù)端實(shí)現(xiàn)的,他們分屬不同的進(jìn)程,通過(guò)Binder來(lái)通信,最終通過(guò)調(diào)用服務(wù)端的方法實(shí)現(xiàn)具體的邏輯處理。(有童鞋問(wèn):Binder是個(gè)什么東東呢? 小弟有時(shí)間會(huì)講解的,現(xiàn)在就理解它是一個(gè)進(jìn)程間通信的一種方式就好,求甚解的朋友們可以百度下_

2.2 服務(wù)端

這邊的主要任務(wù)就是在MediaPlayerFactory中,創(chuàng)建出NuplayerDriver(這個(gè)不是底層驅(qū)動(dòng)啦,我們理解為一個(gè)抽象出來(lái)的NuPlayer的基類(lèi)就好啦)。
然后Nuplayer中,我們可以看到有三大模塊。

2.2.1 Source

這里是為咱們的播放器提供數(shù)據(jù)源的(解協(xié)議,解封裝在這里)。

2.2.2 Decoder

這里是解碼數(shù)據(jù)的地方(解碼在這里)

2.2.3 Renderer

這里是用來(lái)做Display的,里面涉及到A/V同步的問(wèn)題。

2.2.4 Foundation

這個(gè)部分是基礎(chǔ)類(lèi)。在后面的分析當(dāng)中,我們會(huì)知道在NuPlayer中會(huì)啟動(dòng)相當(dāng)多的線(xiàn)程,這些線(xiàn)程如何異步/同步的通信,需要依靠AMessage/ALooper/AHandler來(lái)支持

之后, 通過(guò)接口類(lèi)IOMX來(lái)通過(guò)Binder進(jìn)程間通信,遠(yuǎn)程調(diào)用具體的decoder來(lái)實(shí)現(xiàn)解碼。

2.3 OMX端

這一端就比較靠近底層了,里面會(huì)有各種各樣的插件注冊(cè)其中。它還鏈接這Codec Driver,這里面就是放的各種具體的解碼器啦。

2.4 Kernel端

最后, OMX的具體解碼器在啟動(dòng)Kernel層的A/V Codec Driver完成解碼操作。

3 后語(yǔ)

大致的框架,我們了解了,我在接下來(lái)的講解中。剛開(kāi)始的時(shí)候,會(huì)先結(jié)合MediaPlayer提供的接口,從java->jni->native一層層講如何啟動(dòng)的Nuplayer的。在大家熟悉了這個(gè)過(guò)程后,就省略掉這一步, 直接“一把刀直插心臟”,專(zhuān)注于NuPlayer這一塊。
最后, 總結(jié)下。在本篇中,我們知道了Media Framework在整個(gè)Android框架中的位置, 也了解了Media Framework自己是個(gè)什么樣框架,以及它和各部分的聯(lián)系。
接下來(lái), 我們將依照?qǐng)D3的順序, 正式開(kāi)始踏上了解Nuplayer的旅途。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容