Android MediaPlayer+Stagefright框架(音訊)圖解
在android原生的媒體播放器中是由mediaplayerservice來控制媒體播放器的,在mediaplayerservice中建立了mediaplayer,在mediaplayer.java的native方法通過jni呼叫android_media_mediaplayer.cpp中的方法,接著往下呼叫mediaplayer.cpp中的方法,mediaplayer通過ipc機制呼叫mediaplayerService中的方法,mediaplayerService通過對檔案格式的判斷來選擇不同的播放器來播放音樂,當是midi格式時會選擇sonivox來播放,當系統的配置檔案中允許ogg格式由vorbris來播放時則用vorbris,否則用stagefright來播放。其餘的格式由配置檔案選擇是否由stagefright來播放,是則由stagefright播放,不是則由opencore的pvplayer來播放。
stagefright由awesongplayer來控制,他會呼叫setDatasource()方法來載入音訊檔案,根據音訊檔案的頭欄位不同來選擇不同的解析器,這個解析器會進行av分離分離出audioTrack和videoTrack,接著會根據audioTrack的mineType型別來選擇不同的編碼器來進行編碼,這個是由audioSource來進行解碼,audioSource是對omxCodec的封裝,而audioPlayer則是用來控制audioSource和audioTrack的。audioplayer呼叫fillBuffer()方法將解完碼的資料寫進data中最終將解完碼的資料流最後會傳給AudioTrack,由audioTrack來交給audioFlinger,audioTrack通過呼叫creataudioTrack()來得到audioFlinger返回的iaudioTrack,將資料流寫進iaudioTrack的共享buffer中,然後audioFlinger讀出快取中的資料交給playbackTread進行混音或者直接輸出給快取並最終將資料給audioOutputStream。