[Android][MediaRecorder] Android MediaRecorder框架簡潔梳理

(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的詳細過程見附件

2.4 MediaRecorder stop

在這裏插入圖片描述

三.MediaRecorder 代碼詳細跟進

3.1 MediaRecorder init flow

在這裏插入圖片描述

3.2 PersistentSurface init and setInputSurface flow

在這裏插入圖片描述

3.3 PersistentSurface prepare flow

在這裏插入圖片描述

3.4 MediaRecorder start flow

在這裏插入圖片描述

3.5 MediaRecorder Buffer Callback from OMX to MediaRecorder

在這裏插入圖片描述

3.6 MediaRecorder stop flow

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章