(Base on Android Q)
主要是為了梳理MediaRecorder模塊代碼,熟悉流程
本文的簡化圖由draw.io繪制,詳細時序圖由plantUml繪制
繪制原材料在百度云盤中 鏈接: https://pan.baidu.com/s/1IJ7Qo2Jl3o6GthPtAiD95Q 提取碼: qu4w
,可以自行down下來修改添加
一.MediaRecorder整體架構
主要簡單梳理數據流向,方便復習記憶
1.1 MediaRecorder簡單錄制視頻框架:
在這里插入圖片描述
簡單過程:
1.Camera應用中至少有兩個Surface,一個使用于preview的,另一個使用來record的,record的surface是PersistentSurface類型,PersistentSurface中的GraphicBufferSource類型的成員變量mBufferSource最終由編碼器創建引用;
2.CameraServer中持有Record Surface的producer引用和Preview Surface的producer引用,因此預覽和錄制CameraServer都充當著生產者的角色;
3.在向CameraProvider發request的時候先dequeueBuffer送至HAL去填充,填充完HAL發回result這時queueBuffer將數據填充至BufferQueue中,由BufferQueue的原理,可知這時候BufferQueue的Consumer將回調onFrameAvailable函數去收到數據準備完成通知,接下來Consumer使用acquireBuffer去消費即可,消費完即releaseBuffer去釋放Buffer;
4.對于preview,消費者就是Surfaceflinger了,合成消費后拿去顯示,對于record,消費者就是編碼器了,舉例OMX一種,編碼器獲取到數據消費用于編碼;
5.編碼器編完碼之后將調用Framework中MediaServer的回調,將編碼后的數據傳遞至MediaRecorder;
6.MediaRecorder在start之后將啟動一個WriteThread,兩個TrackThread(分別是Video和Audio),當TrackThread跟蹤到有相應數據后將video或audio的數據分裝成Chunk數據結構,保存在MPEG4Writer成員變量mChunks中.這時WriteThread發現有數據可寫會將mChunks中的chunk寫到文件中.
1.2 PersistentSurface及GraphicBufferSource實現的BufferQueue框架
1.CameraApp使用的Java層PersistentSurface繼承Java層的Surface,因此它首先是個Surface,其次他一個成員變量指向Native層的 PersistentSurface 實例對象,也指向Natvie層創建的Surface對象;
2.Surface一般用來作為生產者的容器,這里一樣,Java PersistentSurface的 natvie Surface給到CameraServer用于生產數據容器,Producer是CameraServer;
3.Native PersistentSurface的兩個參數mBufferProducer和mBufferSource最終是由編碼器創建,其mBufferProducer指向CameraServer中的Record Surface,mBufferSource作為消費者引用在編碼器內部實現,mBufferSource是GraphicBufferSource類型,在其走在構造函數時會創建BufferQueue;
4.mBufferSource應是指向引用編碼器內部的數據結構或實例,Acodec可以通過GraphicBufferSource類型的成員變量(由PersistentSurface的mBufferSource賦值來)對編碼器進行一些參數設置.
1.3 寫文件的過程及重要類
二.MediaRecorder init,prepare,start,stop簡單過程
上面已經將重要過程過基本講述了完了,下面是簡單地梳理MediaRecorder的代碼過程,文末將附上詳細的代碼跟進過程,簡化圖為了方便記憶主要過程,都基于詳細代碼跟進之后歸納重點的地方.
2.1 MediaRecorder init
詳細過程見附件,其中附上PersistentSurface的創建及設置詳細過程
2.2 MediaRecorder prepare
MediaCodecSource 即對應videoEncoder和audioEncoder的初始化:
prepare的詳細過程見附件.
2.3 MediaRecorder start
MediaRecord Start 與編碼器數據傳遞至recorder的詳細過程見附件