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