MediaRecorder MPEG4Writer
MPEG4Writer是Android? stagefright媒體框架下一個的封裝類,我們平常錄制視頻調用的MediaRecorder接口類其視頻錄制的底層封裝實現就是通過MPEG4Writer完成的。
以視頻為例,MPEG4Writer是視頻錄制的最后一環。
圖1 MediaRecorder調用流程
MPEG4Writer遵守 ISO 14496-12標準進行封裝,MP4、3gp、ismv等我們常見的媒體封裝格式都是以這種基礎文件格式為基礎衍生的。
首先看一下MPEG4Writer封裝好的視頻的格式:
????????
Android系統錄像封裝流程主要有三個步驟:
1)???????錄制開始時,寫入文件頭部。
2)???????錄制進行時,實時寫入音視頻軌跡的數據塊。
3)???????錄制結束時,寫入索引信息并更新頭部參數。
? 索引負責描述音視頻軌跡的特征,會隨著音視頻軌跡的存儲而變化,所以通常做法會將錄像文件索引信息放在音視頻軌跡流后面,在媒體流數據寫完(錄像結束)后才能寫入。可以看到,存放音視頻數據的mdat box是位于第二位的,而負責檢索音視頻的moov box是位于最后的,這與通常的MP4封裝的排列順序不同,當然這是為了符合錄制而產生的結果。因為 moov的大小是隨著 mdat 變化的,而我們錄制視頻的時間預先是不知道的,所以需要先將mdat 數據寫入,最后再寫入moov,完成封裝。?
? 現有Android系統上錄像都是錄制是MP4或3GP格式,底層就是使用MPEG4Writer組合器類來完成的,它將編碼后的音視頻軌跡按照MPEG4規范進行封裝,填入各個參數,就組合成完整的MP4格式文件。MPEG4Writer的組合功能主要由兩種線程完成,一種是負責音視頻數據寫入封裝文件的寫線程(WriterThread),一種是音視頻數據讀取處理的軌跡線程(TrackThread)。軌跡線程一般有兩個:視頻軌跡數據讀取線程和音頻軌跡數據讀取線程,而寫線程只有一個,負責將軌跡線程中打包成Chunk的數據寫入封裝文件。
? 如圖3所示,軌跡線程是以幀為單位獲取數據幀(Sample),并將每幀中的信息及系統環境信息提取匯總存儲在內存的trak表中,其中需要維持的信息有Chunk寫入文件的偏移地址Stco(Chunk Offset)、Sample與Chunk的映射關系Stsc(Sample-to-Chunk)、關鍵幀Stss(Sync Sample)、每一幀的持續時間Stts(Time-to-Sample)等,這些信息是跟每一幀的信息密切相關的,由圖可以看出trak表由各自的線程維護,當錄像結束時trak表會就會寫入封裝文件。而每一幀的數據流會先存入一個鏈表緩存中,當幀的數量達到一定值時,軌跡線程會將這些幀數據打包成塊(Chunk)并通知寫線程寫入到封裝文件。寫線程接到Chunk已準備好的通知后就馬上搜索Chunk鏈表(鏈表個數與軌跡線程個數相關,一般有兩個,音視頻軌跡線程各有一個),將找到的第一個Chunk后便寫入封裝文件,并會將寫入的偏移地址更新到相應的trak表的Stco項(但trak表中其它數據是由軌跡線程更新)。音視頻的Chunk數據是存儲于同一mdat box中,按添加到Chunk鏈表時間先后順序排列。等到錄像結束時,錄像應用會調用MPEG4Writer的stop方法,此時就會將音視頻的trak表分別寫入moov。
圖3 MPEG4Writer封裝數據流圖
總結
以上是生活随笔為你收集整理的MediaRecorder MPEG4Writer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python识别屏幕内容_python之
- 下一篇: QAQ ORZ