最近一個月在做android5.1的多媒體調試工作,根據自己跟源代碼的理解和結合網上的一些資料做一些總結。
一、android多媒體結構圖(上下文關係)
從文件角度看多媒體架構:從最上層到底層調用關係依次是apk、jar、.so。
apk就是圖庫,jar包是javaAPI,.so是C++代碼。
二、android多媒體代碼目錄結構
android5.1媒體的相關代碼都放到framework/av/的目錄中,
其中視頻相關的代碼在media/下
|----- media
| |
| |-- libmedia //一個服務端的代理,對應用層提供相關的接口,和服務端交互
| |
| |-- libmediaplayerservice //服務段 (分發器,交換機的作用,個人理解)
| |
| |-- libstagefright //一個服務端的分支,支持工作(分流,解碼,傳輸)
| |
| |-- mediaserver //android多媒體後臺核心服務進程
| |
| |-- mtp //文件夾操作媒體的相關東西
| |
進一步看libstagefright目錄
|-- stagefright
| |
| |-- codecs //提供解碼器實現
| |
| |-- colorconversion //顏色空間轉換
| |
| |-- foundation //基本數據結構的實現
| |
| |-- httplive //m3u8解析
| |
| |-- id3 // ID3 TAG解析(一般用於MP3格式的metadata容器)
| |
| |-- include //基本頭文件
| |
| |-- matroska //matroska文件解析
| |
| |-- mpeg2ts //mpeg2ts文件解析和數據獲取一些處理
| |
| |-- mp4 //MP4的格式解析
| |
| |-- omx //IOMX接口實現
| |
| |-- rtsp //rtsp文件解析
| |
| |-- wifi-display //關於wifi的處理
| |
| |-- yuv //YUV數據的處理
| |
| |-- AwesomePlayer //android核心播放器代碼實現文件
| |
三、發展歷史
因爲現在android設備廠商都是用的自己的VPU硬件設備去解碼(不用自帶的軟解,效率太低),所以對應 有hal層的實現,其實hal只是修改了libstagefright目錄中的omx和component目錄的相關代碼,增加了自己的解碼器組件。再單獨新建了hal層目錄。總體還是遵循stagefright框架的。
接下來聊一下android多媒體框架的發展史:
android2.3以前多媒體框架用的是opencore,現在改成了stagefright框架,其中兩種框架都使用了openmax標準接口(簡稱omx),openmax是NVIDIA和KHRONOS公司推出的多媒體應用程序標準,共分三層:應用層、集成層、開發層。其中集成層用於引擎插件(解碼器)。前面提到的compoment目錄就是包含組件。
四、從進程線程角度看架構
結合圖一,多媒體視頻播放涉及到的進程主要有gallery、mediaserver、servicemanager、surfaceflinger。
其中mediaserver進程是整個多媒體的核心,裏面包含多個線程運行(有audioflinger、mediaplayerservice、cameraservice、audiopolicyservice)。當然也涉及到進程間通信的binder問題。
後續會講解細節