| 一、Android多媒體框架歷史回顧Android 1.0 ->Packet video - Open coreAndroid 1.6 ->Open core 2.0Android 2.0 ->StageFrightAndroid 2.1 ->StageFrightAndroid 3.0 ->增強(qiáng)版StageFrightAndroid 4.1 ->支持編解碼功能Android 5.0->增加MediaSession 和MediaController功能
 二、多媒體架構(gòu)圖在AOSP中,多媒體相關(guān)代碼主要在av/media和base/media兩個(gè)目錄。其中base/media中重點(diǎn)在其jni目錄,這里面就是libmedia_jni.so的代碼,也就是Java層多媒體API對(duì)應(yīng)的JNI模塊。av/media中包含了Android多媒體服務(wù)的具體實(shí)現(xiàn),包含了MediaPlayerService、Stagefright引擎等。 Java層API通過(guò)JNI調(diào)用Native層(libmedia_jni.so),Native層通過(guò)Binder IPC調(diào)用到相關(guān)Service進(jìn)程,獲取相關(guān)服務(wù),而Service進(jìn)程通過(guò)Open MAX調(diào)用硬件層實(shí)現(xiàn) 下面這張圖是AOSP官網(wǎng)中展示的多媒體架構(gòu)圖
  三、java 和jni1、java層APIbase/media/java目錄中包含了全部的多媒體模塊API,包含了我們熟悉的MediaPlayer、MediaRecorder、MediaCodec等。這些API在import的時(shí)候,都會(huì)開(kāi)始加載libmedia_jni.so,并注冊(cè)native方法映射。 2、Native層 jni在base/media/jni/android_media_MediaPlayer.cpp中定義了libmedia_jni.so的JNI_OnLoad方法,在方法中注冊(cè)了整個(gè)多媒體API需要的native方法映射。 在Native層一般會(huì)創(chuàng)建一個(gè)與Java層同名的對(duì)象來(lái)一一對(duì)應(yīng),兩個(gè)對(duì)象互相持有引用,借助JNI來(lái)交互。在Native的實(shí)現(xiàn)中,會(huì)通過(guò)Binder
 
IPC向指定的Service進(jìn)程獲取到一個(gè)Client,通過(guò)Client向服務(wù)進(jìn)程請(qǐng)求分配一個(gè)實(shí)現(xiàn)的實(shí)例,然后應(yīng)用進(jìn)程使用該實(shí)例完成對(duì)應(yīng)的功能。 四、服務(wù)層進(jìn)程上面提到的MediaPlayerService、Stagefright引擎等都是運(yùn)行在獨(dú)立的進(jìn)程上,應(yīng)用進(jìn)程通過(guò)Binder IPC來(lái)與服務(wù)進(jìn)程進(jìn)行交互,Bilder IPC代碼位于av/media/libmedia目錄中。 在7.0時(shí),為了安全考慮,將整個(gè)多媒體服務(wù)進(jìn)程拆分成多個(gè)進(jìn)程,每個(gè)功能都擁有獨(dú)立的進(jìn)程。
  五、硬件集成層OpenMaxOpenMax全稱是Open Media Acceleration,是一個(gè)免費(fèi)的多媒體API標(biāo)準(zhǔn),提供了音頻視頻等常用處理操作的接口,是對(duì)硬件功能的抽象,減少了應(yīng)用層適配硬件的復(fù)雜度。對(duì)于應(yīng)用層來(lái)說(shuō),只需要調(diào)用OpenMAX對(duì)應(yīng)功能的API即可,具體SOC芯片上的實(shí)現(xiàn)無(wú)需關(guān)心。
 |